上一次使用舵机只是草草了解,只大概知道是pwm控制的,这次又使用到了舵机,本以为复制上次代码就可以调试成功,没想到却弄了很久。
我使用的是STM32f103c8t6,用的是定时器4。这个f1板子的定时器各个通道io口如下图所示:
在开始之前我们要了解控制舵机需要的一个周期是多少秒,是20ms(毫秒),这就意味着,我们配置输出的一个周期必须是20ms,这就需要我们经过分频和重装载值来决定。
当初我在这里卡了很久,因为不会计算这个,上网看了很多文章,大家讲的不是很明白,所以我今天详细和大家说说如何分频和写重装载值
首先,我的板子主频是72Mhz,这就意味这一秒种可以计72Mhz的数,可定时器只有16位呀,他的最大值也只是65535,而72M就是72 000k就是72 000 000个数,所以我们必须分频!
那该分多少呢,你想分多少分多少,只要你最后重装载值能圆回来就好。为了好计算这里我分72,就相当于72M主频除72
72M除72=1M /s //经过72分频后就是1秒计1M个数
1M=1 000k=1000 000/s //而1M又等于1 000 000个数,所以1s能计1000 000个数
1s=1 000ms=1000 000us //而1s又等于1000 000us
所以1us=1;
所以经过分频以后我们计一个数的时间就是1us,是吧。
那我们既然已经知道计一个数的时间,也知道我们需要20ms,那我们要计多少个数才有20ms呢,而这个数就是我们要填的重装载值。
既然1us=1
所以20ms=20000us=20000
所以我们要计20000个数才正好是20ms,所以经过72分频下的重装载值要填20000;
这时候我们看资料上是这样写的:
t = 0.5ms——————-舵机会转到 0 °
t = 1.0ms——————-舵机会转到 45°
t = 1.5ms——————-舵机会转到 90°
t = 2.0ms——————-舵机会转到 135°
t = 2.5ms——————-舵机会转到 180°
意思就是在这个20ms的一个周期内,如果有0.5ms是高电平其他都是低电平,那舵机就能转到0度,其他的以此类推。
那我们要计多少个数才是0.5ms呢,答案是500个数。
因为1us=1
所以0.5ms=500us=500
我看很多文章他们喜欢分7200频,都可以的的,大家可以计算一下。
接着我们在循环里面这样写就能运转0度到180度
但是但是但是,你怎么知道这计500个数的时间就是高电平的时间呢,怎么就不能是低电平的时间呢,所以要自己设置的,相关的有两个参数,就是下图我框起来的两个参数。
首先就是第一条,pwm输出模式是有两个的,一个pwm1,一个pwm2
按我的理解来说,pwm1的意思就是先输出有效电平再输出无效电平。而pwm2就是反过来,先输出无效电平再输出有效电平。
而这个有效电平就是你自己来决定的,也就是第二条来决定的,我写的就是有效电平为高电平,当然也可以写有效电平为低电平。
所以我配置pwm1模式,有效电平又为高电平就意味这,当我使用这个函数
TIM_SetCompare3(TIM4,500); //0度
他的意思是,输出计500个数的时间的有效电平高电平,剩余的为低电平。
如果你写的是pwm2模式,那意思就是,输出计500个数的时间的低电平,剩余的为有效电平高电平。
当初,不明白这两个参数的含义,也是卡了一阵子。文章来源:https://www.toymoban.com/news/detail-479532.html
第一次写文章,同时也是初学者,如果文章当中有什么措辞不对,或者错误的地方,欢迎在评论区指出。文章来源地址https://www.toymoban.com/news/detail-479532.html
到了这里,关于STM32+SG90舵机详解(详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!