STM32驱动舵机:

舵机接线图:将PWM脚接在开发板PA1处;

STM32学习笔记_PWM驱动舵机和直流电机(4)_舵机

新建舵机模块:

STM32学习笔记_PWM驱动舵机和直流电机(4)_STM32学习笔记_02


分析舵机的PWM信号:在一个周期20ms的脉冲信号上,高电平占空比为0.5ms-2.5ms分别对应着0°-180°。

STM32学习笔记_PWM驱动舵机和直流电机(4)_直流电机_03

计算PWM的参数信息:

PSC为72,ARR为20K,这样就得到一个频率周期为50Hz的信号。

其中20KHz等于20ms,将CCR设置为500即=0.5ms的占空比。

将CCR设置为2500既可以得到一个2.5ms的占空比PWM信号。

STM32学习笔记_PWM驱动舵机和直流电机(4)_直流电机_04

编写舵机模块代码:

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

//函    数:舵机初始化
void Servo_Init(void)
{
	PWM_Init();
}

//函    数:舵机设置角度
void Servo_SetAngle(uint8_t Angle)
{	
	PWM_SetCompare2((Angle / 180) * 2000 + 500);
}


编写主函数代码,通过按键的形式,毎按下一次按键舵机角度Angle自增30:

#include "stm32f10x.h"    //添加头文件
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "Timer.h"
#include "OLED.h"
#include "PWM.h"
#include "Servo.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();	//OLED初始化
	Servo_Init();
	KEY_Init();
	
	OLED_ShowString(1, 1, "Angle:");		//OLED显示字符
	
	while(1)
	{	
		uint8_t Angle;					//定义角度变量
		uint8_t KeyNum;					//定义用于接收键码的变量
		KeyNum = Key_GetNum();			//获取按键键码
		if(KeyNum == 1)					//按键1按下
		{
			Angle+=30;					//角度变量自增30
		}
		if(Angle > 180)
		{
			Angle = 0;					//角度变量归零
		}
		Servo_SetAngle(Angle);			//设置舵机的角度为角度变量
		OLED_ShowNum(2, 1, Angle, 3);	//OLED显示角度变量
	}
}


STM32驱动直流电机:

直流电机接线图,电机使用了TB6612驱动板的驱动方式,其中AIN1/AIN2是电机的控制脚分别接开发板的PA4/PA5,用来控制电机的正反转和刹车,PWM信号接在开发板的PA2引脚;

STM32学习笔记_PWM驱动舵机和直流电机(4)_STM32学习笔记_05

新建直流电机模块:

STM32学习笔记_PWM驱动舵机和直流电机(4)_直流电机_06


编写电机模块代码,首先初始化PWM和GPIO引脚,然后编写设置电机速度的函数:

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

//函    数:直流电机初始化
void Motor_Init(void)
{
	//PWM初始化
	PWM_Init();
	
	/*开启直流电机控制脚GPIO的时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//函    数:直流电机设置速度
void Motor_SetSpeed(int8_t Speed)
{
	if(Speed < 0)		//正转
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_4);		//PA4置高电平
		GPIO_ResetBits(GPIOA, GPIO_Pin_5);		//PA5置低电平
		PWM_SetCompare3(-Speed);				//PWM设置为速度值
	}
	if(Speed >= 0)		//反转
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_5);
		GPIO_ResetBits(GPIOA, GPIO_Pin_4);
		PWM_SetCompare3(Speed);
	}
}

在主函数中通过按键增量或减量控制电机的速度:

#include "stm32f10x.h"    //添加头文件
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "Timer.h"
#include "OLED.h"
#include "PWM.h"
#include "Motor.h"

uint8_t KeyNum;		//接受按键返回值
int8_t Speed;		//定义速度变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();	//OLED初始化
	Motor_Init();
	KEY_Init();
	
	OLED_ShowString(1, 1, "Motor:");		//OLED显示字符
	
	while(1)
	{	
		KeyNum = Key_GetNum();
		if(KeyNum == 1)
		{
			Speed+=20;
			if(Speed > 100)
			{
				Speed = -100;
			}
		}
		Motor_SetSpeed(Speed);
		OLED_ShowSignedNum(2, 1, Speed, 3);
	}
}

以上就是STM32控制直流电机正反转相关内容。