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 的负向转速让电机转动。

 

posted @ 2020-06-11 15:05  有梦想的人不睡觉Zzz  阅读(1421)  评论(0编辑  收藏  举报