文章目录

  • 前言
  • 一、简介
  • 二、代码
    • 1.波长计算部分
    • 2.频率计算部分
  • 总结

前言

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


一、简介

利用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 + 1), triLevel, 1)) //按上升沿查找 / Search on rising edge{triPos_tmp = i;triSlope_tmp = 1;triFail = 0;break;}else if (GetTriggerPos(*(waveBuf + i), *(waveBuf + i + 1), triLevel, 0)) //按下降沿查找 / Search on falling edge{triPos_tmp = i;triSlope_tmp = 0;triFail = 0;break;}}}else //向左查找临时触发点 / Search left side{for (i = TriPos + TriPosOffset; i > 0; i--){if (GetTriggerPos(*(waveBuf + i), *(waveBuf + i + 1), triLevel, 1)) //按上升沿查找 / Search on rising edge{triPos_tmp = i;triSlope_tmp = 1;triFail = 0;break;}else if (GetTriggerPos(*(waveBuf + i), *(waveBuf + i + 1), triLevel, 0)) //按下降沿查找 / Search on falling edge{triPos_tmp = i;triSlope_tmp = 0;triFail = 0;break;}}}if (!triFail){for (i = triPos_tmp; i >= 0; i--) //查询触发位置左侧的等值点 / Search equal point left side{if (triSlope_tmp) //上升触发,查找下降点 / Trigger on rising edge, search on falling edge{if (*(waveBuf + i) >= triLevel && *(waveBuf + i + 1) <= triLevel){tri_pre = i;break;}}else //下降触发,查找上升点 / Trigger on falling edge, search on rising edge{if (*(waveBuf + i) <= triLevel && *(waveBuf + i + 1) >= triLevel){tri_pre = i;break;}}}for (i = triPos_tmp; i < N_simple_interval - 1; i++) //查询触发位置右侧的等值点 / Search equal point right side{if (triSlope_tmp) //上升触发,查找下降点 / Trigger on rising edge, search on falling edge{if (*(waveBuf + i) >= triLevel && *(waveBuf + i + 1) <= triLevel){tri_aft = i;break;}}else //下降触发,查找上升点 / Trigger on falling edge, search on rising edge{if (*(waveBuf + i) <= triLevel && *(waveBuf + i + 1) >= triLevel){tri_aft = i;break;}}}}if (tri_pre == 255 || tri_aft == 255 || (tri_pre == tri_aft)){WaveLength = 0;return 0;}else{WaveLength = tri_aft - tri_pre;return 1;}
}

2.频率计算部分

switch (Freq_N){case 0:                                      //500ms时间区间WaveFreq = (float)50 / WaveLength + 0.5; //WaveFreq=25000/(500*WaveLength);break;case 1:                          //200ms时间区间WaveFreq = 125 / WaveLength; //WaveFreq=25000/(200*WaveLength);break;case 2:                          //100ms时间区间WaveFreq = 250 / WaveLength; //WaveFreq=25000/(100*WaveLength);break;case 3:                          //50ms时间区间WaveFreq = 500 / WaveLength; //WaveFreq=25000/(50*WaveLength);break;case 4:                           //20ms时间区间WaveFreq = 1250 / WaveLength; //WaveFreq=25000/(20*WaveLength);break;case 5:                           //10ms时间区间WaveFreq = 2500 / WaveLength; //WaveFreq=25000/(10*WaveLength);break;case 6:                           //5ms时间区间WaveFreq = 5000 / WaveLength; //WaveFreq=25000/(5*WaveLength);break;case 7:                            //2ms时间区间WaveFreq = 12500 / WaveLength; //WaveFreq=25000/(2*WaveLength);break;case 8:                            //1ms时间区间WaveFreq = 25000 / WaveLength; //WaveFreq=25000/(1*WaveLength);break;case 9:                            //500us时间区间WaveFreq = 50000 / WaveLength; //WaveFreq=25000000/(500*WaveLength);break;case 10:                            //200usWaveFreq = 125000 / WaveLength; //WaveFreq=25000000/(200*WaveLength);break;case 11:                            //100us时间区间WaveFreq = 250000 / WaveLength; //WaveFreq=25000000/(100*WaveLength);break;

总结

以上就是在简易示波器中利用触发点计算波形频率的方法在采样点足够的情况下,可以对频率进行精确的计算,频率受单位时间区间以及采样点数的影响很大。

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

  1. 泰克示波器MDO3014波形频率分析FFT功能使用方法

      一般在用示波器查看波形的时候,都是直接将波形的频率参数显示出来,如果波形的频率变化不大的情况下用这种方式观察起来比较方便.如果波形是变频的,而且频率变化比较快的情况下,直接观看频率就比较麻烦了,要 ...

  2. 简易波形系统(简易示波器部分)

    简易波形系统(简易示波器部分) 具体知识内容: 1.整体框图 2.示波器重要驱动和软件设计 整体框图 一.示波器重要驱动和软件设计 <1>重要驱动设计(PWM) 1.ADC+DMA+TIM ...

  3. php单词出现频率,PHP编程计算文件或数组中单词出现频率的方法

    本文实例讲述了PHP编程计算文件或数组中单词出现频率的方法.分享给大家供大家参考,具体如下: 如果是小文件,可以一次性读入到数组中,使用方便的数组计数函数进行词频统计(假设文件中内容都是空格隔开的单词 ...

  4. rc振荡器振荡频率计算_微控制器中的振荡器频率

    rc振荡器振荡频率计算 微控制器中的振荡器频率 (Oscillator Frequency in Microcontrollers) The digital computer systems must ...

  5. MATLAB Appdesigner实用技巧(三):在App中实现示波器效果/动态波形效果

    1. MATLAB App显示动态波形 IMU901上传上来的数据中包含四元数和加速度,每帧数据包按如下格式向上位机发送: 0.00 0.00 0.00 0.00 0.00 0.00 0.00\r\n ...

  6. Python中MNE库进行PSD分析(计算不同频率区间的累加和)

    使用的代码和数据:https://download.csdn.net/download/zhoudapeng01/12545345 在做脑波数据分析的时候,免不了需要进行频率域的数据分析,功率谱密度是 ...

  7. Tiva单片机——简易示波器(UART串口屏)

    Tiva单片机--简易示波器(UART串口屏) 一.整体介绍 二.代码的分段解读 1.头函数 2.宏定义及变量定义 3.外设初始化 4.波形触发设计 5.电压标定设计 6.频率测定(最高到达1MHz) ...

  8. stm32简易示波器(标准库)

    简介 此项案例是基于正点原子精英板制作的一个简易示波器,可以读取信号的频率和幅值,并可以通过按键改变采样频率和控制屏幕的更新暂停. (输入最大3.3V,由ADC参考电压决定) 将PA6与PA4相连,可 ...

  9. STM32简易示波器

    第一次写博客,也是想分享一下自己的心得体会.本人大三,因为准备比赛的缘故,需要做一个示波器,因为不是想做一个成品,所以只是实现了基本功能,后续的话也不会再用这个,更多的是体会过程.此文章主要是给像我这 ...

最新文章

  1. 实验集锦二 路由器基础信息、查看命令及CDP
  2. php设置cookie值,PHP如何设置和取得Cookie值
  3. 王道考研 计算机网络12 点对点链路 广播式链路 介质访问控制MAC 动态分配信道 ALOHA协议 CSMA CSMA/CD CSMA/CA协议
  4. Go 每日一库之 zap
  5. css属性前浏览器厂商前缀
  6. 打开旧Flutter项目说:Your Flutter application is created using an older version of the Android embedding
  7. Thrift的安装和简单示例
  8. 数组之间的比较应当用Arrays.equals()
  9. paip.提升用户体验----- 密码控件的使用
  10. 最新java学习资料汇总(学习路线+视频教程+网盘下载)
  11. stm32 代码加密
  12. win7计算机共享设置密码,如何为Win7旗舰系统的共享文件夹设置密码
  13. Python len()函数讲解
  14. LostDungeon迷失地牢-壹
  15. #1992. 购票(ticket)
  16. python从右向左第三个字符_字符串是一个字符序列,例如,字符串s,从右侧向左第3个字符用什么索引?_学小易找答案...
  17. 物联网基础知识:IMSI号介绍与解析
  18. 从首个IMO季军谈起 作者 : 付云皓
  19. 前端(JS)windows命令行生成树目录结构和结构图
  20. 个人收款码不得用于经营收款

热门文章

  1. 快速解决office安装时的1406错误
  2. 基于S型曲线的连续多段曲线插补平滑过渡的规划算法(Matlab)
  3. spring cloud 配置文件application.yml和bootstrap.yml 的定位,区别和联系
  4. Arduino Nano做NB-IoT透传项目
  5. 基于javaweb的药品进货销售管理系统(java+ssm+html+js+jsp+mysql)
  6. hy3208中文参数_HY-MOSFET-产品目录表
  7. linux账号权限的一些总结
  8. 电影分区发行 移动端电影院创造中国电影市场新增量
  9. 解决win10 64位系统可用2.99g
  10. H5开发在QQ钱包的应用实践