在简易示波器中计算波形频率不用fft!!!

本文介绍了一种在简易示波器项目中计算波形频率的方法,通过STM32单片机的ADC采集数据,找到最大值和最小值的均值作为触发点,然后寻找等值点计算差值A,利用公式Freq = 25 000/(T*|A|)或Freq = 25 000 000/(T*|A|)(T为时间间隔)来获取频率。这种方法在采样点足够的情况下能实现精确计算,频率精度受到时间区间和采样点数的影响。
摘要由CSDN通过智能技术生成


前言

最近在做一个简易示波器项目在计算输入波形的频率时想了很多方案比如傅里叶变换、利用定时器的捕获功能去捕获信号的频率等等,但是看到其他大神做的示波器里面测波形频率的方法是利用触发点去测波形的频率,这种方法非常实用,下面我将为大家介绍一下这种方法。


一、简介

利用stm32单片机的ADC采集外部输入电压信号,并将其采集的数据组成一个数组在数组中找到其最大值和最小值,并求其最大值和最小值的均值将其作为波形的触发值,然后从数组中中间开始寻找与触发值相符的点,然后再从这个点分别向左和向右查找该点的等值点记录其位置,求其差值A,将数组依据时间的顺序分为四等份或者多等份将每一份的真实时间为T利用公式即Freq = 25 000/(T*|A|) Freq = 25 000 000/(T*|A|)(前者T单位为毫秒,后者T的单位为微秒,但是必须是是大于零的整数)可计算出波形的频率

二、代码

1.波长计算部分

代码如下:

/* 获取触发点位置
   Get Trigger Position */
u8 GetTriggerPos(u16 d1, u16 d2, u16 dTrigger, u8 triSlope)  //d1为i值,d2为i+1值
{
   
    /*  上升沿触发
        Trigger on Rising Edge  */
    if (triSlope)
    {
   
        if (d1 <= dTrigger && d2 >= dTrigger)
        {
   
            return 1;
        }
    }

    /*  下降沿触发
        Trigger on Falling Edge */
    else
    {
   
        if (d1 >= dTrigger && d2 <= dTrigger)
        {
   
            return 1;
        }
    }

    return 0;
}
/* 计算波长
   Calculate wave length*/
u8 getWaveLength(u16 triLevel, u8 right_or_left)//trilevel为触发值 right_or_left为查找方向
{
   
    u16 i;
    u8 tri_pre = 255;
    u8 tri_aft = 255;
    u8 triPos_tmp;
    u8 triSlope_tmp;
    u8 triFail = 1;
    /* 查找距离屏幕中心最近的触发点
       Search the trigger poiont closest to the center of chart */
    if (right_or_left) //向右查找临时触发点 / Search right side
    {
   
        for (i = TriPos ; i < N_simple_interval - 2; i++)   //TriPos为触发点位置  N_simple_interval为采样点数
        {
   
            if (GetTriggerPos(*(waveBuf + i), *(waveBuf + i + 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HongHu321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值