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