基于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

四、性能优化

  1. 采样率动态调整

    • 通过按键切换档位: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);
      }
      
  2. 功耗管理

    • 空闲模式:关闭ADC/DMA,功耗<1mA

    • 活跃模式:启用所有外设,功耗约80mA

  3. 抗干扰措施

    • 硬件:输入端添加RC低通滤波器(1kΩ+100nF)

    • 软件:数字巴特沃斯滤波器(截止频率150kHz)


五、功能扩展方案

  1. 通信接口扩展

    • USB CDC虚拟串口(用于PC端数据记录)

    • SPI Flash存储(记录历史波形)

  2. 高级功能实现

    • 自动测量:频率/幅值/占空比计算

      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/               # 触摸屏交互库

八、开发建议

  1. 调试技巧

    • 使用逻辑分析仪验证ADC采样时序

    • 通过SWO接口输出调试信息

  2. 生产注意事项

  • PCB布局:ADC输入走线<10mm,避免数字信号干扰

  • 校准流程:上电时进行ADC参考电压校准

posted @ 2026-02-25 17:32  小前端攻城狮  阅读(0)  评论(0)    收藏  举报