2020年暑期我们发起了一个基于LPC824微控制器的简易示波器的编程活动,引起了热烈的反响,先后有600多人参加,并有120多位网友参加了我们组织的为期10天的直播培训。尤其是Jack网友,在Github上开源了他的代码,包括移植的FFT功能,通过他的演示视频可以看出,在LPC824微控制器上能够非常流畅地实现简易示波器的数据采集、显示功能以及FFT频谱变换和分析的功能。
基于LPC824的简易示波器套件构成框图
基于LPC824的简易示波器DIY套件的实物图
应广大网友的要求,我们在第一个版本的基础上做了简单的升级,并增加了一款基于ST的STM32G031的MCU核心模块,在模块上引出了6个通道的模拟输入,跟原来的LPC824模块管脚兼容,但STM32G031核心模块多了4个数字IO管脚(在本简易示波器的扩展底板上为附加的功能),其性能也有增强:
- 同样是Cortex M0+内核,其主频工作到了64MHz,比起LPC824提升了一倍;
- 12位的ADC可以工作在2Msps,具有更高的采样率,因此支持的模拟信号带宽也可以提升一倍;
- STM32G031内部的定时器可以工作在128MHz,可以输出更高频率的PWM信号,通过DDS+PWM的方式能够产生的任意波形输出的频率也就可以更高。
除了新的核心处理模块性能增强之外,本套件的主板也做了简单的升级(参见下面的PCB图):
- 板上的Mic电路在送到ADC之前增加了一级运放跟随器,使得其送往ADC端口的模拟信号直流偏移为STM32G031供电电压的中间位置,也就是3.3V/2 = 1.65V,且不再受MCU的ADC输入阻抗的影响,这样在ADC量化的时候音频电路的模拟信号范围可以围绕1.65V为中心上下摆动,量化后的数字量也可以围绕2047上下摆动;
- 对外的连接改为4个管脚的插针,除了3.3V、GND(可以为外扩的电路板提供电压)、Ain外部模拟信号输入(0-3.3V)之外,又增加了一个Aux管脚,它通过一个RC网络连接到核心模块的一个输出管脚,可以通过PWM产生任意波形的信号,RC作为滤波器,从而在Aux上得到模拟信号波形,如果去掉C、R=0ohm,则Aux就可以作为通用的数字IO使用,当Aux作为输出测试信号使用的时候,用跳线帽连接Ain/Aux可以进行闭环测试、开发;
- 在对应于核心板模块的Pin6、7、8、9、10、11包围的区域没有敷铜和走线,这是为了支持有无线功能的BLE或未来的WiFi模块,如果将无线模块直接焊接在底板上,挖空的区域不会影响到这些无线模块的性能。
MiniScope V2.0 PCB板图
基本功能特性:
-
核心控制器 - DIP16封装/邮票孔 + 4 GPIO的STM32G031控制器模块
-
ST的STM32G031控制器
-
Arm Cortex M0+内核
-
64MHz主频
-
内置1个12位/2Msps的ADC,在模块上有6个IO可以通过内部的开关切换共享该ADC,因此可以支持6通道模拟信号的输入
-
-
核心模块上使用CH340E实现USB-UART的连接,用以STM32G031的程序更新,具体的操作方法参见STM32G031控制器模块的项目页面;
-
扩展板上的输出显示 - 采用128*64分辨率/0.96英寸的OLED显示屏,通过SPI总线控制;
-
扩展板上的输入控制 - 有5个按键,用户可以参照底板的原理图自己定义每个按键的功能;
-
两路模拟量输入:
-
1路直接连接外部模拟信号,输入信号的幅度范围为0-3.3V,频率建议控制在200KHz(根据奈奎斯特定律可以支持到1MHz)以便取得好的波形显示效果,在采样率为2Msps的时候一个周期里可以有10个采样点,在屏幕上显示起来会比较好看;
-
1路通过板上的麦克风及音频放大/滤波电路将外部声音信号转变为电信号,经过10x的放大以及带通滤波器以后,进行直流偏移,送到ADC的输入端口,由于ADC的输入内阻在30K欧姆左右,在第一个版本的主板上,没有加入运放缓冲级,虽然通过电阻分压的方式将送到ADC输入端的模拟信号做了直流偏移,但由于ADC内阻的存在,输入端信号的直流偏移高于1.65V,采集以后可以通过内部的软件进行补偿,在本版本中添加了运放缓冲,送到ADC输入端的信号的直流偏移就会正好在3.3V/2的位置。当然由于分压电阻本身有5%的精度误差,所谓的3.3V/2也不是正好在正中间,这可以通过软件针对量化后的数据进行补偿;
-
- 一路Aux,功能可以根据需要灵活使用 - 缺省配置为模拟信号输出(板上有一个1Kohm的电阻和10nF的电容构成的低通滤波器,截止频率为1.6KHz),改变RC的值可以调节LPF的截止频率,去掉C,将R安装为0欧姆电阻,则为直接连接,可以用于数字信号输出或数字信号输入,用于信号产生、外部控制或状态监测。
基于STM32G031或LPC824最小系统模块的简易示波器DIY 3D效果图
微控制器的最小系统模块可以使用双排插座跟底板连接,便于更换不同控制器,核心控制模块还可以用在其它场景
由于主板硬件的兼容性、核心模块的管脚兼容性,以及LPC824/STM32G031内部功能的相似性 - 都是Arm Cortex M0+的内核、都使用串行ADC做数据采集,如果要用STM32G031实现简易示波器的功能,完全可以参考LPC824实现的功能、思路乃至代码。
下面给出基于LPC824的第一个版本的简易示波器的项目参考:
基于LPC824的直播课程/技术专栏
网友基于LPC824做的模拟示波器的实现效果展示
为帮助大家更多地了解简易示波器的硬件构成,下面两个类似的产品可以参考一下,通过自己编程以及简单的硬件搭配,你也可以自己做一个类似的产品。
参考竞品资料:
参考技术资料:
关于总线:
关于用PWM生成任意波形:
关于示波器功能的参考:
下面几篇关于在Arduino实现FFT功能的文章,虽然是基于8位的单片机Arduino实现的,但很容易移植,用在性能更加强大的32位微控制器STM32G031上应该更轻松实现
- 什么是傅立叶变换?
- 关于快速傅立叶变换的介绍
- ApproxFFT: 在Arduino上实现快速FFT功能
- QuickFFT: High Speed (low accuracy) FFT for Arduino
- EasyFFT: Fast Fourier Transform (FFT) for Arduino
- DIY FFT Audio Spectrum Analyzer
还有在NXP的LPC55S69上实现的文章: