STM32多路超声波采集系统设计与实现

STM32多路超声波采集系统设计与实现


一、系统架构设计

1. 硬件组成
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

四、应用场景

  1. 机器人避障系统:16路超声波环视
  2. 液位监测装置:工业级多探头检测
  3. 自动驾驶:毫米波雷达融合方案

五、调试技巧

  1. 逻辑分析仪观察:捕获Trig/Echo时序

  2. 示波器检测:观察回波信号完整性

  3. 串口打印调试

    printf("Ch%d: %.2f cm\r\n", ch, distance);
    

六、总结

通过合理配置STM32的定时器资源和中断优先级,可实现稳定可靠的多路超声波测距系统。关键点在于:

  1. 精确的时钟配置(APB1/APB2时钟分频)
  2. 有效的抗干扰措施(硬件滤波+软件滤波)
  3. 合理的资源调度(DMA与中断配合)

实际应用中建议根据需求选择方案:

专注于matlab/simulink,电子电路,编程