打印
[STM32F1]

stm32f101通用定时器做计时出现较大误差

[复制链接]
1337|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llisong|  楼主 | 2019-11-2 12:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不知不觉用stm32也十多年时间了,最近发现一个比较头疼的问题,看看各位同行有没有碰到过的,指点一二不胜感激:TIM1时钟频率36MHz,TIM1->PSC = 3;TIM1->ARR = 9000-1;产生中断时间1ms,36M / (4×9000)=1KHz,在中断程序进行毫秒累加,加到1000ms,进行时间加一秒,得到标准时间,最近测试人员反映,没有进行标准同步的时候,大约过了24小时,就会产生9-10秒的计时误差,慢了9-10秒钟,理论上定时器的分频以及产生中断,应该不会产生累积误差,24小时大约8万多秒,考虑到晶振误差以及pll的温漂,应该不会达到这么大的误差,这都超过100ppm了,测试了好几台,时间都是9秒左右,但是都不一样,希望不吝赐教

使用特权

评论回复
沙发
yklstudent| | 2019-11-2 12:59 | 只看该作者
真是大佬啊,ST都用了十多年了

使用特权

评论回复
板凳
香水城| | 2019-11-4 15:00 | 只看该作者
你现在是每1ms进一次中断。

系统里有没有别的中断?别的中断有无可能堵塞定时器计时中断?

使用特权

评论回复
地板
ayb_ice| | 2019-11-5 14:26 | 只看该作者
本帖最后由 ayb_ice 于 2019-11-5 14:28 编辑

这个是正常的误差,
普通晶振就这水平
电子表一天几秒的误差都正常,

使用特权

评论回复
5
liaotian001| | 2019-11-5 19:09 | 只看该作者
TIM1->PSC = 3;TIM1->ARR = 9000-1;产生中断时间1ms
虽然不熟悉ST的Timer,但从逻辑上来看,出错的误差是慢110ppm, ~ 1/9000, 是不是count计算有误差导致的? TIM1->ARR = 8998。
9.5s/24/3600 = 1.099537E-4
1/9000 = 1.11111E-4
两者的误差非常接近,值得推敲一下。
1ms的中断,基本不会被其他中断打断,中断能跑1ms,基本不可能。所以不会被其他中断打断减少1ms的中断响应。恭喜你中奖了。


但是我觉得ST不会犯这么低级的错误, 好好检查一下晶振的Cload,晶振的谐振电容+PCB寄生电容,如果匹配不好的话,相差100ppm也是有可能的。
我怀疑---晶振的谐振电容+PCB寄生电容 与晶振的理想谐振电容不匹配引起的误差。

使用特权

评论回复
6
643757107| | 2019-11-6 15:36 | 只看该作者
有道理,是不是其他中断阻塞了这个定时器

使用特权

评论回复
7
643757107| | 2019-11-6 15:37 | 只看该作者
你现在测试的这些误差,是全部快了几秒,还是全部慢了几秒,还是有快几秒的有慢几秒的,这个问题要讲清楚。

使用特权

评论回复
8
643757107| | 2019-11-6 15:37 | 只看该作者
如果说,都是一致性的快了几秒,或者一致性的慢了几秒,好找问题。如果有快有慢那种就难搞了。

使用特权

评论回复
9
crystal1987| | 2019-11-6 16:16 | 只看该作者
stm32的RTC或TIM精准计时不准是周所众知的,所以想用STM32的时钟精准计时还是建议你放弃吧。实现RTC 校准的核心之一是库文件Stm321f0x_bkp.c中的void BKP_SetRTCCalibrationValue (uint8_t CalibrationValue) 函数。谈到RTC校准的相关参考文档包括AN2604.pdf,AN2821.pdf和AN2821.zip。这三个文档都可以从STM32官方网站下载。
按照AN2604.pdf描述的原理,RTC 的校准值应在0-127之间。可实现的校准误差对应为0-121ppm。相当于每30天跑快的秒数为0-314s。如果你觉得这个误差可以接受你继续往下做,确实可以提高计时精度,但是误差还是存在。我当时也做过;后来误差还是不能接受;然后换的DS1337和DS3231专门的计时芯片,DS3231时间误差很小,当时记录了30天吧,误差不超过2S(记不是很清,和这个数据差不多);有兴趣的话可以试试。

使用特权

评论回复
10
磨砂| | 2019-12-4 12:03 | 只看该作者
误差好大啊

使用特权

评论回复
11
香水城| | 2019-12-4 12:23 | 只看该作者
本帖最后由 香水城 于 2019-12-4 12:24 编辑
liaotian001 发表于 2019-11-5 19:09
TIM1->PSC = 3;TIM1->ARR = 9000-1;产生中断时间1ms
虽然不熟悉ST的Timer,但从逻辑上来看,出错的误差是 ...

因为优先级的问题被打断或被阻塞,不需要中大奖的。

当然,晶振及附件参数也值得注意。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

37

帖子

1

粉丝