STM32驱动舵机:
舵机接线图:将PWM脚接在开发板PA1处;
新建舵机模块:
分析舵机的PWM信号:在一个周期20ms的脉冲信号上,高电平占空比为0.5ms-2.5ms分别对应着0°-180°。
计算PWM的参数信息:
PSC为72,ARR为20K,这样就得到一个频率周期为50Hz的信号。
其中20KHz等于20ms,将CCR设置为500即=0.5ms的占空比。
将CCR设置为2500既可以得到一个2.5ms的占空比PWM信号。
编写舵机模块代码:
#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引脚;
新建直流电机模块:
编写电机模块代码,首先初始化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控制直流电机正反转相关内容。