标题: STC8H单片机在外部中断里开启定时器2计数失败 [打印本页]

作者: jl48q    时间: 2023-6-29 09:15
标题: STC8H单片机在外部中断里开启定时器2计数失败
STC8H单片机外部中断0 P32接霍尔传感器读取直流电机转数,由于电机一转就干扰中断口,用示波器测方波,有许多不规则的毛刺尖峰,引发错误中断,正常方波大约为135Hz 约7.5毫秒,在外部中断第一次开启定时器,外部中断第二次关闭定时器,然后读取范围就框定在5~10毫秒,以下就是修改后的程序,但不知什么问题,在外部中断里无法开启定时器中断计数,望大侠指点

void T0_in(void) //外部中断0初始化
{
        IT0 = 1;  
        EX0 = 1;  
        EA = 1;
}

void INT0_Isr() interrupt 0  
{
        if(quan_flg==1)  //外部中断启动标志
        {
                cishu++; //脉冲次数++
                if(cishu%2==0)
                {
                   zd_x=1;//当脉冲来了引发中断 且脉冲是第一次来时。 启动定时器。
                }
                else
                {
                   zd_x=0;//当下一次脉冲来时 关闭定时器。        
                }
        }        
}


void init_Timer2()            //10微秒@12.000MHz
{
        AUXR &= 0xFB;            //定时器时钟12T模式
        T2L = 0xF6;            //设置定时初始值
        T2H = 0xFF;            //设置定时初始值
        AUXR |= 0x10;            //定时器2开始计时
        IE2 = 0x04;//ET2;   //使能定时器中断
}


void Timer2() interrupt 12
{
        if(zd_x==1)//定时器启动标志
        {  
                zd_time++;  //时间计数++        
        }
        
        if(zd_time>=5000&&zd_time<=10000)//时间计数大于等于5000US小于等于10000US
        {
                zd_time=0;  //时间计数清零
                pulse++;    //读取5000uS~10000US内电机的转数
        }

    AUXINTIF &= ~0x01;//T2IF; //清中断标志
}



作者: wulin    时间: 2023-6-29 21:15
频率135Hz,转速范围100~200 r/sec,无需用定时器中断,只要读 T2H<<8|T2L计数值即可,也不要在外部中断函数里计算,要放在主函数中计算。
  1. void Timer2Init(void)        //@12.000MHz
  2. {
  3.         AUXR &= 0xFB;                //定时器时钟12T模式
  4.         T2L = 0x00;                        //设置定时初始值
  5.         T2H = 0x00;                        //设置定时初始值
  6. //        AUXR |= 0x10;                //定时器2开始计时
  7. }
  8. void INT0_Isr() interrupt 0  
  9. {
  10.         AUXR &= 0xef;                //关闭定时器2
  11.         temp=T2H<<8|T2L;
  12.         T2L = 0x00;
  13.         T2H = 0x00;
  14.         AUXR |= 0x10;                //开始定时器2
  15.         flag=1;                                //中断标志位
  16. }
  17. //在主函数中计算转速
  18.         if(flag)
  19.         {
  20.                 flag=0;//清中断标志位
  21.                 speed=1000000L/temp;        //计算秒转速
  22.         }
复制代码

作者: 188610329    时间: 2023-6-29 21:37
都用8h了,为什么不用CCP?还用外部中断+定时器?能硬件实现的功能为什么非要用软件处理?
作者: jl48q    时间: 2023-6-30 08:11
188610329 发表于 2023-6-29 21:37
都用8h了,为什么不用CCP?还用外部中断+定时器?能硬件实现的功能为什么非要用软件处理?

53岁年纪大了,脑子越来越不好用,记忆力欠缺,学习能力下降,用到的会仔细学,不用的就走马观花,您这么一提醒,俺还真要好好学习
作者: wufa1986    时间: 2023-6-30 08:14
打开下载程序,里面有范例程序直接复制
作者: jl48q    时间: 2023-6-30 08:38
wulin 发表于 2023-6-29 21:15
频率135Hz,转速范围100~200 r/sec,无需用定时器中断,只要读 T2H

感谢大侠指导,俺试试
作者: jl48q    时间: 2023-6-30 08:39
wufa1986 发表于 2023-6-30 08:14
打开下载程序,里面有范例程序直接复制

多谢提醒,俺这就去看看
作者: jl48q    时间: 2023-6-30 10:35
wulin 发表于 2023-6-29 21:15
频率135Hz,转速范围100~200 r/sec,无需用定时器中断,只要读 T2H

原来程序是这样的,但电机一转,外部中断口就有许多尖峰毛刺,严重干扰真正需要的脉冲,所以要用定时器选定90~180HZ范围的脉冲

void INT0_Isr() interrupt 0  
{
        if(quan_flg==1)
        {
                cishu++;
                if(cishu==2)
                {
                        cishu=0;
                        pulse++;
                        if(pulse>=65535)
                        pulse=65535;
                }
        }


        else if(quan_flg1==1&&pulse>0)
        {       
                cishu++;
                if(cishu==2)
                {
                        cishu=0;
                        pulse--;
                        if(pulse<0)
                        pulse=0;
                }
        }       
}

135.png (11.13 KB, 下载次数: 62)

135.png





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1