基于STM32的正点原子示波器项目详解
一、项目概述基于STM32的正点原子示波器是一个开源的单片机学习项目通过正点原子开发板实现简易数字示波器功能。该项目能够采集、显示和分析模拟信号测量信号的频率、幅值等参数是学习STM32和嵌入式系统开发的优秀实践项目。二、硬件平台选择正点原子提供了多款STM32开发板均可用于示波器项目开发板型号主控芯片核心特点适用场景精英板STM32F103ZET6性价比高资源丰富初学者入门基础示波器MiniSTM32STM32F103RCT6小巧便携成本低简化版示波器战舰版STM32F103ZET6功能全面接口丰富功能完整的示波器探索者STM32F407ZGT6高性能带FPU高级示波器支持复杂算法三、核心功能特性3.1 基本功能信号采集通过ADC采集0-3.3V范围内的模拟信号波形显示在TFTLCD上实时显示波形参数测量频率测量支持FFT算法提高精度幅值测量最大值、最小值、峰峰值电压测量采样控制可调节采样频率通过按键控制波形暂停/继续功能3.2 高级功能部分实现多波形支持正弦波、三角波、方波、锯齿波、噪声等数据导出通过串口将测量数据发送到PC触发功能边沿触发、电平触发自动量程自动调整显示范围四、硬件连接与配置4.1 基本连接方式信号输入 → PA6ADC1通道6 或PA5ADC1通道5 或PA1ADC1通道1 TFTLCD → FSMC接口战舰版/探索者 或并口/SPI接口精英版/Mini版 控制按键 KEY_UP → 波形更新/暂停 KEY0 → 提高采样率 KEY1 → 降低采样率4.2 测试信号连接正弦波测试PA6与PA4相连三角波/噪声测试PA6与PA5相连五、软件架构与关键技术5.1 核心采集方案ADCTIMERDMA// 关键配置代码示例基于精英板voidAdc_Init(void){ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 使能ADC1和GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);// 72M/612MHz// 配置PA6为模拟输入GPIO_InitStructure.GPIO_PinGPIO_Pin_6;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AIN;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);// ADC配置ADC_InitStructure.ADC_ModeADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvModeDISABLE;ADC_InitStructure.ADC_ContinuousConvModeDISABLE;ADC_InitStructure.ADC_ExternalTrigConvADC_ExternalTrigConv_T2_CC2;ADC_InitStructure.ADC_DataAlignADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel1;ADC_Init(ADC1,ADC_InitStructure);// 配置ADC通道6ADC_RegularChannelConfig(ADC1,ADC_Channel_6,1,ADC_SampleTime_1Cycles5);// 使能ADC和DMAADC_Cmd(ADC1,ENABLE);ADC_DMACmd(ADC1,ENABLE);// 校准ADCADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));}5.2 定时器触发配置// 定时器2配置为PWM模式触发ADC采样voidTIM2_PWM_Init(u16 arr,u16 psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;// 使能TIM2时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// 定时器基础配置TIM_TimeBaseStructure.TIM_Periodarr;TIM_TimeBaseStructure.TIM_Prescalerpsc;TIM_TimeBaseStructure.TIM_ClockDivision0;TIM_TimeBaseStructure.TIM_CounterModeTIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,TIM_TimeBaseStructure);// PWM模式配置TIM_OCInitStructure.TIM_OCModeTIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputStateTIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulsearr/2;// 50%占空比TIM_OCInitStructure.TIM_OCPolarityTIM_OCPolarity_High;TIM_OC2Init(TIM2,TIM_OCInitStructure);// 使能TIM2TIM_Cmd(TIM2,ENABLE);TIM_CtrlPWMOutputs(TIM2,ENABLE);}5.3 DMA数据传输配置// DMA配置用于ADC数据自动传输voidDMA_Config(void){DMA_InitTypeDef DMA_InitStructure;// 使能DMA1时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);// DMA配置DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr(u32)ADC1-DR;DMA_InitStructure.DMA_MemoryBaseAddr(u32)ADC_ConvertedValue;DMA_InitStructure.DMA_DIRDMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize1024;// 采样点数DMA_InitStructure.DMA_PeripheralIncDMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryIncDMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSizeDMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSizeDMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_ModeDMA_Mode_Circular;// 循环模式DMA_InitStructure.DMA_PriorityDMA_Priority_High;DMA_InitStructure.DMA_M2MDMA_M2M_Disable;DMA_Init(DMA1_Channel1,DMA_InitStructure);// 使能DMADMA_Cmd(DMA1_Channel1,ENABLE);}六、项目文件结构oscilloscope_project/ ├── Hardware/ │ ├── adc.c/h # ADC配置 │ ├── timer.c/h # 定时器配置 │ ├── dma.c/h # DMA配置 │ ├── lcd.c/h # LCD驱动 │ ├── key.c/h # 按键处理 │ └── usart.c/h # 串口通信 ├── System/ │ ├── delay.c/h # 延时函数 │ ├── sys.c/h # 系统配置 │ └── usart.c/h # 串口配置 ├── User/ │ ├── main.c # 主程序 │ ├── oscilloscope.c/h # 示波器核心逻辑 │ ├── waveform.c/h # 波形处理 │ └── fft.c/h # FFT频率计算 └── README.md # 项目说明参考代码 基于stm32的正点原子的示波器www.youwenfan.com/contentcst/135927.html七、主要技术指标参数指标说明输入电压范围0-3.3V由STM32的ADC参考电压决定采样频率可调最高约1MHz取决于定时器配置和CPU频率采样点数1024点/帧保证波形显示完整性频率测量范围几Hz到几百Hz实际范围取决于采样率显示分辨率320×240或更高取决于TFTLCD型号测量精度12位ADC理论分辨率约0.8mV八、使用步骤8.1 硬件准备开发板选择正点原子精英板/战舰版/探索者LCD连接将TFTLCD模块连接到开发板对应接口信号输入将待测信号连接到PA6或其他ADC引脚电源连接确保3.3V供电稳定8.2 软件烧录获取源码从开源仓库下载项目代码环境配置安装Keil MDK或STM32CubeIDE编译工程根据开发板型号选择对应配置下载程序通过ST-Link或J-Link下载到开发板8.3 操作使用上电启动系统自动初始化显示示波器界面信号连接将待测信号连接到指定ADC引脚参数调节KEY_UP暂停/继续波形更新KEY0提高采样率KEY1降低采样率数据查看波形和测量参数实时显示在LCD上九、性能优化建议9.1 提高采样率降低ADC采样时间使用ADC_SampleTime_1Cycles5提高系统时钟合理配置PLL提升系统频率优化DMA传输使用双缓冲机制减少数据传输时间9.2 提高测量精度ADC校准每次上电后进行ADC校准软件滤波添加数字滤波算法均值滤波、中值滤波FFT优化使用查表法加速FFT计算9.3 增强功能多通道支持扩展为双通道示波器存储功能添加SD卡存储波形数据网络通信通过以太网或WiFi传输数据到PC十、常见问题与解决方案问题现象可能原因解决方案无波形显示LCD未正确初始化检查LCD连接和初始化代码波形失真采样率过低提高定时器频率降低分频系数测量误差大ADC未校准添加ADC校准程序按键无响应外部中断配置错误检查按键GPIO和中断配置内存溢出采样数组过大优化内存使用使用外部SRAM十一、学习资源与扩展11.1 开源项目地址Git仓库https://gitee.com/silent-rookie/Simple-Oscilloscope包含内容完整工程代码、原理图、使用说明11.2 推荐学习路径基础阶段理解ADC、定时器、DMA基本原理实践阶段按照教程搭建基础示波器进阶阶段添加FFT频谱分析、自动测量等功能创新阶段设计多通道、高精度示波器11.3 相关参考资料《STM32不完全手册》- 正点原子团队《STM32嵌入式微控制器快速上手》- 陈志旺《数字信号处理》- 丁玉美高西全ST官方文档STM32F10xxx参考手册十二、项目总结基于STM32的正点原子示波器项目是一个综合性很强的嵌入式系统实践项目涵盖了硬件接口ADC、定时器、DMA、GPIO、外部中断软件算法信号处理、FFT变换、波形显示系统设计实时数据采集、人机交互、性能优化该项目不仅可以帮助初学者深入理解STM32的各种外设工作原理还能掌握数字示波器的基本设计方法。