STM32多路超声波采集系统设计与实现
一、系统架构设计
1. 硬件组成
- 核心控制器:STM32F4系列(如F429,支持多定时器级联)
- 超声波模块:HC-SR04(每路需Trig+Echo引脚)
- 触发电路:GPIO推挽输出(驱动能力≥20mA)
- 回波处理:输入捕获+滤波电路(RC低通滤波)
2. 多路复用方案
| 方案 | 资源占用 | 实时性 | 适用场景 |
|---|---|---|---|
| 独立定时器 | 每路1定时器 | 最高 | 工业级高精度测量 |
| 定时器级联 | 1定时器+通道 | 中 | 中小型系统 |
| DMA+软件轮询 | 1定时器 | 低 | 低成本方案 |
二、硬件连接示例(以4路为例)
STM32F429 HC-SR04模块1 HC-SR04模块2
---------------- ----------------- -----------------
TIM1_CH1 (PA8) Trig1 (PB0) Trig2 (PB1)
TIM1_CH2 (PA9) Echo1 (PB2) Echo2 (PB3)
TIM2_CH1 (PA0) - -
TIM2_CH2 (PA1) - -
三、软件实现核心代码
1. 定时器初始化(TIM1输入捕获)
void MX_TIM1_Init(void)
{
TIM_IC_InitTypeDef sConfigIC = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 83; // 1MHz计数频率
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 0xFFFFFFFF; // 最大计数值
HAL_TIM_IC_Init(&htim1);
// 通道1配置(Echo1)
sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING_FALLING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 6; // 滤波等级
HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1);
// 启动中断
HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 1, 0);
}
2. 中断服务函数
volatile uint32_t echo_time[4] = {0}; // 存储4路时间差
void TIM1_UP_TIM10_IRQHandler(void)
{
if(__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC1) != RESET)
{
if(HAL_TIM_GetCaptureValue(&htim1, TIM_CHANNEL_1) > 0)
{
echo_time[0] = HAL_TIM_GetCaptureValue(&htim1, TIM_CHANNEL_1);
__HAL_TIM_SET_CAPTUREPOLARITY(&htim1, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
}
else
{
echo_time[0] = HAL_TIM_GetCaptureValue(&htim1, TIM_CHANNEL_1) - echo_time[0];
__HAL_TIM_SET_CAPTUREPOLARITY(&htim1, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
}
__HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_CC1);
}
}
3. 多路触发控制
void Trigger_Sensor(uint8_t channel)
{
switch(channel)
{
case 0: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); break;
case 1: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); break;
// 其他通道...
}
HAL_Delay(20); // 10μs脉冲
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}
参考代码 stm32 多路超声波采集读取 www.youwenfan.com/contentcnr/101703.html
四、应用场景
- 机器人避障系统:16路超声波环视
- 液位监测装置:工业级多探头检测
- 自动驾驶:毫米波雷达融合方案
五、调试技巧
-
逻辑分析仪观察:捕获Trig/Echo时序
-
示波器检测:观察回波信号完整性
-
串口打印调试:
printf("Ch%d: %.2f cm\r\n", ch, distance);
六、总结
通过合理配置STM32的定时器资源和中断优先级,可实现稳定可靠的多路超声波测距系统。关键点在于:
- 精确的时钟配置(APB1/APB2时钟分频)
- 有效的抗干扰措施(硬件滤波+软件滤波)
- 合理的资源调度(DMA与中断配合)
实际应用中建议根据需求选择方案:
- 低成本方案:单定时器+软件轮询
- 高精度方案:多定时器级联+温度补偿
- 工业级方案:FPGA+STM32协同处理