一、系统架构设计1、一发多收拓扑发射探头 │ ▼ ┌─────────────┐ │ 超声波束 │ └──────┬──────┘ │ ┌─────┼─────┐ ▼ ▼ ▼ 接收1 接收2 接收3 (Rx1) (Rx2) (Rx3) │ │ │ └──┬──┴──┬──┘ │ │ 时间差Δt1 Δt2 │ │ 距离解算 → 目标位置2、系统指标参数指标工作频率40kHz探测距离0.2m ~ 5m角度覆盖范围120°测距精度±2cm响应时间 50ms接收通道3~8个二、硬件设计方案1、核心器件选型器件型号说明MCUSTM32F407ZGT6168MHz17个定时器发射驱动MAX232/TXS0108E高压驱动接收放大LM358×2级联带通滤波放大超声波探头TCT40-16T/R16mm40kHz模拟开关CD4051多路复用电平转换TXS0108E5V/3.3V2、发射电路STM32 PWM ── 74HC04 ── BS170 MOSFET ── 变压器 ── 发射探头 │ MAX232 (倍压)3、接收电路每个通道接收探头 ── 前置放大(LM358) ── 带通滤波(40kHz) ── 比较器 ── STM32 │ 增益可调(电位器)三、STM32 资源配置1、定时器分配/* 定时器功能分配 */TIM1 ── 发射PWM40kHz8个周期 TIM2 ── 接收通道1捕获 TIM3 ── 接收通道2捕获 TIM4 ── 接收通道3捕获 TIM5 ── 系统时间基准 TIM6 ── 采样周期控制2、GPIO 引脚定义/* 发射控制 */#defineTRIG_PINGPIO_PIN_8#defineTRIG_PORTGPIOA/* 接收通道 */#defineECHO1_PINGPIO_PIN_0// TIM2_CH1#defineECHO2_PINGPIO_PIN_6// TIM3_CH1#defineECHO3_PINGPIO_PIN_6// TIM4_CH1/* 模拟开关控制 */#defineSEL_A_PINGPIO_PIN_12#defineSEL_B_PINGPIO_PIN_13#defineSEL_C_PINGPIO_PIN_14四、核心代码实现1、超声波参数定义#ifndefULTRASONIC_H#defineULTRASONIC_H#includestm32f4xx_hal.h#defineNUM_RECEIVERS3#defineSOUND_SPEED340.0f// 声速 m/s#defineTRIGGER_PULSE_US10// 触发脉冲宽度#defineMEASURE_TIMEOUT_MS50// 测量超时#defineSAMPLE_RATE_HZ20// 采样频率/* 接收通道结构体 */typedefstruct{uint8_tchannel_id;// 通道IDuint32_techo_time_us;// 回波时间(μs)floatdistance_m;// 距离(m)uint8_tvalid_flag;// 数据有效性uint32_tlast_update;// 最后更新时间}Receiver_t;/* 一发多收系统 */typedefstruct{Receiver_t receivers[NUM_RECEIVERS];uint32_ttrigger_time;// 触发时间uint8_tmeasurement_done;// 测量完成标志floattarget_x;// 目标X坐标floattarget_y;// 目标Y坐标floatconfidence;// 置信度}Ultrasonic_System_t;externUltrasonic_System_t us_system;#endif2、定时器初始化/* TIM1 - 发射PWM初始化 */voidTIM1_Trigger_Init(void){TIM_HandleTypeDef htim1;TIM_OC_InitTypeDef sConfigOC{0};__HAL_RCC_TIM1_CLK_ENABLE();htim1.InstanceTIM1;htim1.Init.Prescaler84-1;// 84MHz/84 1MHzhtim1.Init.CounterModeTIM_COUNTERMODE_UP;htim1.Init.Period25-1;// 40kHz (1MHz/40kHz 25)htim1.Init.ClockDivisionTIM_CLOCKDIVISION_DIV1;htim1.Init.RepetitionCounter0;HAL_TIM_PWM_Init(htim1);sConfigOC.OCModeTIM_OCMODE_PWM1;sConfigOC.Pulse12;// 50%占空比sConfigOC.OCPolarityTIM_OCPOLARITY_HIGH;sConfigOC.OCNPolarityTIM_OCNPOLARITY_HIGH;sConfigOC.OCFastModeTIM_OCFAST_DISABLE;sConfigOC.OCIdleStateTIM_OCIDLESTATE_RESET;sConfigOC.OCNIdleStateTIM_OCNIDLESTATE_RESET;HAL_TIM_PWM_ConfigChannel(htim1,sConfigOC,TIM_CHANNEL_1);HAL_TIM_PWM_Start(htim1,TIM_CHANNEL_1);}/* 接收通道定时器初始化 */voidTIM_Receiver_Init(void){TIM_HandleTypeDef htim2,htim3,htim4;// TIM2_CH1 - 接收通道1__HAL_RCC_TIM2_CLK_ENABLE();htim2.InstanceTIM2;htim2.Init.Prescaler84-1;// 1MHzhtim2.Init.CounterModeTIM_COUNTERMODE_UP;htim2.Init.Period0xFFFFFFFF;// 32位最大计数HAL_TIM_IC_Init(htim2);TIM_IC_InitTypeDef sConfigIC{0};sConfigIC.ICPolarityTIM_INPUTCHANNELPOLARITY_RISING;sConfigIC.ICSelectionTIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescalerTIM_ICPSC_DIV1;sConfigIC.ICFilter0x0;HAL_TIM_IC_ConfigChannel(htim2,sConfigIC,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(htim2,TIM_CHANNEL_1);// 类似配置TIM3、TIM4...}3、发射控制/* 发射超声波脉冲 */voidUltrasonic_Trigger(void){uint32_tstart_time;// 记录触发时间us_system.trigger_timeHAL_GetTick();// 启动PWM发射HAL_TIM_PWM_Start(htim1,TIM_CHANNEL_1);// 发射8个周期后停止start_timeHAL_GetTick();while(HAL_GetTick()-start_time1);// 延迟200μsHAL_TIM_PWM_Stop(htim1,TIM_CHANNEL_1);// 重置所有接收通道for(inti0;iNUM_RECEIVERS;i){us_system.receivers[i].valid_flag0;us_system.receivers[i].echo_time_us0;}us_system.measurement_done0;}4、输入捕获中断处理/* TIM2输入捕获中断 - 接收通道1 */voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef*htim){staticuint32_tic_val1[NUM_RECEIVERS]{0};staticuint8_tis_first_capture[NUM_RECEIVERS]{1};if(htim-InstanceTIM2htim-ChannelHAL_TIM_ACTIVE_CHANNEL_1){if(is_first_capture[0]0){// 第二次捕获下降沿uint32_tic_val2HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);uint32_tdiffic_val2-ic_val1[0];us_system.receivers[0].echo_time_usdiff;us_system.receivers[0].distance_m(diff*0.001f)*SOUND_SPEED/2.0f;us_system.receivers[0].valid_flag1;us_system.receivers[0].last_updateHAL_GetTick();is_first_capture[0]1;}else{// 第一次捕获上升沿ic_val1[0]HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);is_first_capture[0]0;}}// 类似处理TIM3、TIM4...}5、一发多收距离解算/* 一发多收位置解算 */voidMultistatic_Position_Estimation(void){floatdistances[NUM_RECEIVERS];uint8_tvalid_count0;// 收集有效距离数据for(inti0;iNUM_RECEIVERS;i){if(us_system.receivers[i].valid_flagus_system.receivers[i].distance_m0.2fus_system.receivers[i].distance_m5.0f){distances[valid_count]us_system.receivers[i].distance_m;}}if(valid_count2){us_system.confidence0.0f;return;}// 基于时间差的多基站定位算法// 简化版本使用最近的两个接收器进行三角定位if(valid_count2){floatd1distances[0];floatd2distances[1];// 假设接收器间距已知例如30cmfloatreceiver_spacing0.3f;// 简化三角定位floatx(d1*d1-d2*d2receiver_spacing*receiver_spacing)/(2*receiver_spacing);floatysqrt(d1*d1-x*x);us_system.target_xx;us_system.target_yy;us_system.confidence(float)valid_count/NUM_RECEIVERS;}us_system.measurement_done1;}6、主循环处理/* 主任务 */voidUltrasonic_Task(void){staticuint32_tlast_trigger0;uint32_tcurrent_timeHAL_GetTick();// 周期性触发测量if(current_time-last_trigger1000/SAMPLE_RATE_HZ){Ultrasonic_Trigger();last_triggercurrent_time;}// 检查是否所有通道都有数据uint8_tall_received1;for(inti0;iNUM_RECEIVERS;i){if(us_system.receivers[i].valid_flag0){all_received0;break;}}// 超时处理if(current_time-us_system.trigger_timeMEASURE_TIMEOUT_MS){all_received1;// 强制处理}// 进行位置解算if(all_received){Multistatic_Position_Estimation();// 输出结果if(us_system.measurement_done){printf(Target: (%.2f, %.2f)m, Confidence: %.1f%%\n,us_system.target_x,us_system.target_y,us_system.confidence*100);}}}五、高级功能实现1、自适应增益控制/* 自动增益控制 */voidAGC_Control(void){staticuint8_tgain_level1;for(inti0;iNUM_RECEIVERS;i){if(us_system.receivers[i].echo_time_us100){// 信号太强降低增益gain_level(gain_level1)?gain_level-1:1;break;}elseif(us_system.receivers[i].echo_time_us5000){// 信号太弱增加增益gain_level(gain_level8)?gain_level1:8;break;}}// 设置模拟开关选择增益档位HAL_GPIO_WritePin(SEL_A_PORT,SEL_A_PIN,(gain_level0x01)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(SEL_B_PORT,SEL_B_PIN,(gain_level0x02)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(SEL_C_PORT,SEL_C_PIN,(gain_level0x04)?GPIO_PIN_SET:GPIO_PIN_RESET);}2、多目标识别/* 多目标检测 */typedefstruct{floatdistance;uint8_tamplitude;uint8_tchannel_mask;}Echo_Target_t;voidMulti_Target_Detection(void){#defineMAX_TARGETS5Echo_Target_t targets[MAX_TARGETS];uint8_ttarget_count0;// 分析每个通道的回波信号for(intch0;chNUM_RECEIVERS;ch){// 检测多个回波峰值uint32_t*echo_timesGet_Echo_Timeline(ch);uint8_tpeak_countFind_Echo_Peaks(echo_times);for(intp0;ppeak_counttarget_countMAX_TARGETS;p){targets[target_count].distanceecho_times[p]*0.001f*SOUND_SPEED/2.0f;targets[target_count].channel_mask|(1ch);target_count;}}// 聚类分析合并同一目标的多个回波Cluster_Targets(targets,target_count);}六、误差分析与补偿1、温度补偿/* 温度补偿声速 */floatGet_Sound_Speed(floattemperature_c){// v 331.4 0.6 × Treturn331.4f0.6f*temperature_c;}/* 在距离计算中使用 */us_system.receivers[i].distance_m(diff*0.001f)*Get_Sound_Speed(current_temp)/2.0f;2、时间延迟补偿/* 硬件延迟补偿 */#defineHW_DELAY_US2.5f// 发射电路延迟#defineSW_DELAY_US1.2f// 软件处理延迟floatCompensate_Distance(floatraw_distance){floattime_compensation(HW_DELAY_USSW_DELAY_US)*0.001f;floatdistance_compensationtime_compensation*SOUND_SPEED/2.0f;returnraw_distance-distance_compensation;}参考代码 实现超声波传感器一发多收的测距功能www.youwenfan.com/contentcsv/72819.html七、性能优化1、实时性优化优化项方法中断处理使用DMA减少CPU占用数据缓存环形缓冲区存储回波数据算法优化查表法替代浮点运算并行处理多通道同时采样2、抗干扰措施/* 中值滤波 */floatMedian_Filter(float*data,uint8_tlen){// 冒泡排序取中值for(inti0;ilen-1;i){for(intj0;jlen-i-1;j){if(data[j]data[j1]){floattempdata[j];data[j]data[j1];data[j1]temp;}}}returndata[len/2];}八、测试验证1、测试项目测试项目方法标准单目标测距固定距离测量±2cm多目标分辨前后放置障碍物最小间距15cm角度特性旋转目标120°覆盖抗干扰性添加噪声源误检率5%长期稳定性连续运行24h漂移3cm2、标定流程1. 静态标定在0.5m、1m、2m、3m、4m处测量 2. 温度标定-10°C、0°C、25°C、50°C 3. 角度标定0°、30°、60°、90° 4. 多目标标定前后目标分离测试