news 2026/4/23 14:48:10

编码器测速思路,以及如何进行测速,速度调整

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
编码器测速思路,以及如何进行测速,速度调整

一、基本设定(为了理解)

ARR = 10(你设定的测试值) CNT范围:0, 1, 2, 3, 4, 5, 6, 7, 8, 9(共10个值) 溢出:从9→0(正向)或从0→9(反向)

二、为什么n * 10是溢出部分的总脉冲?

先看一个直观的例子:

假设:电机一直在正向旋转,我们观察CNT变化:
时间:t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 CNT: 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 0 → 1 → 2 标志: ↑ ↑ ↑ 正常计数 溢出! 正常计数
计数过程分解:
  1. 第一次完整循环:0→9(10个脉冲)
  • 当CNT从9变成0时,发生溢出
  • n++(n从0变成1)
  • 这10个脉冲就是n * 10中的第一个10
  1. 第二次计数:0→2
  • 这是当前未完成的循环
  • 计数值x=2
  • 这部分还没溢出,所以不计入n

数学表达:

总脉冲数 = 已完成的完整循环数 × 每循环脉冲数 + 当前部分脉冲数 = n × 10 + x
其中:
  • n:完整循环的次数(每次溢出记一次)
  • 10:每个完整循环的脉冲数(0-9共10个值)
  • x:当前循环已走的脉冲数(0到当前值)

三、分解说明n × 10的含义

情景1:n = 1(溢出1次)

n × 10 = 1 × 10 = 10个脉冲 含义:已经完整地走完了1个0→9的循环

情景2:n = 3(溢出3次)

n × 10 = 3 × 10 = 30个脉冲 含义:已经完整地走完了3个0→9的循环

用更生活化的比喻:

比喻1:汽车的里程表(老式,会归零)
里程表范围:00000-99999(相当于ARR=100000) 1. 你开了50000公里:里程表显示50000 2. 你再开50000公里:里程表回到00000(溢出) 3. 你又开了30000公里:里程表显示30000 实际总里程 = 溢出的100000 + 当前的30000 = 130000公里 这里的100000就是 n×ARR(n=1, ARR=100000)
比喻2:时钟(12小时制)
时钟范围:1-12点(ARR=12) 1. 从3点开始 2. 经过24小时(溢出2圈) 3. 停在5点 实际经过时间 = 2圈×12小时 + 从3点到5点的2小时 = 2×12 + 2 = 26小时

四、具体数值示例(ARR=10)

示例1:正向旋转,中等速度

初始状态:TIM2开始时,CNT=0, n=0 旋转过程: 脉冲# | CNT | n | 说明 -------|-----|-----|---------- 第1个 | 1 | 0 | 正常计数 第2个 | 2 | 0 | 正常计数 ... | ... | ... | ... 第9个 | 9 | 0 | 正常计数 第10个 | 0 | 1 | 溢出!n++ 第11个 | 1 | 1 | 新循环开始 第12个 | 2 | 1 | 新循环继续 TIM2结束时: x = CNT = 2 n = 1 计算: total = x + n×10 = 2 + 1×10 = 2 + 10 = 12个脉冲 验证:确实经过了12个脉冲(第1-12个)

示例2:正向旋转,更快速度

初始:CNT=0, n=0 过程:旋转了32个脉冲 详细过程: 第1-10个脉冲:CNT:0→9,然后溢出,n=1 第11-20个脉冲:CNT:0→9,再次溢出,n=2 第21-30个脉冲:CNT:0→9,再次溢出,n=3 第31-32个脉冲:CNT:0→1,n=3 结束时: x = 1 n = 3 计算: total = 1 + 3×10 = 1 + 30 = 31个脉冲?等等,应该是32! 问题:这里有个差1的错误!

五、重要纠正:差1错误!

这里有一个常见的边界错误
正确理解:
  • 当CNT从9变成0时,n增加1
  • 但这表示已经完成了10个脉冲(0,1,2,...,9)
  • 所以n × 10确实对应了已完成的脉冲数
但是,我们的计数方式有微妙差异:

实际脉冲数计算应该是:

总脉冲数 = n × 10 + x
但这里的x是当前值,不是当前循环已走脉冲数
正确公式(考虑从0开始计数):
总脉冲数 = n × 10 + (x - 开始时的CNT值)
如果开始时CNT=0,结束时CNT=x,那么:
总脉冲数 = n × 10 + x
这是正确的!

验证示例2(32个脉冲):

开始:CNT=0 过程: 第1-10个脉冲:CNT从0→9,溢出时n=1 第11-20个脉冲:CNT从0→9,溢出时n=2 第21-30个脉冲:CNT从0→9,溢出时n=3 第31-32个脉冲:CNT从0→1 结束: x = 1 n = 3 计算: total = 1 + 3×10 = 1 + 30 = 31 ❌
问题在哪?
实际上,当第30个脉冲时,CNT=9
第31个脉冲:CNT=0,n=4(不是3!)
第32个脉冲:CNT=1
所以应该是:
x = 1 n = 4 total = 1 + 4×10 = 41 ❌(更错了)

六、正确的思考方式

关键在于:溢出发生在CNT回到0的那一刻,而不是在9的时候。

重新思考:

每个完整循环:CNT变化 0→1→2→...→9→0 ↑ 这里发生溢出 脉冲计数: 当CNT=0时,表示: 1. 要么还没开始(0脉冲) 2. 要么刚完成一个循环(10个脉冲) 所以,当CNT=x时: - 如果x>0,表示当前循环已走了x个脉冲 - n表示之前已完成的全循环数

正确示例(32个脉冲):

开始:CNT=0(表示尚未开始,或刚复位) 过程: 脉冲# 变化 CNT n 1 0→1 1 0 2 1→2 2 0 ... 10 9→0 0 1 ← 溢出!完成10个脉冲 11 0→1 1 1 12 1→2 2 1 ... 20 9→0 0 2 ← 溢出!又完成10个脉冲(共20) 21 0→1 1 2 22 1→2 2 2 ... 30 9→0 0 3 ← 溢出!又完成10个脉冲(共30) 31 0→1 1 3 32 1→2 2 3 ← 停止 结束: x = 2 n = 3 计算: total = x + n×10 = 2 + 3×10 = 2 + 30 = 32 ✓

七、总结公式

对于ARR=M(你的情况M=10)的编码器:

正向旋转(n≥0):

总脉冲数 = 当前CNT值 + n × M
解释:
  • n × M:已完成的全循环脉冲数
  • 当前CNT值:当前循环已走的脉冲数(从0开始)

反向旋转(n<0):

总脉冲数 = 当前CNT值 + n × M
注意:n是负数,所以结果是负数,表示反向脉冲数
例如:n=-2, x=3, M=10
total = 3 + (-2)×10 = 3 - 20 = -17 表示反向17个脉冲

八、为什么你的代码反向公式不同?

你的代码:
total = (10-x) - (n+1)*10; // 对于反向
这其实是在尝试计算绝对值,但会丢失方向信息。
建议统一公式:
// 无论正反向,统一使用: total = x + n * M; // n可正可负
这样:
  • 结果>0:正向旋转
  • 结果=0:静止
  • 结果<0:反向旋转
数值的正负直接表示了方向!
这就是n × M作为溢出部分总脉冲的完整解释。关键是理解:每次溢出代表完成了一个完整的M个脉冲循环
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 11:22:00

Java计算机毕设之基于SpringBoot的二手车交易平台设计与实现基于springboot+vue技术的二手车交易管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/17 16:06:31

PCIe-QW对齐

QW对齐 1. 基本定义 DW(Double Word):双字 = 4字节(32位) QW(Quad Word):四字 = 8字节(64位)= 2个DW QW对齐:地址必须是8字节的整数倍 2. 地址对齐的判断 在二进制层面: DW对齐:地址低2位为 00b(4字节边界) QW对齐:地址低3位为 000b(8字节边界) // 地…

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

12.24 - 螺旋矩阵 指针和引用的区别

目录 1.螺旋矩阵 a.核心思想 b.思路 c.步骤 2.指针和引用的区别 1.螺旋矩阵 54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/spiral-matrix/ class Solution { public:vector<int> spiralOrder(vector<vector<int>&g…

作者头像 李华
网站建设 2026/4/23 11:28:17

HR 年终总结 PPT 工具测评:哪款最适合人事岗位?

又是一年年末&#xff0c;HR 们的噩梦时刻来临了&#xff01;堆积如山的年终总结报告&#xff0c;从员工绩效分析、招聘成果展示到培训效果评估&#xff0c;每一项都得精心整理成 PPT。可现实却是&#xff0c;熬夜加班改报告成了常态&#xff0c;内容框架混乱得像一团乱麻&…

作者头像 李华
网站建设 2026/4/23 11:26:48

《深度学习》CUDA安装配置、pytorch库、torchvision库、torchaudio库安装

一、下载CUDA 1.什么是CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA推出的并行计算平台和编程模型&#xff0c;允许开发者利用NVIDIA GPU的并行计算能力加速计算密集型任务。它通过扩展C/C等语言&#xff0c;提供直接访问GPU虚拟指令集和…

作者头像 李华
网站建设 2026/4/23 11:32:49

国产AI播客:告别费眼阅读,开启“听识”时代

在企业日常运营中&#xff0c;我们积累了大量高价值的私域文档——产品白皮书、内部培训资料、项目复盘报告、市场分析、标准操作流程……这些文档是组织的核心知识资产&#xff0c;但传统的阅读与传播方式却让它们大多沉睡在硬盘或云端&#xff0c;难以被高效利用和吸收。私域…

作者头像 李华