小编今天在网上冲浪的时候,看到一位博主的经历。就是说在设置定时器自动重装载值的时候没有-1导致一个200ms的定时器差了5个ms,然后把定时器自动重装载值-1后发现误差减小到了50us。小编以前也没有发现过这个问题,因为按照前辈们的经验,一般在设置自动重装载值的时候都会默认-1所以也没有关心其中的门道。看了这位博主的经历小编很是好奇,决定来复现一下这位博主所说的问题,或者说是也探究一下其中的门道。
小编首先用stm32cubeide设置了一个PWM输出。利用PA2输出一个PWM,利用定时器2的通道3,配置成PWM输出,其周期就如那位博主所说的200ms。小编显示设置了一个没有-1的数值,就是做一次没有-1情况下的实验,把内部时钟分频值设为7200,自动重装载值设置成2000,OK点击编译下载后,用示波器看一下结果。周期200ms,5Hz,现象并没有博主说得差那么多,那么小编再做一下-1情况下的实验看下实际效果。
同样的,小编用stm32cubeide设置了一个PWM输出。利用PA2输出一个PWM,利用定时器2的通道3,配置成PWM输出,其周期就如那位博主所说的200ms。这次小编设置了-1的数值,也就是做一次对比实验,把内部时钟分频值设为7200-1,自动重装载值设置成2000-1,OK点击编译下载后,用示波器看一下结果。周期199.8ms,5.01Hz,实际情况差了0.2ms,也没有博主说得那么夸张。反而是没有-1的情况下更接近理论值,这里小编分析了一下,这个减不减1要看怎么配置。如果分频系数大一些,那么自动重装载的值相差1实际结果就会相差大一些,因为其计数频率变小了,差1个计数周期就会变大。相反的会相差就会小一些。
那么到底要不要-1呢,我们来看下数据手册,以STM32F103来举例,手册很明确的说了计数是从0开始自动累加到装载值,所以实际就要-1。那么如果不-1会有什么结果,其实也就是多累加1就是多累加1个计数周期而已,如果对时基精度要求没有那么高的情况下,可以忽略。但是小编我们针对实事求是的原则,还是建议大家在配置参数的时候-1。
好了,不知道小编这一篇长篇大论有没有把这个问题解释清楚,如果觉得小编说的还不错,帮忙点赞转发鼓励呀😁