本帖最后由 3htech 于 2013-7-11 11:39 编辑
博采众长,取其精华、去其糟粕~
写写自己这几年的想法。有技术上的,也有其他方面的杂谈。
如果您是高手,请跳过,如果您自认为是高手,也请跳过。
愤青们请跳过。
=========================================================================
【一】定时器重装引起的误差 【2013-06-28】
【二】 模拟IIC总线驱动编写
EEPROM全系列驱动编写
一种基于定时器的按键检测程序
【三】一点小感想——现成未必成熟 【2013-07-01】
【四】 菜单,你了解几何? 更新时间:不晚于2013年9月30日
=========================================================================
2
评分
-
查看全部评分
|
|
|
|
本帖最后由 3htech 于 2013-7-1 17:17 编辑
【一】 定时器初值重装引起的误差
背景:
小白菜在做一个测速项目时,使用单位时间内进行计数的方法来测速。单位时间的产生是用定时器来实现的,初值手动装填。
使用信号发生器进测试时发现,实际测得的信号总是有0.15%的误差,无论如何也无法消除。
查找原因:
硬件上,查找信号进入单片机前的频率和波形,经过示波器对比,没有问题。说明问题出在单片机上。
问题要么是在计数器上,要么是在定时器上。我想了一下,计数器的可能性不大,因为信号频率不算太高,计数器完全没有问题。
可能的原因就是定时器上。
于是我查看了程序,在定时中断ISR中,有一条引起了我的注意,
THn = xxxx;
TLn = xxxx;
我想了想,
由于定时中断程序中,没有关定时器中断,定时器一直在运行,也就是说,CPU在跳转到定时中断程序执行时,定时已经跑了几个数了,而我在赋定时器初值的时候,没有考虑到这几个数。
我想,我找到了解决这个问题的原因。
解决之道
由于我的系统里面,定时中断优先级最高,且没有同级中断,并且TLn的初值很小,这允许我使用下面这条语句,而不至于让TLn溢出。
TLn += xxxx;
再次测试,频率终于一致了。当定时器不停,TLn += xxxx; 可以保证在执行本条语句之前,定时器跑的计数值不会被忽略。
后记
关于定时器中断,《删繁就简-单片机入门到精通》做了很详细的说明。大家可以看看~
|
|
|
|
|
本帖最后由 3htech 于 2013-7-1 17:17 编辑
【三】 一点小感想——现成未必成熟
当做一个项目的时候,我的前辈们和老板们最常说的一句话是,有现成的东西。不需要自己发挥。
试想一下,现成的东西就一定成熟吗?
所谓的现成,也许是前辈们的创新,也许是经典的东西。对于经典的东西,我们需要了解,否则也不一定能用好。
对于前辈们的创新,我们可以去检验一下,尽量做到自己心里有数,知道我们的电路和软件是什么,怎么运行的。
也许,只有在吃过亏的时候才懂得去思考。
|
|
|
|
|
~感谢经验分享~
|
|
|
|
|
{:8:} 小白菜给力啊!这个问题我也碰到到 当初就是用一个算法算数的时候过长,可能是数据类型的问题,当测速的时候,速度过快,计数器计数时间很短,两个沿的脉冲时间间隔也很短的时候,就会出现误差,后来经过休整算法才解决的!
|
|
|
|
|
A670521546 发表于 2013-6-28 11:23
更新太慢了
我也有项目要做,所以时间上有些紧张。
而且,我想写好每一篇。尽量用最短的语言来说明问题。
嘿嘿。
|
|
|
|
|
头像被屏蔽
· 2013-7-9 09:49:46
|
|
|
|
|
好贴, 还更新不?
|
|
|
|
|