打印

AVR输入捕获冲突

[复制链接]
517|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
IPUDOWN|  楼主 | 2019-8-29 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
IPUDOWN|  楼主 | 2019-8-29 10:39 | 只看该作者
void Timer1_Init(void)
{
  TCCR1A |=(1<<COM1B1)|(1<<WGM11)|(1<<WGM10);     //0B00100011 OC1A作I/O用,OC1B输出PWM
  TCCR1B |=(1<<ICNC1)|(1<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS10); //0B11011001 噪声抑制,上升沿输入捕捉,快速PWM,1分频
        //TIMSK |=(1<<TICIE1);
  OCR1A = 0xffff;      //TOP=TCNT1值,TM1从0计数到TOP
  OCR1B = Min_PWM_D;     //占空比=0
}

int main(void)
{
        Port_Init();    //端口初始化
        Timer0_Init();   //TMR0初始化
        Timer1_Init();   //TMR1初始化
//
        uSF.S_Flag = 0;              //清状态共用体标志
        uTSF.T_SET_Flag=0;       //清时间设置共用体标志
//
        Interrupt_Init();   //中断初始化

        while (1)
        {
//
                if(uSF.bit.TC1_End_f==1)
                {
                        uDISP.speed=Vx/T_Num;      //转速=转速系数/T_Num  (T_Num:脉冲数)
                        uSF.bit.TC1_End_f=0;       //清IC1捕捉完成标志
                        PORTB ^=(1<<LED_Fwd);
                }
                if(uSF.bit.T_500mS_f==1)           //500mS时间到
                {
                        TIMSK |=(1<<TICIE1);        //开IC1输入捕捉中断
                        uSF.bit.T_500mS_f=0;   //清500mS时间到标志
                }
}
}



/***********中断程序************************/
//外部中断0
/*ISR(INT0_vect)
{
eeprom_CiShu_data_write ();  //掉电时“次数”数据写入(上电时读出)
}*/

//timer0 溢出中断(设置20mS中断一次,能使LCD更新等操作正常进行)
ISR(TIMER0_OVF_vect)
{  
        TCNT0 = T0_INIT;          //T0初值
        T0_count++;

        if(T0_count>=25)
        {
                mS_count++;               //500mS+1
                uSF.bit.T_500mS_f=1;        //置500mS定时到标志
                T0_count=0;
                if(mS_count>=2)
                {
                        second++;        //秒+1
                        re_sec++;          //秒记录+1
                        mS_count=0;
                        uSF.S_Flag ^=0b00000001;       //等秒取反

                        if(uSF.bit.T_XR_f)      ////////////////////////////////////////
                        {
                                PORTB |=(1<<LED_Fwd);   //正转LED亮///////////////////////////////////
                        }
                        else
                        {
                                PORTB &=(0<<LED_Fwd);   //正转LED亮///////////////////////////////////
                        }
                }
        }
//LCD_Set_Flash();              //设置闪烁
//LCD_Display_Update();         //LCD上8*16数字更新
}


//timer1 溢出中断(溢出次数记录)
ISR(TIMER1_OVF_vect)
{
T1_count++;      //TM1中断计数+1
/*if(uSF.bit.T_XR_f)      ////////////////////////////////////////
PORTB |=(1<<LED_Rev);   //正转LED亮///////////////////////////////////
else PORTB &=(0<<LED_Rev);*/
}


//IC1 输入捕获中断(测量周期脉冲数)
ISR(TIMER1_CAPT_vect)
{
        static uint IC1Temp1 = 0;    //第一个IC1捕捉值
        static uint IC1Temp2 = 0;    //第二个IC1捕捉值

        if(uSF.bit.IC1_1st_f == 0)     //IC1首次捕捉?
        {
                IC1Temp1 = ICR1;              //存第1次事件
                T1_count=0;               //清TM1中断计数
                uSF.bit.IC1_1st_f =1;     //置IC1首次捕捉标志
        }
        else
        {                       //第二次事件
                TIMSK &=(0<<TICIE1);      //IC1输入捕捉中断禁止
                IC1Temp2 = ICR1;              //存第2次事件
                T_Num = (IC1Temp2-IC1Temp1) + T1_count*65536;
                uSF.bit.IC1_1st_f =0;     //清IC1首次捕捉标志
                uSF.bit.TC1_End_f=1;       //置IC1捕捉完成标志
        }
}

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝