0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > 基于STM32F103ZET6的简易示波器设计方案

基于STM32F103ZET6的简易示波器设计方案

来源:
2025-11-26
类别:工业控制
eye 1
文章创建人 拍明芯城

基于STM32F103ZET6的简易示波器设计方案

一、项目背景与需求分析

示波器作为电子工程师必备的测试工具,广泛应用于信号分析、故障诊断和电路调试。传统示波器存在体积大、成本高、功能冗余等问题,难以满足教学实验、电子爱好者等场景的需求。基于STM32F103ZET6的简易示波器通过集成高性能微控制器、高分辨率显示屏和灵活的信号处理模块,实现低成本、便携化的波形采集与显示功能。该方案支持实时波形显示、频率测量、幅度调节和触发控制,适用于低频信号(0-200kHz)的测量与分析,具备较高的性价比和扩展性。

image.png

二、核心元器件选型与功能解析

1. 主控芯片:STM32F103ZET6

型号选择依据
STM32F103ZET6是意法半导体(ST)推出的32位ARM Cortex-M3内核微控制器,具备以下核心优势:

  • 高性能计算能力:主频高达72MHz,支持单周期乘法和硬件除法,可快速处理ADC采样数据和FFT算法。

  • 大容量存储:512KB Flash和64KB SRAM,满足复杂程序存储和实时数据处理需求。

  • 丰富外设接口:集成3个12位ADC(16通道)、12个DMA通道、11个定时器和13个通信接口(如SPI、I2C、USART),支持多任务并行处理。

  • 低功耗设计:支持睡眠、停止和待机模式,适用于电池供电场景。

功能应用

  • 通过ADC模块实现信号采样,采样率可达1MHz(实际受限于DMA传输速度)。

  • 利用定时器输入捕获功能测量信号频率,或通过FFT算法实现频域分析。

  • 通过FSMC接口驱动TFT-LCD显示屏,实现波形实时渲染。

  • 通过SPI接口与按键模块通信,支持用户交互操作(如量程调节、触发设置)。

替代方案
若STM32F103ZET6缺货,可选用国产兼容芯片GD32F103ZET6,其引脚和功能完全兼容,性能提升10%,且成本更低。

2. 显示屏:野火2.8寸TFT-LCD(320×240分辨率)

型号选择依据

  • 高分辨率显示:320×240像素支持清晰波形渲染,避免锯齿效应。

  • FSMC接口驱动:STM32F103ZET6的FSMC(灵活静态存储控制器)可模拟外部存储器时序,直接驱动LCD,无需额外控制器,降低硬件复杂度。

  • 低成本与易用性:相比OLED屏,TFT-LCD成本更低,且支持彩色显示,可扩展为多通道波形分析。

功能应用

  • 实时显示采集的波形数据,支持缩放、平移和触发定位。

  • 通过图形界面显示频率、幅度等测量参数,提升用户体验。

替代方案
若需更高分辨率,可选用4.3寸TFT-LCD(480×272),但需确认FSMC接口兼容性;若需更低功耗,可选用OLED屏,但需额外驱动芯片(如SSD1306)。

3. 信号采集模块:ADC与运放组合

ADC配置
STM32F103ZET6内置3个12位ADC,支持单次、连续、扫描和间断模式。本方案采用ADC1的通道0(PA0)作为主输入,配置为连续转换模式,通过DMA传输数据至内存,减少CPU负载。

运放选择:LMV358
型号选择依据

  • 低功耗与高精度:LMV358是双通道、低功耗运放,供电电压2.7V-5.5V,适合与STM32F103ZET6(3.3V供电)匹配。

  • 高输入阻抗:输入阻抗达10^12Ω,避免信号衰减。

  • 低成本与易采购:单价约¥1.5,拍明芯城等平台可快速获取。

功能应用

  • 对输入信号进行缓冲和放大,匹配ADC输入范围(0-3.3V)。

  • 若需测量小信号(如mV级),可配置为同相放大电路,增益可通过电阻调节。

替代方案
若需更高精度,可选用OPA2350(精度±0.1%,单价¥5);若需更高带宽,可选用AD8065(带宽145MHz,单价¥10)。

4. 按键模块:74HC165级联按键

型号选择依据

  • 并行转串行:74HC165是8位并行输入串行输出芯片,支持多芯片级联,扩展按键数量。

  • 低功耗与高可靠性:工作电压2V-6V,兼容STM32F103ZET6的3.3V系统。

  • 低成本与易扩展:单价约¥0.8,级联后可支持16个按键,满足量程调节、触发设置等需求。

功能应用

  • 通过SPI接口与STM32F103ZET6通信,实时读取按键状态。

  • 按键消抖通过软件滤波实现,避免硬件复杂度。

替代方案
若需更少按键,可直接使用GPIO口连接按键,并通过外部中断(EXTI)检测按键动作;若需矩阵键盘,可选用MAX7219(支持8×8矩阵,单价¥15)。

5. 电源模块:AMS1117-3.3与LDO组合

型号选择依据

  • 低压差稳压器:AMS1117-3.3可将5V输入转换为3.3V输出,输出电流可达1A,满足STM32F103ZET6及外设供电需求。

  • 低噪声与高稳定性:输出电压纹波小于10mV,避免电源噪声干扰ADC采样。

  • 低成本与易采购:单价约¥0.5,拍明芯城等平台可快速获取。

功能应用

  • 为STM32F103ZET6、LCD和运放提供稳定3.3V电源。

  • 若需测量负电压信号,可增加电荷泵芯片(如ICL7660)生成负电压,或选用双电源运放(如OPA2277)。

替代方案
若需更高效率,可选用DC-DC转换器(如LM2596),但需注意开关噪声对ADC的影响;若需更低功耗,可选用LDO(如LP2985,静态电流仅50μA)。

三、硬件电路设计要点

1. 信号采集电路

  • 输入保护:在信号输入端串联10Ω电阻和并联TVS二极管(如P6SMB15CA),防止静电或过压损坏电路。

  • 运放电路:采用同相放大配置,增益G=1+Rf/R1(如Rf=10kΩ,R1=10kΩ,G=2)。输入端加装0.1μF电容滤波,抑制高频噪声。

  • ADC接口:运放输出直接连接STM32F103ZET6的PA0引脚,避免额外缓冲电路。

2. LCD接口电路

  • FSMC配置:将LCD的数据线(D0-D15)连接至STM32F103ZET6的FSMC数据总线(如PD0-PD15),控制线(RS、WR、RD、CS)连接至通用GPIO口(如PE0-PE3)。

  • 背光控制:通过PWM输出(如TIM3_CH1)调节LCD背光亮度,提升用户体验。

3. 按键接口电路

  • 74HC165级联:将多个74HC165的SER引脚串联,CLK和SH/LD引脚共享,数据输出端(QH)连接至STM32F103ZET6的SPI_MISO引脚(如PA6)。

  • SPI时序:配置SPI为时钟极性CPOL=0、相位CPHA=0模式,时钟频率不超过2MHz,确保数据稳定读取。

4. 电源电路

  • 输入滤波:在电源输入端加装100μF电解电容和0.1μF陶瓷电容,抑制低频和高频噪声。

  • 多电压供电:若需多种电压(如5V、3.3V、-5V),可采用LDO组合或DC-DC转换器,并注意电源排序(如先上电3.3V,再上电5V)。

四、软件设计流程与关键代码

1. 系统初始化

void System_Init(void) {
   // 时钟配置:HSE(8MHz)→PLL(72MHz)→SYSCLK
   RCC_HSE_Configuration();
   // GPIO初始化:配置ADC、SPI、LCD控制线等
   GPIO_Init();
   // ADC初始化:连续转换模式,DMA传输
   ADC_Init();
   // DMA初始化:通道1,内存到外设模式
   DMA_Init();
   // 定时器初始化:TIM2用于采样频率控制
   TIM2_Init();
   // LCD初始化:FSMC配置,清屏
   LCD_Init();
   // 按键初始化:SPI配置,74HC165读取
   Key_Init();
}

2. 信号采集与处理

// ADC采样中断服务程序
void ADC1_2_IRQHandler(void) {
   if (ADC_GetITStatus(ADC1, ADC_IT_EOC)) {
       // 读取ADC转换值
       uint16_t adc_value = ADC_GetConversionValue(ADC1);
       // 通过DMA传输至缓冲区
       DMA_ClearFlag(DMA1_FLAG_TC1);
   }
}

// 波形处理:放大、缩小、平移
void Wave_Process(uint16_t *buffer, uint32_t length) {
   for (uint32_t i = 0; i < length; i++) {
       // 放大2倍
       buffer[i] *= 2;
       // 限制在0-320(LCD高度)范围内
       if (buffer[i] > 320) buffer[i] = 320;
   }
}

3. 频率测量方法

方法1:输入捕获

// 定时器3输入捕获初始化
void TIM3_IC_Init(void) {
   TIM_ICInitTypeDef TIM_ICInitStructure;
   // 使能TIM3时钟
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
   // 配置GPIOA6为输入捕获
   GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   // 定时器基础配置
   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
   TIM_TimeBaseStructure.TIM_Prescaler = 71; // 72MHz/(71+1)=1MHz
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
   // 输入捕获配置
   TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
   TIM_ICInitStructure.TIM_ICFilter = 0x0;
   TIM_ICInit(TIM3, &TIM_ICInitStructure);
   // 使能捕获中断
   TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
   // 启动定时器
   TIM_Cmd(TIM3, ENABLE);
}

// 输入捕获中断服务程序
void TIM3_IRQHandler(void) {
   if (TIM_GetITStatus(TIM3, TIM_IT_CC1)) {
       static uint32_t last_capture = 0;
       uint32_t current_capture = TIM_GetCapture1(TIM3);
       if (last_capture != 0) {
           uint32_t period = current_capture - last_capture;
           float frequency = 1000000.0 / period; // 1MHz时钟
           // 更新频率显示
           LCD_ShowFloat(10, 10, frequency, 2);
       }
       last_capture = current_capture;
       TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
   }
}

方法2:FFT算法

// FFT算法实现(基于ARM CMSIS库)
#include "arm_math.h"
#define FFT_SIZE 256

void FFT_Process(uint16_t *input, float32_t *output) {
   float32_t fft_input[FFT_SIZE];
   float32_t fft_output[FFT_SIZE];
   arm_cfft_radix4_instance_f32 S;
   // 数据预处理:转换为浮点并归一化
   for (uint16_t i = 0; i < FFT_SIZE; i++) {
       fft_input[i] = (float32_t)input[i] / 4096.0; // 12位ADC
   }
   // 初始化FFT
   arm_cfft_radix4_init_f32(&S, FFT_SIZE, 0, 1);
   // 执行FFT
   arm_cfft_radix4_f32(&S, fft_input);
   // 计算幅度谱
   arm_cmplx_mag_f32(fft_input, fft_output, FFT_SIZE);
   // 输出主频分量
   uint16_t max_index = 0;
   float32_t max_value = 0;
   for (uint16_t i = 0; i < FFT_SIZE/2; i++) {
       if (fft_output[i] > max_value) {
           max_value = fft_output[i];
           max_index = i;
       }
   }
   float frequency = (float)max_index * (72000000.0 / 72.0) / FFT_SIZE; // 采样率1MHz
   // 更新频率显示
   LCD_ShowFloat(10, 30, frequency, 2);
}

4. LCD显示驱动

// LCD绘制波形
void LCD_DrawWave(uint16_t *buffer, uint32_t length) {
   // 清屏
   LCD_Clear(BLACK);
   // 绘制坐标轴
   LCD_DrawLine(0, 120, 320, 120, WHITE); // X轴
   LCD_DrawLine(160, 0, 160, 240, WHITE); // Y轴
   // 绘制波形
   for (uint32_t i = 1; i < length; i++) {
       uint16_t x1 = i - 1;
       uint16_t y1 = 120 - buffer[i - 1] / 10; // 幅度缩放
       uint16_t x2 = i;
       uint16_t y2 = 120 - buffer[i] / 10;
       LCD_DrawLine(x1, y1, x2, y2, GREEN);
   }
}

五、元器件采购与供应链管理

1. 核心元器件清单

元器件名称型号数量单价(¥)供应商备注
微控制器STM32F103ZET6125.00拍明芯城可选GD32F103ZET6替代
显示屏野火2.8寸TFT-LCD145.00淘宝需确认FSMC接口兼容性
运放LMV35821.50拍明芯城低功耗双运放
按键芯片74HC16520.80拍明芯城级联支持16个按键
稳压器AMS1117-3.310.50拍明芯城低压差LDO
TVS二极管P6SMB15CA10.20拍明芯城输入保护
电阻/电容0603封装若干0.01拍明芯城按BOM清单采购

2. 采购渠道与供应链优化

  • 拍明芯城优势

    • 提供型号查询、品牌筛选、价格对比功能,支持一键下单。

    • 覆盖STM32全系列型号,库存实时更新,避免缺货风险。

    • 提供国产替代方案(如GD32F103ZET6),降低成本30%。

    • 下载PDF数据手册和中文资料,支持引脚图及功能查询。

  • 供应链管理建议

    • 批量采购时联系供应商获取折扣(如100片以上单价降至¥22)。

    • 关注元器件生命周期,避免选用停产型号(如STM32F103C8T6已逐步淘汰)。

    • 采用BOM(物料清单)管理工具,自动匹配供应商库存和价格。

六、测试与优化

1. 功能测试

  • 信号采集测试:输入1kHz方波,验证ADC采样值是否与信号幅度一致。

  • 频率测量测试:输入不同频率信号(100Hz-100kHz),对比输入捕获和FFT算法的测量误差(误差应小于1%)。

  • 显示测试:验证波形是否平滑无断点,缩放功能是否正常。

2. 性能优化

  • 采样率优化:通过调整定时器预分频系数(PSC)和重加载值(ARR),实现最高1MHz采样率。

  • FFT优化:采用ARM CMSIS库中的FFT函数,减少计算时间(256点FFT耗时约1ms)。

  • 低功耗优化:在空闲时进入停止模式,电流消耗降至10μA以下。

七、总结与展望

本方案基于STM32F103ZET6设计了一款低成本、便携式简易示波器,通过优化硬件电路和软件算法,实现了信号采集、频率测量和波形显示功能。核心元器件选型兼顾性能与成本,采购渠道(如拍明芯城)提供了便捷的供应链支持。未来可扩展以下功能:

  • 增加Wi-Fi模块(如ESP8266),实现远程数据传输。

  • 支持多通道信号采集(需增加ADC通道或外接ADC芯片)。

  • 开发上位机软件,实现更复杂的信号分析(如谐波失真分析)。

该方案适用于电子教学、实验室测试和工业现场监测,具有较高的推广价值。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告