这是一个定点数线性映射的问题,通常用于将浮点型的物理量(如速度、位置、扭矩)转换为嵌入式系统中使用的整型数据格式,便于通过 CAN 总线或其它通信协议发送给电机控制器。
我们来逐步解析这个过程,并以“速度”为例说明如何生成 0xC71
,然后再推广到位置和扭矩。
🔧 一、速度值映射规则详解
已知条件:
- 当前速度:25.0 rad/s
- 速度范围:±45 rad/s → 即 [-45, +45]
- 使用 12位有符号整数 表示速度
- 映射公式:
VEL=25.0−(−45)45−(−45)×212+211VEL=45−(−45)25.0−(−45)×212+211
分析:
1. 线性映射原理
我们要把一个浮点数范围 [min_val, max_val] 映射到一个定点数范围 [0, 2^N - 1],其中 N 是位数。为了表示正负值,这里使用的是偏移二进制编码(Offset Binary),也叫补码偏移形式:
- 最小值对应编码
0
- 中间值对应零点(即 0 值)
- 最大值对应编码
2^N - 1
所以对于 [-VMAX, +VMAX] 的范围,映射方式是:
Code=(value−(−VMAX)2⋅VMAX)×2N=(value+VMAX2⋅VMAX)×2NCode=(2⋅VMAXvalue−(−VMAX))×2N=(2⋅VMAXvalue+VMAX)×2N
也可以写成:
Code=(value2⋅VMAX+0.5)×2NCode=(2⋅VMAXvalue+0.5)×2N
即:
VEL=(25.090)×4096+2048=0.2777...×4096+2048≈3185VEL=(9025.0)×4096+2048=0.2777...×4096+2048≈3185
2. 转换为十六进制:
3185 的十六进制是:
深色版本
3185₁₀ = 0xC71₁₆
这就是你看到的 0xC71
的来源。
📐 二、位置和扭矩的映射方法
类似地,我们可以写出它们的映射公式。
1. 位置(Position)
- 使用 16位有符号整数
- 假设位置范围是 ±Pmax(比如 ±π 弧度 或 ±10000 脉冲等)
- 映射公式:
POS=(position+Pmax2⋅Pmax)×216POS=(2⋅Pmaxposition+Pmax)×216
或者简化为:
POS=(position2⋅Pmax+0.5)×216POS=(2⋅Pmaxposition+0.5)×216
然后取整并转为十六进制即可。
2. 扭矩(Torque)
- 使用 12位有符号整数
- 假设最大输出力矩为 ±Tmax(例如 ±100% 额定扭矩)
- 映射公式:
TORQUE=(torque2⋅Tmax+0.5)×212TORQUE=(2⋅Tmaxtorque+0.5)×212
同样取整后转为十六进制。
✅ 示例:扭矩计算
假设当前扭矩为 30%,TMAX = 100%
TORQUE=(30200+0.5)×4096=(0.15+0.5)×4096=0.65×4096≈2662TORQUE=(20030+0.5)×4096=(0.15+0.5)×4096=0.65×4096≈2662
十六进制:0xA66
📌 总结
物理量 | 数据位宽 | 编码方式 | 公式 |
---|---|---|---|
速度 | 12位 | 偏移二进制 | VEL=(v2⋅Vmax+0.5)×212VEL=(2⋅Vmaxv+0.5)×212 |
位置 | 16位 | 偏移二进制 | POS=(p2⋅Pmax+0.5)×216POS=(2⋅Pmaxp+0.5)×216 |
扭矩 | 12位 | 偏移二进制 | TORQUE=(t2⋅Tmax+0.5)×212TORQUE=(2⋅Tmaxt+0.5)×212 |
如果你提供具体的数值范围和实际值,我可以帮你计算出具体的位置或扭矩的十六进制编码。