首先要声明下面的结论都是我和学长的猜想,也没有查看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%之间循环。
具体分析过程见下图:
这里再说一个问题:关于 |