项目介绍
本项目为正弦信号峰峰值测量系统,目的是为了测量微小正弦信号的准确峰峰值(误差要求不超过1%),使用了ESP32作为核心单片机,整个系统还包括前级小信号放大电路。
摘要
本设计通过对ESP32单片机的学习和应用,制作了一个正弦信号峰峰值测量系统,旨在精确测量小信号的最大峰峰值。系统核心是基于ESP32单片机的电路设计,配合模拟电路用于信号的直流偏置、放大和滤波,确保测量的准确性和高效性。设计过程中,首先分析了信号的特性和测量需求,把系统设计分为两个部分:前级电路与单片机处理版块。采用LM324运放与微小电容、大电阻作为前级电路主要结构的方案,来实现信号的合理直流偏置以及放大,采用ESP32单片机的引脚ADC作为模拟-数字信号转化模块。
此外,设计了软件算法来从数字化的数据中提取峰峰值信息。系统通过反复测试,结果表明,该测量系统能够在极宽的频率范围和不同幅值的输入信号下,保持较高的测量精度和稳定性。
关键词:正弦信号,峰峰值测量,ESP32,模拟-数字转换,信号处理
设计目标与测试要求
1.1设计目标
设计一个可以检测函数发生器产生的峰峰值在0.1V-0.2V的正弦信号的系统,包含两个部分:前级放大电路部分以及单片机信号处理部分。要求通过OLED显示屏打印出函数发生器产生的信号的实时峰峰值,显示值保留四位小数。
1.2测试要求
①前级放大电路:系统需要把小正弦信号进行放大,并添加合适的直流偏置,波形不失真,要求只能使用单电源。
②高精度测量:系统必须能够精确测量微小幅值(0.1V-0.2V)的正弦信号的峰峰值,并以0.01V为步进,误差范围控制在±1%以内。
③宽频率响应:系统应该能够处理从10 kHz到100 kHz的输入信号,不影响测量精度。
④OLED界面实时显示:单片机能实时将检测的峰峰值的数值打印在OLED上。
⑤指定器件:系统应使用LM324运放作为放大电路的运算放大器。
正弦信号峰峰值检测系统的组成
2.1 正弦信号调整电路部分
由于单片机采用了ESP32作为处理器,其ADC的输入范围为0-1.1V,因此计算得到合理的直流偏置值为0.5V,合理的电压放大倍数为5倍。前级采用了 R5、R6 两个分压电阻,为输入信号提供的直流偏置电压。四个LM324运放组成放大电路(同相放大器),使最终的正弦小信号被放大到原来的5倍。此外,电路还采用了若干合适的滤波电容对信号进行滤波处理,使电路的放大波形更加稳定平滑。
2.2 单片机处理模块部分
将前级的放大电路输出连接到ESP32的G34(ADC6),ESP32的ADC共有18 个通道。采样率理论不超过 2 MHz,但为提升实际使用效果,使用了更小的采样率,能达到每秒 1000次,ADC内部有效位数为12位。
2.3 整体结构部分
整体电路板、整体结构流程图
硬件与电路设计
3.1 物料选型
ESP-WROOM-32开发板 LM324N运放 0.96寸OLED显示屏
BNC转SMA射频线 电阻、电容若干 排针、排母若干 SMA母座
3.2 硬件电路设计
用选择好的物料型号来设计嘉立创电路元件原理图,并进行PCB板的线路连接,原理图见附录图8所示,系统装配完整图见附录图9所示。
3.3频率响应曲线
频率响应曲线图
软件设计
4.1理论分析
4.2 程序设计
4.2.1 输出平均值滤波消抖函数的设计
为了输出值的稳定,需要对得到的数值进行滤波消抖处理,即采用平均值滤波来减少高位数值的抖动,取当前的采样值和过去的六个采样值做平均,从而使输出值的偏差更小,读数更准确。
代码实现过程:
4.2.2 ESP32驱动OLED程序代码
我们选择使用ESP32上的“ESP32 and ESP8266 OLED driver for SSD1306 displays”库中的示例程序“SSD1306SimpleDemo”作为参考指导。
#include "SSD1306Wire.h" // 使用 SSD1306Wire 驱动 OLED
...
// OLED 显示配置
#define OLED_I2C_ADDR 0x3C // OLED I2C 地址
#define SDA_PIN 16 // SDA 引脚
#define SCL_PIN 17 // SCL 引脚
SSD1306Wire display(OLED_I2C_ADDR, SDA_PIN, SCL_PIN); // 创建 OLED 显示对象
void setup() {
...
// 初始化 OLED
display.init();
display.clear();
display.setFont(ArialMT_Plain_16); // 设置字体
display.setTextAlignment(TEXT_ALIGN_LEFT); // 左对齐文本
}
void loop() {
...
// 在 OLED 上显示
display.clear();
display.drawString(0, 16, String("Vpp: ") + String(vppStr));
// display.drawString(0, 32, String("Avg Vpp: ") + String(vppAvgStr));
display.display();
delay(500); // 延时0.5秒
}
4.2.3 AD转换程序代码
我们直接使用ESP32自带的ADC进行电压检测,无需使用其他库。
const int ADC_PIN = 27; // ADC输入引脚
const int SAMPLES = 1000; // 每次采样点数(覆盖多个周期)
const int BUFFER_SIZE = 20; // 平均值滑动窗口大小(0.5 秒内采集20次)
...
void loop() {
int sum = 0; // 总和
int maxValue = INT_MIN; // 初始化最大值
int minValue = INT_MAX; // 初始化最小值
// 采样信号
for (int i = 0; i < SAMPLES; i++) {
int value = analogRead(ADC_PIN);
sum += value;
if (value > maxValue) maxValue = value;
if (value < minValue) minValue = value;
}
// 计算直流偏置(平均值)
float dcOffset = (float)sum / SAMPLES / 4095.0 * 1.01;
// 计算峰峰值
float maxVoltage = (float)maxValue / 4095.0 * 1.01;
float minVoltage = (float)minValue / 4095.0 * 1.01;
float Vpp = (maxVoltage - 0.485) / 2.5;
// 更新滑动窗口平均值
totalVpp -= vppValues[bufferIndex]; // 移除旧值
vppValues[bufferIndex] = Vpp; // 添加新值
totalVpp += Vpp; // 更新总和
bufferIndex = (bufferIndex + 1) % BUFFER_SIZE;
if (sampleCount < BUFFER_SIZE) sampleCount++;
float vppAvg = totalVpp / sampleCount;
// 格式化显示值
char vppStr[10];
char vppAvgStr[10];
formatVpp(Vpp, vppStr); // 使用自定义格式化函数
formatVpp(vppAvg, vppAvgStr);
...
}
*4.2.4 网页设计程序代码(拓展)
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
// WiFi 配置
const char* ssid = "abcde"; // WiFi SSID
const char* password = "12345678"; // WiFi 密码
此处不再加以展示,在上一期的ESP32设计中有提到过,可以利用ESP32来创建网络服务器,可以来丰富这个项目的功能,比如在网页上显示我们测得的峰峰值(VPP)
总结
经过三个礼拜的实践训练。我学习到了ESP32单片机的工作原理,和一些外设硬件的使用原理和驱动方式,尤其是ADC模块的使用和拓展。成功按照要求实现了正弦信号峰峰值测量系统,经过测试,设计的系统具有精准的信号调整放大、峰峰值测量读数的功能。
在学习探索和设计修改的过程中,我遇到并克服了许多的困难。比如,在单片机的选型和硬件电路的设计上,我进行了反复的思考。是选用STM32来做处理器还是使用ESP32,它们的ADC精度、输入电压宽度决定着我们制作的系统的精准度,并影响着前级电路设计时的直流偏置设置以及放大倍数调整。STM32的ADC输入范围为0-3.3V,而ESP32的输入范围只有0-1.1V。在综合考虑之下,我选择了使用ESP32进行制作。我在设计过程中又发现,由于单电源的要求,在放大倍数过大时,放大后的波形会出现失真现象,会严重导致峰峰值读取的不准确,我们因此对前置放大电路进行了多次的调整。此外,受到通频带宽度的影响,在输入的频率超过80kHz时,读取到的峰峰值开始出现严重的偏差,我们对通频带上的点进行采样分析,用数学方式计算出了合适的拟合函数,来进行对应的数值调整,并用代码加以实现,最终,控制了输出值的误差能够完美的小于1%,实现了题目的要求。
在调试和设计峰峰值测量系统时,要同时考虑到硬件电路和软件编程两个方面的问题,从多角度细心的排查问题,尝试和其他的作品进行对比,寻找出问题所在。
完成本项目需要掌握的技能:
电路板的设计、焊接以及报告撰写,还有各种硬件如贴片电阻、电容、排针的焊接,PCB上SMA母座与转接线的连接等等,以及硬件放大电路部分的调整与测试,在调试过程中要避免因偏置电压、放大倍数而引起的波形失真和数值误差,需要经过反复的调整,既要保证信号的输入带宽够大,又要保证波形的正确,需要在设计PCB时综合考虑。
物料的选择以及方案的审查,考虑各种因素会带来的误差,并进行结果误差的调整,通过采样计算的方式获得相应的拟合函数,以数学方式获得准确无偏差的数值,达到目标要求,以数学方案规避硬件缺陷导致的误差。
附录
测试实物图
EDA电路设计
装配系统实物图
测试功能评分表
整体论文到此结束,本项目的具体实现代码可以私信作者交流