4. 传感器基础

在STM32机器人控制系统中,传感器是感知物理世界与自身状态的核心硬件层。无论是避障、循迹、测距、视觉识别还是姿态解算,最终都要转化为STM32可处理的电信号或数字帧。本章围绕机器人项目中五类最常用的传感器——红外、超声波、摄像头、编码器、IMU——展开,重点讲解其物理原理、电气接口、信号特性以及接入STM32时的工程要点。理解这些底层机制,是后续实现“感知—决策—执行”闭环控制的基础。

STM32机器人传感器信号链路与接口总览 传感器层 红外 (GP2Y0A21) 超声波 (HC-SR04) 摄像头 (OV2640) 编码器 (增量式) IMU (MPU6050) 接口与信号调理 ADC (12bit, 0~3.3V) 模拟电压输出 GPIO + 定时器输入捕获 PWM脉宽测量 DCMI + DMA 8位并行数据 定时器编码器模式 A/B相正交信号 I2C (400kHz) 寄存器读取 STM32处理层 ADC1 规则组 DMA循环采集 TIM2 CH1/CH2 输入捕获模式 DCMI + DMA JPEG/RGB565 TIM3 编码器模式 计数/方向 I2C1 主机 中断读取 信号流向:物理量 → 电信号/数字帧 → STM32外设 → 数据参与控制算法

4.1 红外传感器:模拟电压测距与反射式检测

核心原理:红外传感器分为两类:一类是反射式光电开关(如TCRT5000),利用红外LED发射光,经物体反射后被光电晶体管接收,输出数字电平或模拟电压,常用于循迹和近距离障碍检测;另一类是三角测距传感器(如GP2Y0A21),利用红外光斑在PSD(位置敏感探测器)上的偏移量计算距离,输出与距离成反比的模拟电压,有效测距范围约10~80cm。

接口与信号特性:GP2Y0A21输出模拟电压,典型值为2.8V(10cm)至0.4V(80cm),电压与距离呈非线性反比关系。STM32通过ADC采样该电压,再通过查表或拟合曲线转换为实际距离。TCRT5000则输出数字信号(带比较器)或模拟信号(不带比较器),数字输出可直接接GPIO。

参数GP2Y0A21TCRT5000
输出类型模拟电压数字/模拟
测量范围10~80cm0~2cm
接口3pin(VCC/GND/OUT)4pin(VCC/GND/OUT/EN)
STM32外设ADC1_INxGPIO输入/ADC
响应时间约5ms约1ms
工程注意:红外传感器易受环境光干扰,尤其是阳光中的红外分量。建议在传感器表面加装遮光罩,并在软件中做中值滤波或滑动平均滤波。ADC采样时,若使用12位分辨率,3.3V参考电压下,1cm距离变化约对应12mV,即约15个ADC码值,分辨率足够。

4.2 超声波传感器:飞行时间法测距

核心原理:HC-SR04通过发射40kHz超声波脉冲,并接收物体反射的回波,计算发射与接收之间的时间差Δt,距离 = Δt × 声速 / 2。声速在20°C空气中约为343m/s,温度每升高1°C,声速增加约0.6m/s,高精度应用需做温度补偿。

接口与信号特性:HC-SR04有4个引脚:VCC(5V)、GND、Trig(输入触发)、Echo(输出回波)。STM32向Trig引脚发送至少10μs的高电平脉冲,随后Echo引脚输出与距离成正比的高电平脉宽。脉宽范围约150μs(2.5cm)至25ms(4m)。STM32使用定时器输入捕获功能测量Echo高电平持续时间。

// 输入捕获测量Echo脉宽(伪代码)
TIM2->CCER |= TIM_CCER_CC1E;   // 使能捕获通道1
TIM2->CCMR1 |= TIM_CCMR1_IC1F_0; // 配置滤波
while(!(TIM2->SR & TIM_SR_CC1IF)); // 等待上升沿捕获
uint32_t t1 = TIM2->CCR1;
while(!(TIM2->SR & TIM_SR_CC1IF)); // 等待下降沿捕获
uint32_t t2 = TIM2->CCR1;
uint32_t pulse_width = t2 - t1;  // 定时器计数差值
float distance_cm = pulse_width * 0.017; // 假设72MHz时钟,1计数=1/72MHz
经验:超声波传感器存在最小盲区(通常2~3cm),且对软质物体(如海绵、布料)反射效果差。在机器人避障中,建议将超声波与红外传感器融合使用:超声波负责中远距离(5~200cm),红外负责近距离(2~30cm),两者互补。

4.3 摄像头:视觉感知与图像数据流

核心原理:摄像头模块(如OV2640、OV7670)内部集成了CMOS图像传感器,将光信号转换为数字像素数据。输出格式可为RGB565、YUV422或JPEG压缩流。STM32通过DCMI(数字摄像头接口)外设接收并行数据,配合DMA将图像帧直接搬运到内存,避免CPU逐像素读取。

接口与信号特性:DCMI接口包含8位并行数据线(D0~D7)、像素时钟(PCLK)、行同步(HSYNC)、帧同步(VSYNC)以及主时钟(XCLK)。OV2640还支持SCCB(兼容I2C)接口用于寄存器配置,如设置分辨率、帧率、白平衡等。典型配置为640×480分辨率、30fps、RGB565格式,每帧数据量约614KB,需使用DMA双缓冲机制。

参数OV2640OV7670
最大分辨率200万像素30万像素
输出格式RGB565/YUV/JPEGRGB565/YUV
接口DCMI + SCCBDCMI + SCCB
工作电压3.3V(内核1.8V)3.3V
STM32资源占用DMA + 双缓冲DMA + 双缓冲
实战要点:在STM32F407上驱动OV2640时,DCMI的像素时钟PCLK最高约24MHz,DMA需配置为外设到内存模式,数据宽度16位(RGB565)。若使用JPEG输出模式,每帧数据量可压缩至20~50KB,但解码需额外算力。对于颜色识别任务(如红色小球追踪),建议使用RGB565格式,直接在DMA中断中做颜色阈值判断,避免存储整帧图像。

4.4 编码器:电机转速与位置反馈

核心原理:增量式编码器通过光电或磁感应原理,输出两路相位差90°的正交方波信号(A相和B相)。通过检测A/B相的相位关系可判断旋转方向,通过计数脉冲数可计算角位移。STM32定时器内置编码器接口模式,可自动处理正交解码,无需外部逻辑电路。

接口与信号特性:编码器输出为开漏或推挽信号,通常需要上拉电阻(若为开漏)。STM32定时器(如TIM3、TIM4)配置为编码器模式后,CH1和CH2分别接A相和B相,定时器计数器自动递增或递减。计数范围可配置为16位(0~65535)或32位(需级联)。

// 编码器模式配置(STM32 HAL库)
TIM_Encoder_InitTypeDef sEncoderConfig = {0};
sEncoderConfig.EncoderMode = TIM_ENCODERMODE_TI12; // 双沿采样
sEncoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sEncoderConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sEncoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sEncoderConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sEncoderConfig.IC1Prescaler = 0;
sEncoderConfig.IC2Prescaler = 0;
sEncoderConfig.IC1Filter = 0;
sEncoderConfig.IC2Filter = 0;
HAL_TIM_Encoder_Init(&htim3, &sEncoderConfig);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
关键注意:编码器计数会溢出,需在定时器更新中断中处理溢出计数。例如使用16位定时器,转速3000rpm、编码器线数500线(4倍频后2000脉冲/圈),每秒产生100k个脉冲,约1.5秒溢出一次。必须开启更新中断并维护一个32位软件计数器。

4.5 IMU:惯性测量单元与姿态解算

核心原理:IMU(如MPU6050)集成了三轴加速度计和三轴陀螺仪。加速度计测量物体在三个轴上的加速度(包含重力分量),陀螺仪测量绕三个轴的角速度。通过融合算法(如互补滤波或Mahony滤波)可估算机器人的俯仰角、横滚角和偏航角。

接口与信号特性:MPU6050支持I2C接口(默认地址0x68)和SPI接口(部分型号)。I2C速率可达400kHz,数据输出为16位有符号整数。加速度计量程可配置为±2g/±4g/±8g/±16g,陀螺仪量程可配置为±250/±500/±1000/±2000°/s。STM32通过I2C读取寄存器数据,通常以100Hz~1kHz的频率轮询。

参数加速度计陀螺仪
测量物理量线加速度(m/s²)角速度(°/s)
典型量程±2g ~ ±16g±250 ~ ±2000°/s
输出分辨率16位ADC16位ADC
零偏稳定性±20mg±10°/s
主要误差源振动噪声温漂、积分漂移
工程建议:陀螺仪存在零偏(静止时输出不为0),需在系统启动时采集100~200个样本求平均作为零偏补偿值。加速度计易受运动加速度干扰,不能直接用于倾角计算,需与陀螺仪融合。在STM32上实现互补滤波时,建议采样频率500Hz,滤波系数α取0.02~0.05。

4.6 传感器信号调理与STM32接入实战

信号调理原则:不同传感器输出信号类型各异,接入STM32前需统一处理:模拟信号需满足ADC输入范围(0~3.3V),若传感器输出5V需分压或使用运放;数字信号需检查电平兼容性(3.3V/5V);PWM信号需确认脉冲宽度在定时器可测量范围内;I2C/SPI信号需注意上拉电阻和总线电容。

案例:多传感器融合避障小车

某轮式机器人需实现前方避障功能,选用GP2Y0A21红外传感器(测距10~80cm)和HC-SR04超声波传感器(测距2~400cm)。初始现象:单独使用超声波时,近距离(<5cm)物体检测不到;单独使用红外时,远距离(>50cm)精度差。目标:实现5~80cm范围内可靠避障。

  1. 硬件连接:红外OUT接PA0(ADC1_IN0),超声波Trig接PB0,Echo接PB1(TIM3_CH4)。
  2. 软件策略:每20ms触发一次超声波测量,同时每10ms采样一次红外ADC。若超声波脉宽对应距离小于5cm,则信任红外数据;若红外电压对应距离大于50cm,则信任超声波数据;中间区域取两者加权平均。
  3. 实测数据:在30cm处,红外输出1.1V(查表得28.5cm),超声波脉宽1.75ms(得29.8cm),加权后距离29.2cm,误差±1.5cm。
  4. 结果:融合后有效测距范围扩展至5~80cm,且近距离盲区消除。代价是CPU占用增加约5%(用于滤波和查表),但换来了更稳定的避障性能。
复盘:传感器融合不是简单取平均,而是根据各传感器置信区间动态切换或加权。红外在近距离精度高但远距离非线性严重,超声波在远距离稳定但近距离有盲区。通过设定阈值切换,可发挥各自优势。后续可加入卡尔曼滤波进一步平滑数据,但需评估STM32的算力开销。

4.7 常见误区与总结

  • 误区一:所有传感器都直接接GPIO。实际上,模拟传感器必须接ADC引脚,PWM输出必须接定时器输入捕获通道,否则无法正确读取。
  • 误区二:忽略电平转换。5V传感器输出直接接3.3V STM32引脚,可能损坏GPIO或导致逻辑混乱。应使用电平转换芯片或分压电阻。
  • 误区三:不处理编码器溢出。16位计数器在高速旋转下很快溢出,若不处理会导致转速计算错误。
  • 误区四:IMU数据不滤波直接使用。原始加速度计噪声大,陀螺仪有温漂,必须经过滤波和零偏补偿。
  • 误区五:摄像头帧率越高越好。高帧率意味着更大的DMA带宽和CPU中断负载,需根据实际任务选择合适分辨率与帧率。