搜索
bottom↓
回复: 17

难道AVR的定时器真的这么不准吗?高手们进来帮帮忙啊

[复制链接]

出0入0汤圆

发表于 2007-8-14 02:46:02 | 显示全部楼层 |阅读模式
我用M32来做红外遥控解码,计划是用定时器0+外部中断0来做。



弄了很久都不行,后来才发现是定时器0的定时时间不准。



我用外部晶震8M,定时器0用普通模式8分频溢出中断。



为了求证时间准不准,我写了一个时钟程序来验证,结果发现定时时间比计算值长了,而且相差很大,大概60秒就差1秒,难道AVR定时器的精确度就只有这样?



望高手指教








以下语句由站长阿莫加入:



由于有马老师8、9楼的回复,此贴置COOL!

出0入0汤圆

发表于 2007-8-14 08:05:17 | 显示全部楼层
我用的很好啊,内部的RC是差了点,解码会不稳定,外部没有问题啊。

出0入0汤圆

发表于 2007-8-14 11:12:00 | 显示全部楼层
你觉得可不可能?定时器是时序逻辑电路,来一个时钟就加1,定时器本身不可能不准。不准的只有2个原因,一个是你的时钟不准;第二个是你的程序有问题,没有在足够短的时间内退出中断。

出0入0汤圆

发表于 2007-8-14 11:14:28 | 显示全部楼层
按道理说,AVR的定时器比51的准多了,51没有预分频器,在进入中断后,定时器就停掉了,程序越长,误差越大,需要计算汇编结果后进行补偿。AVR有预分频器,进入中断后,只要预分频器没有计满,是不会有误差的。

出0入0汤圆

 楼主| 发表于 2007-8-14 11:39:07 | 显示全部楼层
我在写时钟程序来验证的时候,是用8M外部晶震,8分频,定时器初值为0x05,定时器中断里就做重新赋初值和秒计数指针加1这2个操作,这样不会超过时间吧?

出0入0汤圆

发表于 2007-8-14 12:45:38 | 显示全部楼层
不是有中断捕获功能吗?为什么不用?

出0入0汤圆

发表于 2007-8-15 01:43:06 | 显示全部楼层
这个问题并非定时器不准,也不是AVR有问题,这是所有单片机都存在的结构性问题。如果应用中需要高精度定时,注意以下几点,对其有针对的采取一些改进措施并对定时参数进行补偿即可:

1、定时溢出中断的响应时间。这个受运行情况影响并非定值。比如中断发生时运行的指令周期数有所不同、是否处于其它中断处理中?是否设置了中断嵌套,优先级的确定等;

2、进入中断到给计数器TCNT赋值经历的时间。

用AVRSTUDIO仿真跑一下基本可以知道相关数据。对这些因素进行响应修正和改善即可大幅改善定时精度。

出0入0汤圆

发表于 2007-8-15 01:50:49 | 显示全部楼层
大家踏踏实实的看看我讲义的第8章吧。汗颜。



昨天已经回答了2个关于定时器定时时间不准的问题了。

出0入0汤圆

发表于 2007-8-15 03:34:54 | 显示全部楼层
7楼的说明,有些东西或原因是分析到了,但解决的方法不对呀,容易误导别人。



1。“这是所有单片机都存在的结构性问题”。

    这根本不是单片机存在结构性的问题,它就是这样工作的,是我们的学习方法和思路出现了结构性的问题。





2。所有单片机都有让你获得精确的定时方法,可是你不去用。AVR的CTC方式,MCS-51的自动重载方式是做什么用的?就可以完全得到精确的定时中断(只要你中断服务程序执行的时间比中断间隔短就行了)吗,为什么老是盯着溢出中断使用?是我们的学习方式和思维方式出问题?还是单片机都存在的结构性问题?

出0入0汤圆

发表于 2007-8-15 08:00:04 | 显示全部楼层
马老师说的对,51的自动重载很好用的,也很准!

出0入0汤圆

发表于 2007-8-15 12:41:00 | 显示全部楼层
又来和51比?时钟不会不准的,只会是我们的思路和程序有问题。象这种红外遥控解码用AVR太简单了。这里也说过用捕捉中断,捕捉由硬件保证时钟,最大误差就是硬件的时钟周期(不分频),你用两个中断尤其是用了那个外部中断会造成非常大的误差的。从发生中断到进入中断开始再读取时钟,这本身就差了很多。另外51的自动重载和AVR的CTC不是一样吗?用捕捉中断后,不要管定时器,就让它自己循环就行了。捕捉可以随意捕捉上升沿或者是下降沿,另外还可以启动里面的滤波功能。另外红外遥控本身就是一个占空变化的波形信号(有些协议不是),本来精度就不是很高,所以软件也很重要。容错性保证加上就一点问题也没有了。很早以前用51解两类遥控器(也就是一个板子同时支持多种遥控器),完全没有问题。现在感觉要用AVR会比原来简化多了。原来用51就是用两个中断来的。

出0入0汤圆

发表于 2007-8-16 01:50:21 | 显示全部楼层
马老师一句话点醒梦中人啊,在此谢过了。确实有学习不全面的问题。至于说方法不对会误导他人,我持保留态度。相对CTC模式来说,我的方法不如CTC高效便捷,不是一个很好的方法。如果早点学习CTC模式我也不需要这样处理了(因我从没注意过CTC模式是怎么回事也没有用过这种模式。有精确定时的要求我是一向如此处理,效果也很好)。

    俗话说条条道路通罗马。论坛应该是开放的地方,大家集思广益,才能互相促进共同提高。解决问题,应该允许不同的人有不同的思路和方法,只要能解决问题,就是对的。至于各方法的效率优劣的差别,有了比较才能知道哪种更好,好在哪里。并非最好的方法才正确,除此都不对。应该结合具体情况择优选用。假如要开发一个没有CTC模式、没有PWM模式的芯片时,要精确定时、要实现PWM输出时该怎么办?当不能更换芯片时,是不是就没有办法做了?

    没有联通,手机资费标准恐怕还会停留在砖头年代;没有手机的普及,恐怕报装固定电话还会停留在交几千块还得托关系求人的年代。一句话,禁止垄断、鼓励竞争。
头像被屏蔽

出0入0汤圆

发表于 2007-8-16 07:37:36 | 显示全部楼层
由于有马老师8、9楼的回复,此贴置COOL!

出0入0汤圆

发表于 2007-8-16 08:45:38 | 显示全部楼层
我之前写的一个例子,还请大家点评

/*****************************************************

www.avrdiy.com

CodeWizardAVR V1.25.6 Professional

Chip type           : ATmega48

Clock frequency     : 7.372800 MHz

Memory model        : Small

External SRAM size  : 0

Data Stack size     : 128

功能:LED每秒钟闪烁一次(或者驱动蜂鸣器),要求时间要精确

计算: 1秒 = 时钟 / ( 分频 * 计数 )

假设时钟 = 7372800 Hz 那么: 1秒 = 7372800 / ( 分频 * 计数 )

得: 计数 =7372800/分频

由于分频只有 1/8/32/64/128/256/1024 供我们选择,而计数最高只有8位(255)

为了不占用资源,中断次数尽量少一点比较好,并且中断服务程序运行时间越短越好

所以我们可以选择 计数TOP = 时钟7372800 / 分频1024 / 每秒30次中断 = 240

那么 时间 = 时钟7372800 / 1024分频 / 每秒30次中断 / TOP 240 = 1秒

*****************************************************/



#include <mega48.h>

unsigned char TC2A=0;  

interrupt [TIM2_COMPA] void timer2_compa_isr(void)

{

  TC2A++;

  if(TC2A>=30) TC2A=0;

  if(TC2A>25) PORTD.3=1; else PORTD.3=0;

  //在这里还可以插入如数码管的动态扫描/键盘扫描等代码

  //注意,中断运行时间必须小于 1秒 / 30次中断 = 33ms

}



void main(void)

{                                             

  TCCR2A|=2;               //工作于CTC模式(比较匹配时计数器TCNT2清零)

  OCR2A=240;               //设置TOP的值(计数器TCNT2的计数上限值)

  TCCR2B|=7;               //取系统时钟1024分频作为T/C2时钟

  TIMSK2=2;                //使能计数器的值达到TOP时产生中断

  DDRD.3=1;                //使用PD3每秒驱动蜂鸣器"嘀"一次

  #asm("sei")              //插入汇编语句,打开全局中断

  while (1)

  {

    #asm("nop")            //空操作的汇编代码,等待中断发生

  };

}



/****************************************************

假设程序还有一个3位数码管动态扫描任务,这时我们就可以这样计算

1:数码管的扫描频率在75-85Hz比较合适,太低会闪烁,太高占用资源

2:每扫描一次就必须分3次显示,分别是个位/十位/百位

3:这时我们可以计数出显示频率是225-255Hz(中断频率),在这里假设=240Hz

4:这时我们就可以顺便使用这个T/C2定数中断来保证扫描的可靠运行了***/

出0入4汤圆

发表于 2007-8-16 09:13:22 | 显示全部楼层
我用INT0+ICR,一个管上升沿,一个管下降沿,效果还可以.

出0入0汤圆

发表于 2011-9-11 10:01:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-16 14:05:14 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 22:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表