亿加合和智能车制作

标题: 关于智能车舵机控制周期问题 [打印本页]

作者: hdongdong123    时间: 2016-10-14 20:43
标题: 关于智能车舵机控制周期问题
首先要声明下面的结论都是我和学长的猜想,也没有查看STM32的技术手册,另外我们也是猜想K60的情况和STM32F407的情况相同。如果大家有自己的见解的话那就尽情讨论吧!!

先问个问题吧:我们都知道一般舵机标准控制周期是20ms,但是大多数时候可能程序的控制周期远远小于20ms。换句话说可能在这20ms内给了舵机不同的值!那这时候舵机能反应过来么?
先来说说结论吧!
1,对于STM32F407芯片来说,在一个PWM周期没有结束之前是不会产生另外一个占空比不同的PWM信号的。
2,对于STMF407定时器的PWM模式来说,有一个预装载寄存器,这个预装载寄存器的值是可以被刷新。
3,对于PWM周期还没有结束,但是程序中又对PWM的占空比进行修改的情况来说。(简而言之就是当控制周期小于PWM的生成周期时。)预装载寄存器才能起作用,预装载寄存器里面的值也才有可能被刷新。
换句话说:每次PWM在产生的过程中是不会被打断的,如果有程序试图修改他的占空比,那么这个值会被存在预装载寄存器里面。而这个预装载寄存器的值也是可以被刷新的。


验证:
1,在中断对PWM的占空比进行修改。设置定时器中断为15ms。PWM的一个周期为20ms。

下面是实验现象:
可以看到每个PWM的周期都是完整的(都是20ms),也就是说PWM周期不会被中断打断。另外示波器显示的PWM的占空比是循环出现 12.5%75%50%。对应程序中的bb=50,bb=300,bb=200


过程分析:第一次肯定是显示bb=100(占空比25%)的PWM。一个完整的PWM周期是20ms。而定时器中断的时间是15ms。所以在第一次PWM产生的过程中进入了中断,并且程序试图改变PWM的占空比。但是这时候一个完整的PWM周期还没有产生完毕。所以这个占空比就被存到定时器的预装载寄存器里面。当一个完整的PWM产生完毕后(也就是20ms后)定时器自动将预装载寄存器的值取出并执行。(这个过程是硬件实现的)
程序里面不是四次对PWM的占空比进行修改么?为什么只示波器上值循环三种占空比?
答:首先我们推测,STM32的预装载寄存器只有一个。而且这个值可以被刷新。
    我们不妨观察第三个周期完毕后的那个时刻。这个时刻既是PWM周期完成的时刻,也是定时器中断的时刻。(对于这个点我们分析如下:首先PWM是要先于定时器中断完成的。PWM周期刚刚完成后,定时器迅速从预装载寄存器里面取值,产生新的PWM信号。完成这个动作后再进定时器中断,再向预装载寄存器里面装值。)但是很不幸,这个时刻装的值很快就被下个定时器中断中的赋值代码给刷新掉了(或者说替换了)。所以我们在示波器上是看不到bb=100(占空比为25%)的PWM的。(除了第一次程序刚刚执行的时候)
具体分析过程见下图!!!

下面是为了验证上面的猜想而设计的一个实验:
PWM周期不变还是20ms。定时器周期改变为10ms产生一次中断。


实验现象如下:可以看到pwm占空比一直在12.5%50%之间循环。

具体分析过程见下图:

这里再说一个问题:关于

作者: hdongdong123    时间: 2016-10-14 20:44
[attach]88113[/attach]

作者: hdongdong123    时间: 2016-10-14 21:04
[attach]88119[/attach]

作者: hdongdong123    时间: 2016-10-14 21:05
[attach]88120[/attach]

作者: hdongdong123    时间: 2016-10-14 21:07
[attach]88121[/attach]

作者: hdongdong123    时间: 2016-10-14 21:08
[attach]88122[/attach]

作者: hdongdong123    时间: 2016-10-14 21:09
[attach]88123[/attach]

作者: aytc100    时间: 2016-10-15 00:41
很好,楼主用实验探究了双缓冲PWM波发生器
作者: hdongdong123    时间: 2016-10-15 12:13
这个没有参见STM32的技术手册,并且我们猜想K60也跟STM32一样存在预装载寄存器
作者: Ele丿Dd    时间: 2016-10-15 13:35
实践是检验真理的唯一标准
作者: 564388806    时间: 2016-10-16 09:06
如果同一时刻,既产生中断又更新占空比,那么先完成占空比的输出然后在响应中断。是不是涉及优先级的问题,,,
作者: hdongdong123    时间: 2016-10-16 12:12
肯定不是优先级的问题,我们猜想PWM发生器有一个预装载寄存器,里面存的是下次需要产生的PWM的占空比。
作者: hdongdong123    时间: 2016-10-16 12:23
在一个PWM周期没有结束之前是不会产生另外一个占空比不同的PWM信号的。也就是说我们在设置控制周期的时候只要保证每次PWM的值都是从预装载寄存器里面取出的,那么这就是控制舵机的最高效率。假如说PWM的控制周期设置成20ms,那么我们的控制周期只要保证比20ms小就可以了。
作者: aytc100    时间: 2016-10-16 12:25
hdongdong123 发表于 2016-10-15 12:13
这个没有参见STM32的技术手册,并且我们猜想K60也跟STM32一样存在预装载寄存器

双缓冲pwm早在xs128时代就有了,现在连大部分8位单片机都有这个功能

作者: hdongdong123    时间: 2016-10-16 18:37
aytc100 发表于 2016-10-16 12:25
双缓冲pwm早在xs128时代就有了,现在连大部分8位单片机都有这个功能

如果设定舵机频率是50HZ的话,说控制周期只要稍微小于20ms(比如19ms),也就是让PWM每次都从缓冲器里面取值(这应该是PWM的最高效率)。而没有必要把控制周期设置到5ms了。对吧!
作者: じ~凝眸处    时间: 2016-10-17 17:09
很吊的...
作者: aytc100    时间: 2016-10-17 17:20
hdongdong123 发表于 2016-10-16 18:37
如果设定舵机频率是50HZ的话,说控制周期只要稍微小于20ms(比如19ms),也就是让PWM每次都从缓冲器里面 ...

正好20ms,每次在pwm波更新之后写入寄存器就行

作者: Quixote    时间: 2016-10-17 20:21
看完楼主的帖子还是不明白楼主想表达什么。不过K60有个功能叫做异步PWM,xs128也有类似功能。其作用是将数值写入寄存器的同时立刻输出一固定时长的低电平或者高电平。而舵机的工作时长就是0.5ms到2.5ms之间,而其PWM频率则与其舵机的工艺有关,S3010是50Hz力矩最大,SD5是300Hz,具体则可能有一定偏差。我一般是使用外部的周期中断生成50Hz或300Hz来强制同步舵机输出的PWM。
作者: hdongdong123    时间: 2016-10-22 18:33
Quixote 发表于 2016-10-17 20:21
看完楼主的帖子还是不明白楼主想表达什么。不过K60有个功能叫做异步PWM,xs128也有类似功能。其作用是将数 ...

谢谢大神的解答,还是想请教一下你的舵机控制周期是多少ms控制一次,再就是舵机频率给多大?如果就用K60的FTM模块产生PWM信号。但是中断周期(在中断中控制舵机)小于pwm的周期。如果说一个PWM正在产生(还没产生完),但是在中断中执行改变这个PWM占空比的命令那么这时候这个正在产生的PWM是会被立即打断然后去执行新的PWM,还是说等待原来的PWM产生完了再产生这次的PWM信号呢?
作者: Quixote    时间: 2016-10-22 21:24
hdongdong123 发表于 2016-10-22 18:33
谢谢大神的解答,还是想请教一下你的舵机控制周期是多少ms控制一次,再就是舵机频率给多大?如果就用 ...

舵机频率低于25Hz就可以,控制50Hz一次。后面的问题我已经叙述过了,你如果不懂可以翻看K60的数据手册。

作者: hdongdong123    时间: 2016-10-23 10:54
Quixote 发表于 2016-10-22 21:24
舵机频率低于25Hz就可以,控制50Hz一次。后面的问题我已经叙述过了,你如果不懂可以翻看K60的数据手册。
...

好的,谢谢啦





欢迎光临 亿加合和智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2