news 2026/4/15 11:46:38

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

作者头像

张小明

前端开发工程师

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

从编码器脉冲到实际速度:工程实践中的完整计算与STM32实现

在移动机器人或智能车开发中,精确测量轮子转速是运动控制的基础。许多开发者虽然能够读取编码器脉冲数,却常常卡在如何将这些原始数据转换为有物理意义的实际速度(如m/s或RPM)这一环节。本文将彻底拆解从脉冲计数到速度计算的完整链条,提供可直接应用于STM32平台的解决方案。

1. 编码器测速的核心参数体系

1.1 编码器基础参数解析

编码器的核心指标是线数(PPR),即旋转一圈产生的脉冲数。常见类型有:

  • 光电编码器:通常500-5000PPR
  • 霍尔编码器:常见13-100PPR

四倍频技术通过检测A、B相脉冲的上升沿和下降沿,将分辨率提高4倍。例如13线编码器实际可用脉冲数为:

实际脉冲数 = 13 × 4 = 52 脉冲/转

1.2 电机减速比的影响

减速比表示电机输入轴与输出轴的转速比,例如:

减速比表示输入转速输出转速
30:130rpm1rpm
120:1120rpm1rpm

最终轮子转一圈的总脉冲数计算公式:

总脉冲数 = 编码器线数 × 减速比 × 4

1.3 轮子尺寸的关键作用

轮子直径直接影响线速度计算。测量时需注意:

  • 使用游标卡尺确保精度
  • 考虑轮胎变形对实际直径的影响
  • 单位统一为米(m)便于计算

典型转换示例:

65mm = 0.065m 周长 = π × D = 3.1416 × 0.065 ≈ 0.204m

2. 速度计算的数学建模

2.1 脉冲到转速的转换

设定时器采样周期为T(秒),测得脉冲数为N,则转速计算公式:

转速(rpm) = (N × 60) / (总脉冲数 × T)

2.2 线速度的完整推导

线速度计算涉及以下步骤:

  1. 计算单位时间内的轮子转数:
    转数 = N / 总脉冲数
  2. 计算行进距离:
    距离 = 转数 × 周长 = (N / 总脉冲数) × (π × D)
  3. 得到线速度:
    速度 = 距离 / T = (N × π × D) / (总脉冲数 × T)

2.3 单位换算技巧

常用速度单位转换关系:

  • m/s → mm/s:×1000
  • rpm → rad/s:×0.1047
  • mm/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的轨迹偏差。因此定期用标准距离校准脉冲当量至关重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 11:44:00

别再盲目切分Transformer层了!20年分布式训练老兵曝光:多模态场景下模型并行粒度选择的3个反直觉铁律

第一章&#xff1a;多模态大模型模型并行训练的范式危机 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型正以前所未有的复杂度挑战分布式训练基础设施的底层假设——当视觉编码器、语音解码器、跨模态对齐模块与长上下文语言主干耦合时&#xff0c;传统张量并行&a…

作者头像 李华
网站建设 2026/4/15 11:43:36

Waifu2x-Extension-GUI完整解析:从模糊到清晰的终极AI放大指南

Waifu2x-Extension-GUI完整解析&#xff1a;从模糊到清晰的终极AI放大指南 【免费下载链接】Waifu2x-Extension-GUI Video, Image and GIF upscale/enlarge(Super-Resolution) and Video frame interpolation. Achieved with Waifu2x, Real-ESRGAN, Real-CUGAN, RTX Video Supe…

作者头像 李华
网站建设 2026/4/15 11:41:08

如何快速掌握闲鱼数据采集:新手友好的完整自动化教程

如何快速掌握闲鱼数据采集&#xff1a;新手友好的完整自动化教程 【免费下载链接】xianyu_spider 闲鱼APP数据爬虫 项目地址: https://gitcode.com/gh_mirrors/xia/xianyu_spider 想要高效获取闲鱼平台的市场数据吗&#xff1f;xianyu_spider项目为您提供了一个简单、免…

作者头像 李华
网站建设 2026/4/15 11:40:13

0142.环形链表 ii

题目链接 https://leetcode.cn/problems/linked-list-cycle-ii/ 题目描述 给定单链表 head&#xff0c;若链表中存在环&#xff0c;返回环的第一个进入节点&#xff08;环的入口&#xff09;&#xff1b;若不存在环则返回 null。 解题思路 Floyd 判圈 数学定位入口 第一阶…

作者头像 李华
网站建设 2026/4/15 11:38:20

Marimo 高危预认证 RCE 漏洞已遭活跃利用

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01;编译&#xff1a;代码卫士开源响应式 Python 笔记本平台 Marimo 中存在一个严重漏洞CVE-2026-39987&#xff08;CVSS评分9.3&#xff09;&#xff0c;攻击者无需认证即可实现远程代码执行 (RCE)&#xff0c;影响 Mari…

作者头像 李华
网站建设 2026/4/15 11:38:19

终极指南:如何让AirPods在Windows上获得完整功能体验

终极指南&#xff1a;如何让AirPods在Windows上获得完整功能体验 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop AirPodsDeskt…

作者头像 李华