速度模式下控制電機的過程中需要把算法計算得出的目標轉速通過CANopen通訊協議,以十六進制的形式傳遞給電機驅動器。
由於接線順序的問題,需要電機以“負速度”的形式,也就是負向旋轉的方式轉動。這可以通過配置廠商特定的旋轉極性對象
(以菲仕電機驅動器為例,旋轉極性對象為5301h.0h ,默認0000h順時針旋轉,配置成FFFFh,逆時針旋轉);也可以通過發送
負速度(如“ - 50rad/s ”)的形式讓電機負向旋轉。
在C程序里可以利用強制轉換,由程序直接將十進制負數(int型)直接轉換成十六進制(long型),因為說白了兩者的二進制碼
沒有變化,只是“解碼”的方法不同。但是當嘗試在電腦上使用CAN調試助手,通過USB轉CAN直接和驅動器通訊,控制驅動器時,
十進制負數卻必須人工轉換成十六進制發送出去,就這這個機會學習了一下C語言中十進制負數轉十六進制的方法。
首先要明確一個概念,對於計算機來說,不論什么進制、有無符號,所有的數據都是以二進制的補碼形式存儲運算,只是在由對應的
二進制碼翻譯成我們想要的數據時,采用了不同的“解碼”方法,才有了進制、有無符號的區別。
對於有符號數,第一位的位置是表示的正負,為1時是負數,為0時是正數。無符號數則沒有符號位。
其次,正數的原碼、補碼、反碼是一致的,都是將十進制數按數值轉換成二進制碼即可。負數的原碼是將十進制數按相反數(也就是絕
對值)的數值轉換成二進制碼,並在首位符號位取1,反碼是原碼的數值位(也就是除了首位的符號位之外)取反,負數的補碼是反碼加1。
舉個例子:假設我們需要以 50rad/s 的負向轉速讓電機轉動,那么首先乘以一個電機驅動器廠商規定的單位比例系數(以菲仕電機驅動器
為例,該系數為85446)
-50*85446=-4272300
對於十進制下的4272300,二進制原碼為
00000000010000010011000010101100
那么十進制下的-4272300,二進制原碼為
10000000010000010011000010101100
-4272300對應的反碼是
11111111101111101100111101010011
-4272300對應的補碼是
11111111101111101100111101010100
把上面的補碼,當作單純的二進制碼,對應的十六進制數是
FFBECF54
那么在CAN調試助手內發送命令
23 FF 60 00 54 CF BE FF
即可讓電機以 50rad/s 的負向轉速讓電機轉動。