标题: 单片机频率计检测特定频率并点亮LED [打印本页]

作者: bd5fna    时间: 2024-3-19 15:45
标题: 单片机频率计检测特定频率并点亮LED
抄了一个频率计的单片机代码,设想检测到设定的频率,点亮LED。但现在是频率计有一定的误差,比如设定的频率是188Hz,但检测到的有可以是187Hz 188Hz或189Hz,正负各差1Hz,无法正常点亮LED。特请教各位大佬指教,如何通过换算,消除这个误差,正常点亮LED。
******************************************************************************/

void TM1_Isr() interrupt 3

{   

  static unsigned int ms_flag = 0;  //1s计数标志

        if(ms_flag++ == 1000)

        {

                freq = (TH0<<8|TL0);           //获取当前计数器计数值      
        
                if(freq ==188)                  //检测到的频率有可能是187 188也有可能是189

                        {
                                led=0;
                                ms_flag=1000;
                        }
                        
                else
                        {
                                led=1;
                        }
               
                ms_flag = 0;                   //1s计数标志复位

                send_flag = 1;                 //串口发送标志位置位

          TH0 = 0x00;                    //复位计数器

          TL0 = 0x00;                    //复位计数器        

        }

         TF1 = 0;                      //清中断标志

}

/******************************************************************************


作者: Hephaestus    时间: 2024-3-19 17:15
把freq ==188改成freq >=187 && freq <=189不就行了吗?
作者: bd5fna    时间: 2024-3-19 19:39
Hephaestus 发表于 2024-3-19 17:15
把freq ==188改成freq >=187 && freq

谢谢,我试试。
作者: wulin    时间: 2024-3-19 21:09
用外部中断取样计算频率要好些。
//T0中断服务函数
void Timer0_Isr() interrupt 1
{
        count++;
}
//INT0中断服务函数
void INT0_Isr() interrupt 0
{       
        TR0=0;                            //关定时器0
        Cnt_us=(count*65536)+(TH0<<8|TL0);//读取定时器0中计数值
        TL0 = 0x00;                       //定时器0计数值清0
        TH0 = 0x00;                       //定时器0计数值清0
        TR0=1;                            //开定时器0
        count=0;                          //中断计数值清0
}
//初始化定时器T0
void Timer0_Init(void)                //@12.000MHz
{
        AUXR &= 0x7F;                     //定时器时钟12T模式
        TMOD &= 0xF0;                     //设置定时器模式1
        TMOD |= 0x01;                     //设置定时器模式1
        TL0 = 0x00;                       //设置定时初始值
        TH0 = 0x00;                       //设置定时初始值
        TF0 = 0;                          //清除TF0标志
        TR0 = 0;                          //关定时器0
}

作者: bd5fna    时间: 2024-3-19 21:24
wulin 发表于 2024-3-19 21:09
用外部中断取样计算频率要好些。
//T0中断服务函数
void Timer0_Isr() interrupt 1

感谢大佬,我试试。
作者: TTQ001    时间: 2024-3-20 08:28
设置控件的容差范围,例如将阈值设置在 185 Hz 和 190 Hz 之间。
作者: bd5fna    时间: 2024-3-27 10:25
我现在的做法是freq >=187 || freq <=189,但检测速度有点慢,有没有提高速度的方法,中断是不是快一点。
作者: bd5fna    时间: 2024-3-27 10:53
TTQ001 发表于 2024-3-20 08:28
设置控件的容差范围,例如将阈值设置在 185 Hz 和 190 Hz 之间。

要检测多个频率,并且频率间相差太近,实测有重叠的部分。只有提高精度才行。




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