stm32型号:stm32f103c8t6 最小系统板,需要自己加上按键
舵机型号:DS3230(30KG)-270°
首先回答问题:舵机脉冲宽度和资料的角度对应不上的问题,可能是定时器的时钟源频率不对,看看这里时钟树有没有配对
接下来是具体配置
目标是通过PB11上的按键,按下一次改变一次舵机角度(舵机角度自己定义),以下分为两部分:一是GPIO配置,二是TIM配置
GPIO配置
1+2.直接到图形界面:单击PB11,设置为引脚输入模式(因为要检测电平)
3.双击配置
4.设置为引脚输入
5.让引脚初始状态为高电平(等下按键一端接PB11,一端接GND,一旦按下,PB11的高电平变成低电平,即检测到按键按下)
6.PB11的名字标签为 key
TIM配置
1.首先配置RCC
2.配置为外部时钟输入,外部晶振
SYS配置如上
1.TIM这里配置TIM3
2.定时器开启内部时钟
3.设置为PWM模式,通道一
接下来是计算pwm频率
选择时钟频率为 CK_PSC = 72MHz(这个很重要),由于舵机一般是50Hz控制频率,一个周期是20ms,所以Freq = 50Hz , PSC = 71 , 推得ARR = 19999
再由下图(270°舵机对应脉冲宽度表)
可知,CCR应该是在500 - 2500 区间范围内,回到cubemx配置
1.这里PSC为71
2.向上计数
3.ARR为19999
PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,否则为有效电平。
PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
我们这里所说的有效和无效取决于我们需要的电平极性,看下舵机的控制图
在一个周期内只需要一点点高电平,所以选择pwm模式2 , 并把有效电平设置为低电平
解释如下
接下来是配置
1.pwm模式2
2.有效电平为低电平,CH polarity 意为频道有效电平
3.这个是占空比,这里可以给个初始值,也可以不给,程序里面再定义设置
这里配置ok了,接下来看看时钟源的配置
设置好各个分频,确保最后定时器的时钟源配置是72MHz
整好剩下的配置,就可以生成代码了,接下来是
代码部分
初始定义
HAL_TIM_PWM_Start (&htim3 ,TIM_CHANNEL_1 );
一些必要的函数(hal库给定的)
按键检测部分
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,pwmval);
1. 按下后各部分操作
2.该函数用于改变占空比,以使舵机改变角度值
接线:PB11接按键,PA6接舵机信号线(由cubemx获得,他会自动配置对应定时器的复用引脚)
最终现象是,按下按键(PB11位置的)一次,舵机改变一次角度