找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1665|回复: 7
打印 上一主题 下一主题
收起左侧

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; //清中断标志
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:47445 发表于 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
回复

使用道具 举报

板凳
ID:213173 发表于 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.         }
复制代码
回复

使用道具 举报

地板
ID:624769 发表于 2023-6-29 21:37 来自手机 | 只看该作者
都用8h了,为什么不用CCP?还用外部中断+定时器?能硬件实现的功能为什么非要用软件处理?
回复

使用道具 举报

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

53岁年纪大了,脑子越来越不好用,记忆力欠缺,学习能力下降,用到的会仔细学,不用的就走马观花,您这么一提醒,俺还真要好好学习
回复

使用道具 举报

6#
ID:879348 发表于 2023-6-30 08:14 | 只看该作者
打开下载程序,里面有范例程序直接复制
回复

使用道具 举报

7#
ID:47445 发表于 2023-6-30 08:38 | 只看该作者
wulin 发表于 2023-6-29 21:15
频率135Hz,转速范围100~200 r/sec,无需用定时器中断,只要读 T2H

感谢大侠指导,俺试试
回复

使用道具 举报

8#
ID:47445 发表于 2023-6-30 08:39 | 只看该作者
wufa1986 发表于 2023-6-30 08:14
打开下载程序,里面有范例程序直接复制

多谢提醒,俺这就去看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表