這是一個定點數線性映射的問題,通常用于將浮點型的物理量(如速度、位置、扭矩)轉換為嵌入式系統中使用的整型數據格式,便于通過 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?Pmax?position+Pmax??)×216
或者簡化為:
POS=(position2?Pmax+0.5)×216POS=(2?Pmax?position?+0.5)×216
然后取整并轉為十六進制即可。
2. 扭矩(Torque)
- 使用?12位有符號整數
- 假設最大輸出力矩為 ±Tmax(例如 ±100% 額定扭矩)
- 映射公式:
TORQUE=(torque2?Tmax+0.5)×212TORQUE=(2?Tmax?torque?+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?Vmax?v?+0.5)×212 |
位置 | 16位 | 偏移二進制 | POS=(p2?Pmax+0.5)×216POS=(2?Pmax?p?+0.5)×216 |
扭矩 | 12位 | 偏移二進制 | TORQUE=(t2?Tmax+0.5)×212TORQUE=(2?Tmax?t?+0.5)×212 |
如果你提供具體的數值范圍和實際值,我可以幫你計算出具體的位置或扭矩的十六進制編碼。