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

  • 相关阅读:
    Android 横屏启动activity,点击屏幕的单击、双击
    实现Android简单动画旋转案例
    当时遇到的主要难点在于TextView的内容不会刷新改变值,今天终于通过Timer和Handler实现了,分享给大家
    如何在Android当中显示网络图片
    Android的MediaRecorder架构介绍
    理解Android系统的进程间通信原理RPC机制
    Android开发WeatherForecast程序
    Android 如何导入已有的外部数据库
    百度地图API 源码
    Android TelephonyManager类
  • 原文地址:https://www.cnblogs.com/Fangjq2020/p/13224821.html
Copyright © 2020-2023  润新知