目录
概述
舵机g90系列,这些都是同样的控制方法
舵机一般是指只能转动180°的
本程序兼容180°和360°舵机
调用不同的函数即可
舵机是5V供电,使用3V3单片机使需要使用开漏外接上拉电阻输出5V电平
波形
180°和360°舵机均为周期是20ms的PWM波
180°
将舵机转到最边上(触发到限位装置),此时将最前方当作参考方向
下图的箭头为参考方向
图中的圆为舵机可以转过的区域
将目前下图中的运动状态设为0°
此图是俯视图,也就是将电机轴对向自己,也就是第二个图的指示方向
-90°
-45°
0°
45°
90°
所以说可以看出角度从-90°到90°变化时pwm的高电平宽度在0.5ms-2.5ms内成线性变化
高电平时间为 t 单位ms
角度制角度为
单位°
对应关系为
360°
同样是20ms的PWM波
高电平时间0-0.5ms控制电机正转(电机轴朝向自己顺时针)
在范围内时间越短转速越快
高电平时间1.5-2.5ms控制电机正转(电机轴朝向自己 逆时针)
在范围内时间越长转速越快
当 高电平时间为1.5ms时电机静止
代码
pwm产生
通过定时器中断,通过计数模拟产生PWM波
需要1个GPIO(开漏浮空输出,外接5V上拉电阻)
注意:GPIO建议选择最高等级,避免出现问题
定时器中断20us触发一次
函数
控制变量
uint16_t Steering_Engine_Count = 0;
uint16_t Steering_Engine_Num = 0;
在定时器中断调用
//定时器中断调用
void Steering_Engine_Action(void)
{
Steering_Engine_Count++;
if (Steering_Engine_Count < Steering_Engine_Num)
HAL_GPIO_WritePin(Steering_Engine_GPIOx, Steering_Engine_GPIO_Pin, GPIO_PIN_SET);
else
HAL_GPIO_WritePin(Steering_Engine_GPIOx, Steering_Engine_GPIO_Pin, GPIO_PIN_RESET);
if (Steering_Engine_Count >= 1000)
Steering_Engine_Count = 0;
}
360舵机
// R_L为0正转,1逆转 Speed取值范围0-50 越大越快
void Steering_Engine_360(uint8_t R_L, uint8_t Speed)
{
if (Speed >= 50)
Speed = 49;
if (R_L == 0)
{
Steering_Engine_Num = 75 - Speed;
}
else if (R_L == 1)
{
Steering_Engine_Num = 77 + Speed;
}
}
180舵机
//输入旋转到的角度,以舵机轴可以面向自己的面为0°,面向左为-90°
void Steering_Engine_180(uint8_t Angle)
{
if (Angle >= 180)
Angle = 180;
Steering_Engine_Num = 25 + ((float)Angle / 180 * 100);
}
舵机停止
void Steering_Engine_Stop(void)
{
Steering_Engine_Count = 0;
Steering_Engine_Num = 0;
}
成品
GitHubhttps://github.com/HZ1213825/HAL_STM32F4_Steering_Engine