明确操控舵机需要用到什么:高级定时器(有死区和刹车功能),可以用TIM1和TIM8,但是有时候为了检测函数执行会用到串口,所以我建议用TIM8
在cubeMX里配置时 有配置CH1 CH2等一下写代码时可以用其来定义舵机转180°和270°的PWM输出函数
配置分频因子和重载值(上图标红处)
分频因子配置144的原因:用于配置定时器频率f=72M/144=0.5M
计数一次的周期为T=1/0.5M=0.002ms
计数10000次 总周期时间为0.002×10000=20ms
又因为2.5ms——转180° 又0.5ms——转0°
所以2ms可以转180° 2ms/0.002ms=1000次 即1000次计数可以转180°
转一度的次数为1000/180 转x度需要250+x(1000/180)次
自己可以去定义一个舵机转动函数 形参为angle 函数里可以设置形参为
angle = 250+angle*(1000/180);
然后用 __HAL_TIM_SetCompare()这个函数传入angle去设置对应通道输出的PWM值
可以定义在while函数里一个递增的变量i作为形参angle去不断地改变舵机角度
如果要配置死区刹车功能 有两种方法
第一种 根据数据手册找到TIMx_BKIN在cubeMX上去配置其GPIO——如TIM8的BKIN为PA6
由图可知 刹车输入高电平有效 所以一开始要置低(在cubeMX里配置)
所以刹车时 可以往对应的GPIO 里写入高电平
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6, GPIO_PIN_RESET);
之后配置
这个配置之后才可以在刹车之后自动运行 不用去操控寄存器把对应寄存器恢复
第二种是一开始不配置Automatic Output Statue
在刹车后 将寄存器BDTR里的MOE置一
并将TIMx_BKIN对应的GPIO置低
之后就可以自由刹车或发动了
我们可以让key按键去控制刹车(我用的按键一开始配置的是上拉 如果检测到其为低电平 则进入刹车函数)
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8)==0) //检测按键是否为低电平
{
//如果按键按下
//在PA6 写入高电平刹车
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6, GPIO_PIN_SET);
}
else{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6, GPIO_PIN_RESET);
}