1. 项目概述基于STM32F103系列微控制器构建的简易数字示波器是一个面向嵌入式系统学习与基础信号分析场景的硬件实践项目。该系统不依赖外部仪器仅通过单片机内部外设资源——ADC、定时器、DMA、DAC、LCD及按键模块——即完成信号采集、处理、显示与激励输出的完整闭环。其核心目标并非替代专业示波器而在于以工程可实现的方式直观呈现数字采样、时序控制、频域分析与人机交互等关键嵌入式技术环节。项目采用正点原子精英开发板作为硬件载体主控为STM32F103ZET6具备72MHz主频、512KB Flash与64KB RAM资源足以支撑本项目全部功能。系统设计遵循“功能明确、路径清晰、资源复用”的原则ADC负责模拟信号数字化定时器提供精确、可调的采样时钟源DMA实现零CPU干预的数据搬运FFT算法完成频谱分析DAC生成标准测试波形LCD完成图形化波形与参数显示按键则提供最直接的人机控制接口。整个系统无外部ADC芯片、无专用FFT协处理器、无高速存储器所有运算均在MCU内完成体现了嵌入式系统在资源约束下的典型设计哲学。1.1 设计定位与工程边界本项目明确定位于“教学验证型”设备其技术指标与商用示波器存在本质差异。最大有效采样率受限于ADC转换时间、DMA传输带宽及系统总线负载实测稳定工作上限约为3.6kHz对应奈奎斯特频率1.8kHz适用于音频频段及低速数字信号观测。1024点采样深度与12位ADC分辨率决定了其垂直精度与水平分辨率处于入门级水平。这些限制并非设计缺陷而是对MCU资源边界的诚实反映。理解并接受这些边界是掌握嵌入式系统设计的第一课——所有功能都必须在确定的时序、内存与计算能力框架内求解。2. 硬件架构与信号流设计系统硬件架构围绕一个清晰的信号流展开激励源 → 信号调理本项目省略→ ADC采样 → DMA搬运 → CPU处理 → LCD显示同时辅以DAC激励源用于自检。整个流程中定时器是贯穿始终的时序中枢其配置直接决定了系统的核心性能参数。2.1 核心信号链路信号输入通道使用STM32F103的ADC1配置为单通道、规则组、非连续转换模式。输入引脚为PA6ADC1_IN6直接连接待测信号。由于未配置前端运放或衰减网络输入电压范围被严格限定在0~3.3V超出此范围将导致ADC饱和或损坏。采样时钟源采用TIM2的CH2PA1输出PWM波形利用其上升沿触发ADC转换。此设计规避了软件延时或中断服务程序ISR执行时间抖动带来的采样间隔不均问题确保了采样时钟的周期性与稳定性。TIM2工作于PWM模式其溢出频率f_TIM2 SYSCLK / ((PSC 1) * (ARR 1))即为系统采样率fs。数据搬运通道ADC转换结果寄存器DR通过DMA1_Channel1自动搬运至预分配的RAM数组adcx[1024]。DMA配置为循环模式Circular Mode确保在1024个数据填满后自动从头开始覆盖为连续波形显示提供数据流保障。显示输出采用开发板标配的160x80像素单色LCD模块。波形显示采用“点阵连线”方式将1024个采样点按比例映射到LCD的X轴0~159Y轴则根据ADC值0~4095线性映射到屏幕高度50~130像素形成直观的电压-时间曲线。激励信号源系统内置双路DAC输出分别用于生成正弦波DAC1_CH1, PA4与噪声/三角波DAC2_CH2, PA5。DAC1由TIM3更新事件触发实现软件可控的正弦波频率DAC2则由TIM4更新事件触发并利用STM32内部硬件波形发生器Noise/Triangle Generator直接产生相应波形无需CPU参与波形点计算。2.2 关键电路设计考量ADC参考电压使用芯片内部VREFINT约1.2V或外部VDDA3.3V作为ADC参考。项目代码中未显式配置故默认采用VDDA3.3V此时ADC量化步长为3.3V / 4096 ≈ 0.8mV/LSB。若需更高精度应外接低温漂基准源并配置ADC_DataAlign_Right对齐方式。DAC输出缓冲DAC1初始化时关闭了输出缓冲器DAC_OutputBuffer_Disable此举虽可提高建立速度但会显著增加输出阻抗典型值1MΩ使其极易受后级电路如探头电容影响。实际应用中若驱动能力不足应启用缓冲器并注意其压摆率限制。GPIO模式配置所有模拟输入引脚PA4, PA5, PA6均配置为GPIO_Mode_AIN这是ADC正常工作的必要条件。任何其他模式如浮空输入都将导致ADC采样值不可靠。PA1TIM2_CH2配置为复用推挽输出GPIO_Mode_AF_PP以保证PWM信号的驱动强度与边沿陡度。3. 软件系统设计与实现软件系统是硬件功能的逻辑映射其结构围绕“实时性”与“确定性”展开。所有关键操作均通过硬件外设中断触发避免轮询带来的时序不确定性。3.1 ADC与定时器协同采样机制ADC采样并非由软件启动而是完全由TIM2的PWM上升沿硬件触发。这一设计是系统时序稳定性的基石。其配置要点如下ADC触发源ADC_ExternalTrigConv_T2_CC2指定TIM2的捕获/比较2通道CC2事件为触发源。TIM2 PWM配置工作于TIM_OCMode_PWM1模式TIM_OCPolarity_Low设置输出极性。关键参数TIM_Pulse比较值被设为1000这意味着在每个计数周期内当计数器值等于1000时输出电平翻转。由于触发仅发生在上升沿因此TIM_Pulse的绝对值不影响采样率仅影响PWM占空比。采样率fs仅由TIM_PeriodARR与TIM_PrescalerPSC决定fs 72MHz / ((PSC 1) * (ARR 1))。ADC采样时间配置为ADC_SampleTime_1Cycles51.5个ADC时钟周期这是在保证精度前提下选择的最短采样时间有助于提升最大可能采样率。// ADC初始化关键片段 ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_T2_CC2; ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel 1; ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_1Cycles5);3.2 DMA数据搬运与中断处理DMA是实现高效率数据采集的核心。其配置需精准匹配ADC与内存需求传输方向DMA_DIR_PeripheralSRC数据从外设ADC DR寄存器流向内存。地址递增外设地址DMA_PeripheralInc_DisableDR寄存器地址固定内存地址DMA_MemoryInc_Enable数组索引递增。数据宽度DMA_PeripheralDataSize_HalfWord与DMA_MemoryDataSize_HalfWord因ADC12位结果右对齐存于16位寄存器中故按半字16位传输。工作模式DMA_Mode_Circular使DMA在填满1024个元素后自动重置指针形成数据环为连续显示提供基础。中断触发使能DMA_IT_TC1传输完成中断在1024个数据搬运完毕后通知CPU进行后续处理FFT、显示、参数计算。// DMA初始化关键片段 DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode DMA_Mode_Circular; DMA_ITConfig(DMA1_Channel1, DMA_IT_TC1, ENABLE);3.3 FFT频谱分析实现频率测量是本项目的技术难点其解决方案是调用STM32标准外设库SPL中提供的定点FFT函数cr4_fft_1024_stm32。该函数要求输入为1024点的复数序列而ADC采集的是纯实数序列。因此需将实数序列视为复数的实部虚部置零。输入数据准备fftin[2048]数组前1024个元素存实部ADC采样值后1024个元素存虚部全0。FFT执行调用cr4_fft_1024_stm32(fftout, fftin, 1024)输出fftout[2048]为1024点复数频谱。幅值计算与峰值搜索遍历fftout的前512个点对应0~fs/2的正频率分量对每个点i提取实部X与虚部Y计算幅值Mag sqrt(X² Y²)。记录最大Mag及其索引temp。频率换算根据FFT原理第k个频点对应的物理频率为f(k) k * fs / N。其中N1024fs为当前采样率。因此主频分量频率F temp * fs / 1024。项目原文中公式F(u16)(temp*(fre*1.0/NPT))里的fre即fs。// FFT幅值计算与主频提取 void GetPowerMag(void) { float X, Y, Mag, magmax 0; u16 i, temp 0; cr4_fft_1024_stm32(fftout, fftin, NPT); // 执行FFT for(i 1; i NPT/2; i) // 遍历正频率分量 { X (float)((fftout[i] 16) 16); // 提取实部 Y (float)(fftout[i] 16); // 提取虚部 Mag sqrt(X * X Y * Y); FFT_Mag[i] Mag; if(Mag magmax) { magmax Mag; temp i; } } F (u16)(temp * fs / NPT); // 主频计算fs为当前采样率 }3.4 DAC波形生成与控制DAC模块提供了两种不同复杂度的波形生成方案体现了硬件加速与软件控制的权衡。正弦波DAC1采用查表法。InitBufInArray()函数预先计算1024个正弦值sin(2π*i/1024)缩放并偏移至DAC 12位范围0~4095存入magout[1024]数组。sinout()函数在TIM3中断中被调用每次中断读取magout[i]并写入DAC寄存器i自增并循环。因此正弦波频率f_sine f_TIM3 / 1024。f_TIM3由TIM3的ARR与PSC决定。噪声/三角波DAC2利用STM32内部硬件波形发生器。DAC_InitType.DAC_WaveGeneration直接设为DAC_WaveGeneration_Noise或DAC_WaveGeneration_TriangleDAC_InitType.DAC_LFSRUnmask_TriangleAmplitude设定三角波峰峰值。波形生成完全由硬件完成CPU仅需配置一次后续无需干预。其频率由触发源TIM4的更新事件频率决定f_wave f_TIM4。4. 人机交互与系统控制人机交互是将底层硬件能力转化为用户可感知功能的桥梁。本项目采用最简化的按键LCD方案其设计核心是“状态机”思想。4.1 按键功能定义与实现系统定义了三个物理按键KEY_UP, KEY_0, KEY_1其功能如下按键功能实现方式KEY_UP波形显示启停切换全局布尔变量display_enable在外部中断中取反。显示函数LCD_ShowWave()据此决定是否刷新屏幕。KEY_0降低采样率在外部中断中对TIM2的ARR寄存器值执行 100操作增大ARR降低fs。KEY_1提高采样率在外部中断中对TIM2的ARR寄存器值执行- 100操作减小ARR提高fs。所有按键操作均在外部中断服务程序EXTI中完成确保响应及时。为消除机械抖动采用软件延时消抖约10ms并在中断中检测按键释放状态后才执行功能。4.2 LCD显示逻辑LCD显示分为两部分静态参数与动态波形。静态参数显示包括当前采样率fs、测得频率F、峰峰值VppVpp (max(adcx) - min(adcx)) * 3.3V / 4096等使用LCD_ShowNum()函数在固定坐标位置刷新。动态波形显示LCD_ShowWave()函数是核心。它遍历adcx[1024]数组将每个12位ADC值adcx[x]线性映射到LCD的Y坐标y 50 (adcx[x] * 80) / 409650为Y轴起始80为显示高度。然后调用LCD_DrawLine(x, past_y, x1, y)绘制相邻两点间的连线。由于LCD宽度仅160像素1024点需进行降采样如每6-7点取1点否则无法完整显示。5. BOM清单与关键器件选型依据本项目BOM高度精简核心器件均来自STM32F103ZET6芯片内部外部元件主要为开发板标配。以下列出关键器件及其选型逻辑器件型号/规格选型依据备注主控MCUSTM32F103ZET6内置12位ADC、双DAC、多定时器、足够RAM/Flash成本与生态优势明显项目基础ADC参考源VDDA (3.3V)简化设计无需外置基准芯片精度受限于VDDA稳定性LCD显示屏160x80 单色点阵屏开发板标配驱动简单功耗低分辨率适中满足教学演示按键开关轻触开关 (6x6mm)成本低廉机械寿命长易于焊接需配合软件消抖电源管理AMS1117-3.3开发板标准LDO为MCU提供稳定3.3V效率非首要考虑6. 系统调试与典型问题分析在项目复现过程中常遇到以下典型问题其根源均指向嵌入式系统固有的时序与资源约束特性。6.1 采样率与显示频率偏差项目描述中提到“当采样频率提高到最大3.6kHz时频率显示为32Hz左右原因未知”。此现象的根源在于FFT分辨率与采样率的矛盾。当fs3.6kHz时1024点FFT的频率分辨率为f0 fs/N 3.6kHz/1024 ≈ 3.5Hz。而待测正弦波频率仅为24.5Hz其能量将分布在第621Hz与第724.5Hz个频点附近。若FFT计算存在舍入误差或窗函数效应峰值可能被判定在第7或第9个频点导致计算出的F在24.5Hz至31.5Hz间跳变。解决方法是降低采样率如fs1kHz使f0≈1Hz从而获得更精确的频率定位。6.2 DAC波形失真DAC1输出的正弦波在高频时可能出现失真主要原因有二TIM3中断响应延迟当f_TIM3很高时中断服务程序执行时间包括DAC_SetChannel1Data和i可能接近甚至超过中断周期导致波形点输出不均匀。DAC建立时间不足STM32F103 DAC的典型建立时间为1μs无缓冲器。若f_TIM3过高如1MHz则相邻点间隔小于1μsDAC无法完成电压稳定输出波形将严重失真。6.3 DMA中断丢失在极高采样率下若DMA传输完成中断TC的优先级低于其他中断如SysTick可能导致TC中断被挂起adcx数组内容未能及时被处理新数据覆盖旧数据造成波形显示错乱。解决方案是将DMA中断优先级设为最高NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0并确保其抢占优先级高于所有其他中断。7. 性能参数与实测数据基于STM32F103ZET6平台本简易示波器的实测性能参数如下参数数值测试条件说明最大稳定采样率3.6 kHzTIM2 PSC0, ARR19受限于ADC转换时间与DMA带宽ADC分辨率12 bitVDDA3.3V量化步长≈0.8mV采样深度1024 points固定配置满足FFT 2^10要求频率测量范围10 Hz ~ 1.8 kHzfs3.6kHz奈奎斯特频率限制频率分辨率3.5 Hzfs3.6kHzf0 fs/N电压测量范围0 ~ 3.3 V直接输入无衰减/放大电路波形显示刷新率~10 Hz全屏重绘受LCD驱动速度限制这些参数共同定义了系统的可观测窗口。理解它们是合理评估项目价值与规划后续升级如增加前端信号调理、使用外部高速ADC、移植至Cortex-M4F DSP核的前提。