我需要做一个测量连续脉冲并计算高电平与低电平宽度。参考下列帖子:
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分频。但是做出来后发现误差特别大。请高手指点一下原因。 |