用STM32F103C8T6最小系统板驱动HC-SR04超声波模块,手把手教你做个简易测距仪(附完整代码)
基于STM32F103C8T6与HC-SR04的智能测距系统开发实战在电子设计竞赛和创客项目中低成本高性能的解决方案总是备受青睐。STM32F103C8T6最小系统板以其出色的性价比成为学生和爱好者的首选而HC-SR04超声波模块则是距离检测领域的经典选择。本文将带您从零开始构建一个完整的测距系统涵盖硬件连接、软件配置到功能扩展的全过程。1. 硬件系统搭建1.1 元器件选型与成本控制对于预算有限的开发者合理的元器件选择至关重要核心控制器STM32F103C8T6最小系统板蓝桥杯指定型号72MHz主频的Cortex-M3内核64KB Flash 20KB RAM市场价约15-25元测距模块HC-SR04超声波传感器测量范围2cm-400cm精度3mm市场价约8-12元辅助元件有源蜂鸣器报警提示LED指示灯状态显示杜邦线若干USB转TTL串口模块调试用提示整套系统硬件成本可控制在50元以内非常适合学生实验和竞赛项目。1.2 电路连接详解连接示意图如下STM32F103C8T6 HC-SR04 PA8 ----------- TRIG PA9 ----------- ECHO 3.3V ----------- VCC GND ----------- GND关键连接注意事项供电选择开发板可通过USB供电5VHC-SR04工作电压5V但ECHO信号为5V TTLSTM32 GPIO耐受5V电压可直接连接信号线处理TRIG普通GPIO输出模式ECHO配置为输入模式建议启用内部上拉扩展功能连接PC13 - LED板载LEDPB8 - 蜂鸣器控制端2. 软件开发环境配置2.1 Keil工程建立针对STM32F103C8T6的工程配置要点设备选择Device: STM32F103C8时钟配置#define HSE_VALUE 8000000U // 外部8MHz晶振 SystemCoreClock 72000000; // PLL输出72MHz关键库文件CMSIS核心库STM32F10x标准外设库串口printf重定向支持2.2 定时器配置策略使用TIM2进行高精度时间测量void TIM2_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler 72-1; // 1MHz计数频率 TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure); }3. 核心测距算法实现3.1 超声波驱动时序完整的测距流程触发阶段void TriggerPulse(void) { GPIO_SetBits(GPIOA, GPIO_Pin_8); // TRIG高电平 delay_us(20); // 维持20us GPIO_ResetBits(GPIOA, GPIO_Pin_8);// TRIG低电平 }回波检测float MeasureDistance(void) { uint32_t start_time, end_time; TriggerPulse(); while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) 0); // 等待回波高电平 start_time TIM2-CNT; while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) 1); // 等待回波结束 end_time TIM2-CNT; return (end_time - start_time) / 58.0f; // 转换为厘米 }3.2 数据滤波处理针对超声波测量的波动性采用滑动平均滤波#define FILTER_SIZE 5 float DistanceFilter(float new_val) { static float buffer[FILTER_SIZE] {0}; static uint8_t index 0; float sum 0; buffer[index] new_val; index (index 1) % FILTER_SIZE; for(uint8_t i0; iFILTER_SIZE; i) { sum buffer[i]; } return sum / FILTER_SIZE; }4. 系统功能扩展与优化4.1 多级报警系统实现根据距离设置不同级别的报警void AlarmControl(float distance) { if(distance 10.0f) { // 危险距离 GPIO_SetBits(GPIOB, GPIO_Pin_8); // 蜂鸣器长鸣 GPIO_ResetBits(GPIOC, GPIO_Pin_13); // LED常亮 } else if(distance 30.0f) { // 警告距离 // 蜂鸣器间歇鸣响 static uint32_t last_tick 0; if(HAL_GetTick() - last_tick 200) { GPIO_ToggleBits(GPIOB, GPIO_Pin_8); GPIO_ToggleBits(GPIOC, GPIO_Pin_13); last_tick HAL_GetTick(); } } else { // 安全距离 GPIO_ResetBits(GPIOB, GPIO_Pin_8); // 关闭蜂鸣器 GPIO_SetBits(GPIOC, GPIO_Pin_13); // LED熄灭 } }4.2 串口数据可视化通过串口输出格式化数据便于调试void USART_SendData(float distance) { printf(当前距离: %.1fcm\n, distance); // ASCII条形图显示 uint8_t bars (uint8_t)(distance / 5); printf([); for(uint8_t i0; i20; i) { printf(i bars ? : ); } printf(]\r); }4.3 低功耗优化策略对于电池供电的应用场景间歇工作模式void EnterLowPowerMode(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); }定时唤醒测量void TIM3_Init(void) { // 配置TIM3为1秒间隔唤醒 TIM_TimeBaseInitTypeDef TIM_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_InitStruct.TIM_Period 1000-1; TIM_InitStruct.TIM_Prescaler 7200-1; // 10kHz TIM_TimeBaseInit(TIM3, TIM_InitStruct); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); NVIC_InitStruct.NVIC_IRQChannel TIM3_IRQn; NVIC_Init(NVIC_InitStruct); TIM_Cmd(TIM3, ENABLE); }5. 常见问题排查指南在实际开发中可能会遇到以下典型问题现象可能原因解决方案测量值固定为01. 接线错误2. 触发信号不足1. 检查TRIG/ECHO连接2. 确保触发脉冲10us测量值波动大1. 电源噪声2. 物体表面吸收1. 增加滤波电容2. 调整测量角度超出测量范围1. 障碍物太远2. 环境干扰1. 确认在2-400cm范围内2. 避免强声源干扰调试技巧使用逻辑分析仪检查TRIG和ECHO信号时序通过串口打印原始计时值辅助诊断在不同环境温度下测试声速受温度影响这个项目最让我惊喜的是STM32F103C8T6的性能表现——仅用不到30%的CPU负载就能实现精确的超声波测距同时还有充足资源可以扩展更多功能如无线传输或LCD显示。在实际测试中只要保证供电稳定并做好简单的软件滤波测量精度完全能满足大多数应用场景的需求。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2438261.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!