当前位置: 首页 > news >正文

STM32F103C8T6最小系统板驱动HC-SR04超声波模块,从接线到串口打印距离的保姆级教程

STM32F103C8T6最小系统板驱动HC-SR04超声波模块实战指南

在电子设计竞赛和嵌入式开发学习中,STM32F103C8T6最小系统板因其高性价比和丰富资源成为学生群体的首选。本文将完整展示如何用这块"蓝色小药丸"驱动HC-SR04超声波模块,从硬件连接到软件实现,最终通过串口实时显示距离数据。与动辄上百元的开发板不同,这套方案总成本不足50元,却能实现相同的测距功能。

1. 硬件准备与电路连接

1.1 器件选型要点

  • 核心控制器:STM32F103C8T6最小系统板(20-25元)
    • Cortex-M3内核,72MHz主频
    • 64KB Flash + 20KB SRAM
    • 37个GPIO(实际可用约34个)
  • 传感器模块:HC-SR04超声波模块(8-12元)
    • 工作电压:5V DC
    • 测量范围:2cm-400cm
    • 精度:3mm(理论值)

注意:虽然STM32F103C8T6工作电压为3.3V,但HC-SR04的Echo信号经过电平转换可直接接入,实测稳定可靠。

1.2 接线方案对比

下表展示三种常用连接方式:

连接方式Trig引脚Echo引脚VCCGND特点
标准接法PA1PA05VGND需外部上拉
中断优化PA8PB125VGND支持外部中断
串口复用PA9PA105VGND与串口1共用

推荐采用中断优化方案,具体接线如下:

HC-SR04 STM32F103C8T6 VCC → 5V引脚 Trig → PA8 (推挽输出) Echo → PB12 (浮空输入) GND → GND

2. 开发环境搭建

2.1 工具链配置

  1. IDE选择

    • Keil MDK-ARM(需注册)
    • STM32CubeIDE(免费)
    • PlatformIO + VSCode(推荐跨平台)
  2. 库支持

# PlatformIO环境依赖 [env:bluepill_f103c8] platform = ststm32 board = bluepill_f103c8 framework = stm32cube lib_deps = stm32duino/STM32duino FreeRTOS@10.4.4

2.2 工程创建步骤

以STM32CubeMX为例:

  1. 选择MCU型号:STM32F103C8Tx
  2. 配置时钟树:72MHz HCLK
  3. 开启外设:
    • GPIO: PA8(OUT), PB12(IN)
    • USART1(115200 baud)
    • TIM2(基本定时器)
  4. 生成代码前勾选"Generate peripheral initialization as a pair of .c/.h files"

3. 核心代码实现

3.1 定时器配置

定时器用于精确测量Echo高电平持续时间:

// tim.c void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 71; // 1MHz计数频率 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFF; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim2); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); }

3.2 外部中断处理

PB12配置为上升沿触发中断:

// gpio.c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_12){ if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12)){ HAL_TIM_Base_Start(&htim2); __HAL_TIM_SET_COUNTER(&htim2, 0); } else { uint32_t pulse = __HAL_TIM_GET_COUNTER(&htim2); HAL_TIM_Base_Stop(&htim2); float distance = pulse * 0.034 / 2; // 单位:cm printf("Distance: %.2fcm\r\n", distance); } } }

3.3 主循环逻辑

触发信号生成与测量控制:

// main.c while (1) { // 产生10us触发脉冲 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); delay_us(15); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); // 间隔60ms以上防止回波干扰 HAL_Delay(100); }

4. 调试技巧与性能优化

4.1 常见问题排查

  • 无回波信号

    1. 检查Trig脉冲宽度是否≥10us
    2. 确认VCC供电≥4.5V
    3. 测量模块电流(正常约15mA)
  • 距离数据跳变

    # 简易滤波算法示例 def median_filter(values): sorted_values = sorted(values) length = len(sorted_values) return sorted_values[length//2] distances = [get_distance() for _ in range(5)] stable_distance = median_filter(distances)

4.2 精度提升方案

  1. 温度补偿公式:
    声速 = 331.4 + 0.6 × 温度(℃) + 0.0124 × 湿度(%)
  2. 使用TIM输入捕获模式替代外部中断+定时器组合
  3. 将GPIO配置为50MHz高速模式

4.3 功耗优化

当需要电池供电时:

void enter_low_power_mode() { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); HAL_SuspendTick(); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); SystemClock_Config(); // 唤醒后重新配置时钟 }

5. 扩展应用实例

5.1 多模块级联方案

通过74HC138译码器控制多个HC-SR04:

void select_sensor(uint8_t num) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, (num>>0)&1); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, (num>>1)&1); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, (num>>2)&1); }

5.2 与OLED显示集成

使用I2C接口的SSD1306显示实时距离:

void show_distance(float dist) { char buf[16]; sprintf(buf, "%.1fcm", dist); SSD1306_GotoXY(0, 0); SSD1306_Puts(buf, &Font_11x18, 1); SSD1306_UpdateScreen(); }

5.3 阈值报警功能

当距离小于设定值时触发蜂鸣器:

if(distance < SAFE_DISTANCE){ HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET); printf("!WARNING! Too close: %.1fcm\r\n", distance); } else { HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET); }
http://www.cnnetsun.cn/news/1942892.html

相关文章:

  • 如何快速构建现代化WPF界面:Fluent.Ribbon专业级Office风格组件完全指南
  • 告别Myo Connect依赖:直连蓝牙协议,用Python2.7/3.x实现双Myo臂环的底层数据抓取
  • 别再只会用均值填充了!sklearn的SimpleImputer还有这些隐藏玩法(附实战代码)
  • 从游戏美术到技术美术:手把手教你用‘人眼感知’原理优化PBR材质,告别塑料感
  • SafeHarness:告别防御盲区,为智能体Harness穿上「全生命周期安全护甲」
  • arkts中开启布局定位
  • 告别配置迷茫!RTKNAVI v2.4.3b34 实时RTK解算,从串口到NTRIP的保姆级配置流程
  • 从梯度消失到网络重生:ResNet残差连接如何重塑深度模型训练
  • 017、OpenClaw TTS 与 AI 助手集成:构建会说话的智能体
  • 悉尼大学与多所顶尖高校联手,让AI的眼睛学会“按需聚焦“
  • DownKyi终极教程:如何快速掌握B站视频下载技巧
  • C#借助InTheHand.Net.Bluetooth实现蓝牙设备发现与数据接收实战
  • WebP/AVIF格式转换神器:用Squoosh-cli批量优化网站图片资源
  • 移动端动态化方案对比
  • H3C交换机DHCP配置避坑指南:从实验到实战的5个关键细节
  • 2026届学术党必备的AI学术工具推荐榜单
  • Python Android移动开发实战:从代码到APK的完整解决方案
  • 解决万象熔炉常见问题:图片模糊、风格不对怎么办?
  • BepInEx终极指南:如何轻松为Unity游戏添加插件功能
  • BilibiliDown:跨平台B站视频下载技术方案
  • SITS2026独家:AI简历生成器性能压测报告(10万+并发请求/秒),当模型幻觉遇上岗位JD歧义,这4个防御性提示链设计救了命
  • 从手机扬声器到家庭影院:拆解不同场景下,喇叭磁体(钕铁硼/铁氧体)的选择逻辑与实战案例
  • WechatRealFriends:基于微信iPad协议的好友关系状态检测技术实现
  • 电子设备迭代与新能源扩张驱动,稳增前行:全球散热器2025年31.70亿,2032年锚定54.81亿,2026-2032年CAGR7.7%
  • UE5 LookDev环境搭建避坑指南:从曝光校准到色彩管理,手把手教你打造专业材质检查场景
  • 告别Android Studio“硬编码字符串”警告:从@string资源到高效本地化的进阶实践
  • 从数字记忆到永久存档:GetQzonehistory帮你完整备份QQ空间历史记录
  • Verilog X态避坑指南:为什么你的casex语句会让Formality等价性检查失灵?
  • 因果AI干预层:从理论到产业,解锁“如果”的力量
  • 从单体到微前端:我们如何用Qiankun+Vue3重构一个老后台的样式隔离难题