从轮子转速到小车速度:编码器测速的完整参数计算与单位换算指南(附STM32代码)

张开发
2026/4/15 11:46:40 15 分钟阅读

分享文章

从轮子转速到小车速度:编码器测速的完整参数计算与单位换算指南(附STM32代码)
从编码器脉冲到实际速度工程实践中的完整计算与STM32实现在移动机器人或智能车开发中精确测量轮子转速是运动控制的基础。许多开发者虽然能够读取编码器脉冲数却常常卡在如何将这些原始数据转换为有物理意义的实际速度如m/s或RPM这一环节。本文将彻底拆解从脉冲计数到速度计算的完整链条提供可直接应用于STM32平台的解决方案。1. 编码器测速的核心参数体系1.1 编码器基础参数解析编码器的核心指标是线数(PPR)即旋转一圈产生的脉冲数。常见类型有光电编码器通常500-5000PPR霍尔编码器常见13-100PPR四倍频技术通过检测A、B相脉冲的上升沿和下降沿将分辨率提高4倍。例如13线编码器实际可用脉冲数为实际脉冲数 13 × 4 52 脉冲/转1.2 电机减速比的影响减速比表示电机输入轴与输出轴的转速比例如减速比表示输入转速输出转速30:130rpm1rpm120:1120rpm1rpm最终轮子转一圈的总脉冲数计算公式总脉冲数 编码器线数 × 减速比 × 41.3 轮子尺寸的关键作用轮子直径直接影响线速度计算。测量时需注意使用游标卡尺确保精度考虑轮胎变形对实际直径的影响单位统一为米(m)便于计算典型转换示例65mm 0.065m 周长 π × D 3.1416 × 0.065 ≈ 0.204m2. 速度计算的数学建模2.1 脉冲到转速的转换设定时器采样周期为T(秒)测得脉冲数为N则转速计算公式转速(rpm) (N × 60) / (总脉冲数 × T)2.2 线速度的完整推导线速度计算涉及以下步骤计算单位时间内的轮子转数转数 N / 总脉冲数计算行进距离距离 转数 × 周长 (N / 总脉冲数) × (π × D)得到线速度速度 距离 / T (N × π × D) / (总脉冲数 × T)2.3 单位换算技巧常用速度单位转换关系m/s → mm/s×1000rpm → rad/s×0.1047mm/s → km/h×0.0036示例代码中的转换系数0.00002722713实际上是(π × D) / (总脉冲数 × T) × 1000 (转为mm/s)3. STM32硬件实现方案3.1 编码器接口配置STM32的TIMx编码器模式可直接实现四倍频计数void Encoder_Config(void) { TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_SetAutoreload(TIM3, 65535); // 16位最大值 TIM_Cmd(TIM3, ENABLE); }3.2 定时器采样实现使用基本定时器实现固定周期速度计算void TIM4_Config(uint16_t arr, uint16_t psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseStructure.TIM_Period arr; TIM_TimeBaseStructure.TIM_Prescaler psc; TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, TIM_TimeBaseStructure); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); NVIC_InitStructure.NVIC_IRQChannel TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); TIM_Cmd(TIM4, ENABLE); }3.3 速度计算中断处理在定时器中断中完成速度计算void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4, TIM_IT_Update) ! RESET) { int16_t current_count TIM_GetCounter(TIM3); int16_t pulse_diff current_count - last_count; // 处理计数器溢出 if(pulse_diff 32767) pulse_diff - 65536; else if(pulse_diff -32768) pulse_diff 65536; // 计算速度(mm/s) speed_mm_s pulse_diff * conversion_factor; last_count current_count; TIM_ClearITPendingBit(TIM4, TIM_IT_Update); } }4. 工程实践中的优化技巧4.1 采样周期的选择考量不同应用场景下的采样周期建议应用场景推荐采样周期考虑因素高速巡航10-50ms响应速度与噪声平衡精准定位100-500ms提高测量稳定性PID控制反馈5-20ms与控制周期匹配4.2 数据滤波处理方法常用滤波算法实现#define FILTER_LENGTH 5 int32_t moving_average_filter(int32_t new_value) { static int32_t buffer[FILTER_LENGTH] {0}; static uint8_t index 0; static int32_t sum 0; sum - buffer[index]; buffer[index] new_value; sum buffer[index]; index (index 1) % FILTER_LENGTH; return sum / FILTER_LENGTH; }4.3 方向判断的可靠实现利用A、B相信号的相位差判断方向if(GPIO_ReadInputDataBit(GPIOB, ENCODER_A_PIN) 1) { if(GPIO_ReadInputDataBit(GPIOB, ENCODER_B_PIN) 0) { // 正向旋转 direction 1; } else { // 反向旋转 direction -1; } }5. 不同应用场景的速度处理5.1 PID控制中的速度输入PID控制器对速度数据的要求数据更新频率高于控制频率适当的滤波处理单位统一(通常使用m/s或mm/s)速度转换系数示例// 500线编码器30:1减速比65mm轮径500ms采样 const float conversion_factor (3.1416f * 0.065f) / (500 * 30 * 4 * 0.5f) * 1000;5.2 里程计计算的积分处理位置估算的累积误差控制方法定期零点校准使用光电开关作为参考点结合IMU数据进行传感器融合5.3 多轮系统的同步考量对于差速驱动系统需要左右轮编码器单独校准考虑轮径差异的影响实现软件层面的脉冲补偿在智能车竞赛中我们通过实验发现轮径即使有0.5mm的差异在10米行驶后也会产生约5cm的轨迹偏差。因此定期用标准距离校准脉冲当量至关重要。

更多文章