|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
单片机定时精度问题! |
作者:我是小可 栏目:单片机 |
大家好,我最近在设计一个单片机日历, 用C语言编写程序,发现定时不是很准, 而且相差很多,个人认为不应该这样啊? 不知道有没有什么好的办法可以解决问题, 在C语言里嵌入汇编可以解决吗? 请高手帮助解答,谢谢! |
2楼: | >>参与讨论 |
作者: computer00 于 2006/6/4 17:13:00 发布:
不关C语言的事,是你自己程序没弄好。 最好使用8952里面的定时器2做自动重装模式,这样会准确很多。 如果你用软件重装的话,要考响应中断及保护现成所消耗的时间,在重装时要将它们加上。 |
3楼: | >>参与讨论 |
作者: 我是小可 于 2006/6/4 17:16:00 发布:
多谢! 多谢,圈圈的解答, 但是,可能是我在处理中断的时候没有处理好, 用自动重转载模式,可以解决这个问题吗? |
4楼: | >>参与讨论 |
作者: judge 于 2006/6/4 17:19:00 发布:
相差多少啊。 一般12M的晶体一天能差10多秒。即使自动装的话 软件可以补偿。 用32768的晶体吧。 我用30PPM的一天只差1秒。 不补偿。 |
5楼: | >>参与讨论 |
作者: awey 于 2006/6/4 17:22:00 发布:
RE: 1、定时器用自动重装入方式 2、中断服务程序不要太长,更不能大于定时间隔。 3、不需要嵌入汇编 |
6楼: | >>参与讨论 |
作者: 我是小可 于 2006/6/4 17:44:00 发布:
回:judge 一般12M的晶体一天能差10多秒。即使自动装的话 软件可以补偿。 我也想过补偿的办法的,但因为用人眼观察出来的误差 就有差不多半秒了,这样补偿一次还可以,但时间长了 还是有累计误差的, 所以我想最好不用补偿的办法解决它 |
7楼: | >>参与讨论 |
作者: 我是小可 于 2006/6/4 17:46:00 发布:
回awey 如果用自动重装载的模式的话, 最大定时因该市 256us 吧 也就是说,中断的处理程序要小于这个时间就行吗? |
8楼: | >>参与讨论 |
作者: judge 于 2006/6/4 17:52:00 发布:
那肯定的 就算你再高的算法和处理技巧,误差一定存在。 看你要求是怎么样的。 1天差1秒和10年差1秒是不一样的。 要求高只能GPS对时了。 |
9楼: | >>参与讨论 |
作者: 我是小可 于 2006/6/4 17:56:00 发布:
回judge 呵呵,你误会了,我没有别的意思, 就是想让单片机内部的定时准一些, 不想用补偿的办法, 那样的话,感觉有些假 ,呵呵 |
10楼: | >>参与讨论 |
作者: maychang 于 2006/6/4 19:52:00 发布:
“那样的话,感觉有些假” 此话看不懂。 那么什么是真的?你的钟走不准是真的还是走得准是真的? |
11楼: | >>参与讨论 |
作者: qiangjidan 于 2006/6/4 20:16:00 发布:
外部 的 |
12楼: | >>参与讨论 |
作者: computer00 于 2006/6/4 21:10:00 发布:
也许他所说的假,是指不是每个时刻都是准的, 因为是软件隔一段时间修正一下,所以在某个时刻,是不准的,而过了这个时刻后,又变准了。 不过,一般来说,短时间的偏差还是可以接受的。就像你每天去电台对一下表一样。 |
13楼: | >>参与讨论 |
作者: awey 于 2006/6/4 21:40:00 发布:
回楼主: 如果用自动重装载的模式的话, 最大定时因该市 256us 吧 也就是说,中断的处理程序要小于这个时间就行吗? 没错。 你可这样处理,假如定时是250uS,用一个变量累计中断次数,中断的处 理程序只让此变量加1即可,而在主程序里,判断此变量是否大于某一 值,比如200,即50mS,如果大于就执行处理,并把此变量减200,如果小 于200则不理会,这样处理程序的时间就不会受到限制了 |
14楼: | >>参与讨论 |
作者: computer00 于 2006/6/4 22:10:00 发布:
如果用8952的话,用它的定时器2,就有16位的自动重装了。 如果是AVR的,就更不用说了。 |
15楼: | >>参与讨论 |
作者: kyflash 于 2006/6/4 22:19:00 发布:
跑快了倒可以试试在中断里面加空操作调整 如果晶振不准等因素,你想做的准,不补偿怎么行啊。 定时不准,跟用C还是汇编关系不大吧,有兴趣可以去computer00师兄的BLOG看他以前的电子钟作品 |
16楼: | >>参与讨论 |
作者: conwh 于 2006/6/4 23:05:00 发布:
应该加有补偿,因为晶振也有误差. 使用市电应该很准的 |
17楼: | >>参与讨论 |
作者: zhf0964 于 2006/6/5 15:13:00 发布:
实际上要做好一个时钟难度相当地大! 建议楼主采用内置晶体、带TCXO的外置时钟芯片。 如:RX-8025,DS3232等等。 像你这样只用单片机的定时中断,又是用C语言来 编程,肯定是做不好的。 |
18楼: | >>参与讨论 |
作者: fushaobing 于 2006/6/5 16:08:00 发布:
我建议用专用时钟芯片 要想时间准,就用时钟芯片,简单省事 |
19楼: | >>参与讨论 |
作者: 松鼠的大树 于 2006/6/6 10:23:00 发布:
关键是硬件 硬件决定了软件能达到的性能的上限。 如果用单片机定时器实现的话,首先要考察一下你的定时器加一对应的时间是多少,这个称为计时粒度;然后根据你的功能要求确定计时间隔,比如,1ms,10ms,100MS或者1s ;查芯片手册或者做试验,弄清楚自动重装模式中自动重装这个过程消耗的单片机时钟周期,计算出它的时间长度;用你的计时间隔减掉重装的时间,就是你真正要实现的计时时间长度;看看这个实际的计时时间长度能不能被计时粒度整除,能的话,商就是计时器的计数值,不能的话,你的时钟是无论如何不可能不作修正就准确的。 另一方面,考虑到晶振的离散性,计时理论计算很准确,也最好还是做校准功能,允许用户定义校准间隔和调整值(+/-)。 供参考 |
20楼: | >>参与讨论 |
作者: gfs0521 于 2006/6/6 11:39:00 发布:
软件就和大家所说的用自动装载模式 硬件你用的振荡器精度要高,这样就可以做得很精确了 |
|
|
Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号 |