打印
[AVR单片机]

用中断实现记录电频脉冲次数。

[复制链接]
1064|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
元方义城|  楼主 | 2015-9-15 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实现目的如标题 。
条件:脉冲间隔是不确定可能毫秒级别也可能几十微秒,脉宽同理(可能几毫秒可能微秒级别)。
硬件上我用的单片机是atmega8,使用的外部10M晶振。

我使用过的方法:
   外部中断方式1:在中断中给一个变量,每次检测一个下降沿进入中断,变量自加。在中断中给一个if判断,若记录到我想要的次数。将flag=1,主程序中一直检测flag,若==1则执行动作。
    void int1_isr(void)
{
  GICR&=~BIT(INT1);
  while((PIND&BIT(3))==0x00);
num++;   
if(num==5)
   {
     num=0;
     flag=1;
    // PORTD|=BIT(PD4);
    }
  GIFR|=BIT(INTF1);
  GICR|=BIT(INT1);  //打开中断1使能
}
我觉得逻辑上应该没有错,问题如下
   问题1:我在检测的时候发现,中断检测存在不稳定性,我给一个脉冲可能进两次中断(排除是初始化原因)。这导致计数出错。
  问题2:单片机在上电过程中避免不了的存在电涌的情况,我的脉冲发生装置也如此,这样会出现个别脉冲被检测到,使num初始不为0,我只能在上电后发送代码清num值。我想避免这种现象。

方法2:使用计数器来实现记录脉冲次数,当溢出时flag=1
        用计数器1  初始值设成   
TCNT1H=0xFF;
TCNT1L=0xFB;//也就是65531     当65536时溢出
TCCR1B|=0x06;//0x04 256分频0x05 1024分频 0x02 8分频  0x06外部下降  0x07 外部上升沿
TIMSK|=BIT(2);  计数器1使能
脉冲输入点接在mage8的T1(PD5)
问题和中断出现类似,表示很无奈,请高手指点迷津。

相关帖子

沙发
airwill| | 2015-9-15 19:47 | 只看该作者
适当使用上电延迟来解决上电时的误触发信号, 给信号也可能在变化的边沿出现若干个抖动信号.

使用特权

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

本版积分规则

26

主题

158

帖子

4

粉丝