最近入手了正点原子家的DS100示波器,因此想着自己用ESP32做一个简单的示波器玩玩,顺便测试一下ESP32的性能。
电路设计
ESP32有很多ADC通道,但是为了简单起见,这里只实现一个单通道的示波器,实际上如果只是玩玩的话至少还是双通道才够用,这个可能等后续有时间再添加吧。
设计很简单,首先是给待测元件加一个限流电阻(视情况,小电压不加)。由于ESP32的ADC在0~0.1V和3.1~3.3V之间是没有办法给出ADC值的,因此如果没有直流偏置就没有办法测出小电压时的情况。为了解决这个问题,这里采用了一个简单的分压电路用于给待测元件一个0.3V左右的参考电平。
功能设计
这个示波器应该有如下几个基本功能:
- 以一个较为稳定的频率进行采样
- 具有触发功能,能够在较低频率的条件下实现上升沿/下降沿触发
- 记录到波形后将数据实时传输到电脑
针对上述需求,为了简单起见,这里采用Arduino IDE进行快速开发,同时做如下设计。
- 采用时钟中断进行采样处理,频率可调
- 设定上升沿/下降沿时才记录数据
- 记录好数据后通过串口传输到电脑
代码示例
1 |
|
问题和改进
这个简易示波器还是存在很多问题的,这里列举一些以及可能的解决方案。
- 目前采用直流分压电路进行直流偏置,而这样带来的问题就是精度下降。如果采用运放电路来实现直流偏置可能会好一些,但最好的办法还是实现隔离地,然后就可以为所欲为了。可惜ESP32的ADC本身似乎做不到隔离。
- 这里的时钟中断和串口输出应该是在同一个核上做的(待证实),串口输出是个很费时间得过程,因此需要让二者异步进行。这可以通过
xTaskCreatePinnedToCore
函数将串口输出放在另一个核上来实现。顺带一提,ESP32在Arduino上进行开发时,函数默认在Core 1上运行,Core 0应该是空闲的。 - ADC的电压需要校准,这个在代码中有所体现,可以通过打表来进行校准。
总结和展望
这次的小示波器还是很有意思的。这种东西要做的简单可以非常简单,但想做好就难得多了。这里也是想着不能浪费ESP32这么一个强大的处理器,虽然不是专业做这种事情的,但是自己做一个还是可以接受的,看看音频波形什么的应该还是绰绰有余。
有了小示波器之后能做的就多起来了,比如加上双通道功能然后增加XY模式,可以做一个扫描电视,虽然可能会非常慢。或者可以听听从示波器采集到的音频信号转成的wav文件,看看是不是变成了全损音质。当然也可以做一下信号协议分析,看看很多传输协议的物理层是如何实现的等等。
不过我这老挖坑大师了,看什么时候能做出来吧。