[AVR单片机] 关于AVR捕获比较模块的误差

[复制链接]
1703|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

粉丝
快速回复 在线客服 返回列表 返回顶部