恭喜,你发布的帖子
发布于 2023-02-23 09:23:27
48楼
我撸了一遍,认为问题还是定时器的精度问题,重点是定时器长时间累加的精度问题。
1、首先,看看时钟源的误差
PLC的时钟源有2种,一种是驱动MCU工作的高速晶振,频率在数十MHz,精度和稳定性一般,具体是多少,可以上网查一下。
另一种是供RTC工作的低频率晶振,比如32.768KHz,精度和稳定性要求较高,在长时间累计时间时保证计时精度,这个精度手册上可查到。
如果要求定时精度(包括长时间累加)高于晶振,这是不可能实现的,也没讨论的必要。
2、其次,是系统定时误差
我们用到的1ms、10ms、100ms定时器,都是软件定时器,由底层的硬件定时器更新,精度与稳定性由硬件定时器决定。
间隔型硬件定时器由硬件自动控制计时,不受软件执行的影响。
比如10MHz晶振时钟产生1ms间隔的硬件定时,当计数达到10000时,由硬件自动重载初值(比如清0)重新计时,因此,底层硬件定时器的精度和稳定性由晶振决定。
3、软件定时误差
讨论软件定时误差,假定晶振是精准、稳定的。
1ms分辨率定时器的误差,最大是1ms
10ms分辨率定时器的误差,最大是10ms
100ms分辨率定时器的误差,最大是100ms
4、楼主的定时误差
楼主顶楼的定时间隔是200ms,分辨率1ms,最大误差是1ms,理论最大相对误差是1/200=0.005。
楼实验的结果,10小时误差80s,相对误差=80s/10小时=0.00222,小于理论最大误差0.005。
结论:楼主的程序应该没有问题。
5、提高定时精度
加大定时长度,可提高定时精度,比如,定时长度10000ms,分辨率1ms,最大误差下降至0.0001。
6、实时性和定时长度
如果简单把定时长度延长至10000ms(10s),实时更新时间变为10s。
如果还是要0.2s更新一次,需要一些处理技巧。
BITIM和CITIM配合,可以现实这一目标。
定时长度=基数+相对时间增量
相对时间增量每0.2s用CITIM调整,到达10s后,使用BITIM复位定时器,并且把相对时间增量转移到基数。
请填写推广理由:
分享
只看
楼主