I2C は,byte しか送れない。
そこで,fload 型の目標電流値は,つぎのように送受信する:
正値
SBC側 MCU側
1.5(A) 1.5(A)
↓ ↑
1500(mA) 1500(mA)
↓ ↑
0x05DC 0x05DC
↓ ↑
0x05 | 0xDC
(I2C 送受信)
負値
SBC側 MCU側
−0.8 −0.8)
↓ ↑
−800 −800
↓ ↑
0xFCE0 0xFCE0
↓ ↑
0xFC | 0xE0
(I2C 送受信)
負値は 「補数」 で表現する。
800 = 3 x 256 + 2 x 16 = 0x0320
−800 = 0x0320 の補数 = 0xFCE0
- 単位A の数値を,単位 mA の数値に変換
単位A の目標電流値は
float32[12]
これを単位 mA の数値にして,さらに
int16[12]
にカット。
int16 は
−32768 〜 +32767
なので,電流値の表現はこの方法で問題ない。
- int16 (16bit) の byte 表現
この表現は,
上位byte + 下位byte
int16 value を上位byte と下位byte に分解する計算式は:
high = (value >> 8) & 0xFF
low = value & 0xFF
ここで ">> 8" は 「8bit 右シフト」,"& 0xFF" は 「0xFF と論理積 (→下位8bit を取る)」。
よって,整数の配列 current_mA を2byte の配列 data に変換するアルゴリズムは:
data = []
for value in current_mA:
high = (value >> 8) & 0xFF
low = value & 0xFF
data.append(high)
data.append(low)
|