打印
[AVR单片机]

关于AVR捕获比较模块的误差

[复制链接]
1326|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
znsword|  楼主 | 2012-6-26 09:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我需要做一个测量连续脉冲并计算高电平与低电平宽度。参考下列帖子:
http://bbs.avrvi.com/htm_data/30/0809/10883.html
对程序进行了修改。
SIGNAL( SIG_OVERFLOW1 )
{
timer1_overflow++;
}
/************************************************************************
* T/C1捕获比较中断服务程序
***********************************************************************/
SIGNAL( SIG_INPUT_CAPTURE1 )
{
    cli();
    /* 读取TCNT1 计数值 */
    timer1_icr_new = ICR1L;// 先读低字节
    timer1_icr_new |= ( uint16_t )ICR1H << 8;// 再读高字节
    /* 检测到上升沿 */
if( bit_is_set( TCCR1B, ICES1 ) )
{
        /* 改为下降沿触发*/
  cbi( TCCR1B, ICES1 );
        /* 清除中断标志 */
        TIFR |= ( 1<<ICF1 );
        timer1_icp_level_flag = 0;
}
    /* 检测到下降沿 */
else
{
        /* 改为下降沿触发*/
  sbi( TCCR1B, ICES1 );
        /* 清除中断标志 */
        TIFR |= ( 1<<ICF1 );
        timer1_icp_level_flag = 1;
}
    /* 计算脉冲数 */
    if( timer1_overflow == 0 )
        timer1_icp_count = timer1_icr_new - timer1_icr_old;
    else
    {
        timer1_icp_count = 0xFFFF * timer1_overflow + timer1_icr_new - timer1_icr_old;
        timer1_overflow = 0;
    }
    timer1_icr_old = timer1_icr_new;
}
单片机采用的是11.0592MHz的晶振,开始时是下降沿捕获,timer1是1024分频。但是做出来后发现误差特别大。请高手指点一下原因。

相关帖子

沙发
airwill| | 2012-6-27 01:45 | 只看该作者
timer1是1024分频?
如果嫌精度不够, 就减少分频系数.
要得到最好的精度, 最好不要分频.

使用特权

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

本版积分规则

15

主题

43

帖子

2

粉丝