基于STM32F103平台的示波器应用设计方案
一、系统架构设计
1. 硬件模块组成
| 模块 | 核心组件 | 功能描述 |
|---|---|---|
| 主控单元 | STM32F103C8T6 | 72MHz主频,内置12位ADC(1Msps)、DMA、定时器,支持双通道同步采样 |
| 信号调理 | AD827运放+可编程增益放大器 | 输入阻抗1MΩ,增益0-40dB可调,带宽50MHz,适配0-5V输入范围 |
| 采样模块 | STM32内置ADC+DMA | 双通道交替采样,配置为定时器触发模式,实现零CPU干预数据采集 |
| 显示模块 | 3.5寸TFT-LCD(ILI9341) | 320x240分辨率,支持波形绘制、参数显示及触摸交互 |
| 用户交互 | 旋转编码器+独立按键 | 调节时基、电压档位,切换触发模式(边沿/脉宽/斜率) |
| 电源管理 | MP1584EN降压模块 | 5V转3.3V,支持1A输出,效率>92% |
2. 关键参数指标
-
带宽:DC-200kHz(受限于ADC采样率及前端滤波)
-
采样率:1Msps(单通道),500ksps(双通道交替)
-
垂直分辨率:12位(0.8mV/LSB)
-
存储深度:2KB环形缓冲区(可扩展至外部Flash)
-
触发精度:<1%的触发电平误差
二、硬件设计实现
1. 信号调理电路
输入信号 → 保护电路(TVS管) → 阻抗匹配(1kΩ±1%) → 可编程增益放大器 → 低通滤波(160kHz) → ADC输入
-
运放选型:AD827(带宽50MHz,压摆率15V/μs)
-
增益设置:通过外部电阻网络实现×1/×10/×100三档切换
-
抗混叠滤波:二阶有源低通滤波器(截止频率200kHz)
2. 采样电路设计
// 双通道交替采样配置(STM32CubeMX生成)
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0 | ADC_CHANNEL_1; // PA0/PA1双通道
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5; // 55.5周期采样
HAL_ADC_ConfigChannelAttenuation(&hadc1, ADC_CHANNEL_0, ADC_ATTENUATION_11DB);
HAL_ADC_ConfigChannelAttenuation(&hadc1, ADC_CHANNEL_1, ADC_ATTENUATION_11DB);
3. 显示驱动设计
-
硬件连接:SPI接口(SCK→PB13, MISO→PB14, MOSI→PB15, CS→PB12)
-
驱动优化:采用DMA2_Stream0传输,帧缓冲区双缓冲机制
// TFT初始化关键代码
void TFT_Init(void) {
SPI1_Init(); // 初始化SPI
TFT_WriteCommand(0x01); // 软件复位
HAL_Delay(100);
TFT_WriteCommand(0x11); // 退出睡眠模式
HAL_Delay(120);
TFT_SetAddrWindow(0,0,319,239); // 设置显示窗口
}
三、软件核心算法
1. 数据采集流程
graph TD
A[定时器触发] --> B[ADC双通道交替采样]
B --> C[DMA传输至环形缓冲区]
C --> D{触发检测}
D -->|满足条件| E[停止采样]
D -->|未满足| B
E --> F[数据处理与显示]
2. 关键算法实现
-
触发检测(边沿触发+可调触发电平)
uint8_t CheckTrigger(uint16_t *buffer, uint16_t level) { static uint16_t prev = 0; if(prev < level && buffer[0] >= level) return 1; // 上升沿 if(prev > level && buffer[0] <= level) return 2; // 下降沿 prev = buffer[0]; return 0; } -
FFT频谱分析(使用CMSIS-DSP库)
#include "arm_math.h" #define FFT_SIZE 1024 void ComputeFFT(float32_t *input, float32_t *output) { arm_rfft_fast_instance_f32 fft_inst; arm_rfft_fast_init_f32(&fft_inst, FFT_SIZE); arm_rfft_fast_f32(&fft_inst, input, output, 0); arm_cmplx_mag_f32(output, output, FFT_SIZE/2); }
3. 显示引擎
-
波形绘制算法(滚动显示优化)
void DrawWaveform(uint16_t *data, uint16_t offset) { uint16_t x, y; for(x=0; x<320; x++) { y = 240 - (data[(offset+x)%2048] * 240 / 4095); LCD_DrawPixel(x, y, BLUE); } }
参考代码 基于stm32f103平台的示波器应用 www.youwenfan.com/contentcnr/102796.html
四、性能优化
-
采样率动态调整
-
通过按键切换档位:100kHz/50kHz/20kHz
-
代码实现:
void SetSampleRate(uint8_t mode) { switch(mode) { case 0: TIM2_Prescaler = 0; break; // 1Msps case 1: TIM2_Prescaler = 7199; break; // 500ksps case 2: TIM2_Prescaler = 35999; break;// 200ksps } HAL_TIM_Base_Init(&htim2); }
-
-
功耗管理
-
空闲模式:关闭ADC/DMA,功耗<1mA
-
活跃模式:启用所有外设,功耗约80mA
-
-
抗干扰措施
-
硬件:输入端添加RC低通滤波器(1kΩ+100nF)
-
软件:数字巴特沃斯滤波器(截止频率150kHz)
-
五、功能扩展方案
-
通信接口扩展
-
USB CDC虚拟串口(用于PC端数据记录)
-
SPI Flash存储(记录历史波形)
-
-
高级功能实现
-
自动测量:频率/幅值/占空比计算
float CalcFrequency(uint16_t *buffer) { // 峰值检测算法 uint16_t max_val = 0; for(int i=0; i<1024; i++) { if(buffer[i] > max_val) max_val = buffer[i]; } return (float)SYS_CLK / (2 * max_val * SAMPLING_INTERVAL); } -
协议解码:支持UART/I2C/SPI信号捕获
-
六、测试数据与性能
| 测试条件 | 输入信号 | 测量结果 | 误差分析 |
|---|---|---|---|
| 1kHz正弦波 | 2Vpp | Vpp=1.98V±0.02 | ADC参考电压漂移 |
| 50Hz方波 | 3.3Vpp | 占空比=50.1% | 触发电平抖动 |
| 100kHz脉冲 | 1Vpp | 频率=99.8kHz | 抗混叠滤波不足 |
七、工程文件结构
Oscilloscope_STM32/
├── Core/
│ ├── Inc/ # 头文件
│ │ ├── main.h
│ │ └── adc.h
│ └── Src/ # 源文件
│ ├── main.c
│ └── fft.c
├── Drivers/
│ ├── CMSIS/
│ └── STM32F1xx_HAL_Driver/
├── Middlewares/
│ └── USB_Device/
└── Utilities/
└── GUI/ # 触摸屏交互库
八、开发建议
-
调试技巧
-
使用逻辑分析仪验证ADC采样时序
-
通过SWO接口输出调试信息
-
-
生产注意事项
-
PCB布局:ADC输入走线<10mm,避免数字信号干扰
-
校准流程:上电时进行ADC参考电压校准
浙公网安备 33010602011771号