找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机频率计检测特定频率并点亮LED

[复制链接]
跳转到指定楼层
楼主
ID:76027 发表于 2024-3-19 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
抄了一个频率计的单片机代码,设想检测到设定的频率,点亮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;                      //清中断标志

}

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

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

使用道具 举报

沙发
ID:883242 发表于 2024-3-19 17:15 | 只看该作者
把freq ==188改成freq >=187 && freq <=189不就行了吗?
回复

使用道具 举报

板凳
ID:76027 发表于 2024-3-19 19:39 | 只看该作者
Hephaestus 发表于 2024-3-19 17:15
把freq ==188改成freq >=187 && freq

谢谢,我试试。
回复

使用道具 举报

地板
ID:213173 发表于 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
}
回复

使用道具 举报

5#
ID:76027 发表于 2024-3-19 21:24 | 只看该作者
wulin 发表于 2024-3-19 21:09
用外部中断取样计算频率要好些。
//T0中断服务函数
void Timer0_Isr() interrupt 1

感谢大佬,我试试。
回复

使用道具 举报

6#
ID:420836 发表于 2024-3-20 08:28 | 只看该作者
设置控件的容差范围,例如将阈值设置在 185 Hz 和 190 Hz 之间。
回复

使用道具 举报

7#
ID:76027 发表于 2024-3-27 10:25 | 只看该作者
我现在的做法是freq >=187 || freq <=189,但检测速度有点慢,有没有提高速度的方法,中断是不是快一点。
回复

使用道具 举报

8#
ID:76027 发表于 2024-3-27 10:53 | 只看该作者
TTQ001 发表于 2024-3-20 08:28
设置控件的容差范围,例如将阈值设置在 185 Hz 和 190 Hz 之间。

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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