单片机设计系列2——ESP32进阶之正弦信号峰峰值测量

项目介绍

本项目为正弦信号峰峰值测量系统,目的是为了测量微小正弦信号的准确峰峰值(误差要求不超过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 两个分压电阻,为输入信号提供$3.3 \mathrm{~V} \times \mathrm{R}_6 /\left(\mathrm{R}_5+\mathrm{R}_6\right)=0.50 \mathrm{~V}$的直流偏置电压。四个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电路设计

装配系统实物图

测试功能评分表


整体论文到此结束,本项目的具体实现代码可以私信作者交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值