C語言 負數轉十六進制 電機轉速 CANopen命令轉換


速度模式下控制電機的過程中需要把算法計算得出的目標轉速通過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 的負向轉速讓電機轉動。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM