江西伺泰威公司在去年的时候发布了一款价格十分诱人的关节电机,型号为GIM6010-8,其额定扭矩在5牛米,峰值扭矩则可以达到11牛米,在和小米微电机同样的单编码器条件下价格甚至比小米微电机还要便宜,只要399元,而双编码器也只要449。很香的一款电机啊,所以买下以后用来做个小机器人来测试性能,下面我会介绍怎样用STM32来控制GIM6010-8。
首先,了解一个产品我们需要获取它的文档,链接如下:GIM6010-8 - 江西伺泰威自动化设备有限公司 (steadywin.cn)
伺泰威关节电机交流群(QQ):587865541
在下载了文档后,我们首先根据文档内容进行所需要的环境配置:
截止目前(2024-2-26),对于GIM6010-8貌似是不支持使用电机精灵进行调试,且出厂的驱动器已经安装USB驱动,无需再次进行安装。
在完成了环境配置之后,我们就可以通过USB来对电机进行配置,根据文档,我们选择windows中断或者powershell都可以进行配置,我们在打开终端后输入odrivetool来连接电机。
此时如果出现JSON文件无法读取连接错误的情况,可以重新插拔type-c口之后再重新打开一次中断重新连接,即可连接成功。
连接之后,我们就可以对电机进行配置,根据笔者的理解,usb主要是为了配置控制模式,电流限制,以及PID参数等等,使用STM32控制前可以通过先把这些参数配置完成,这样会让我们省去很多工作。
拿到新电机以后,我们首先需要对其进行校准,校准的命令如下:
odrv0.axis0.requested_state = 4
dump_errors(odrv0)
odrv0.axis0.requested_state = 7
dump_errors(odrv0)
odrv0.axis0.motor.config.pre_calibrated = 1
odrv0.axis0.encoder.config.pre_calibrated = 1
odrv0.save_configuration()
odrv0.axis0.config.can.node_id=1 //修改电机的id号
odrv0.axis0.controller.config.control_mode=2 //设置控制模式为速度控制
odrv0.axis0.controller.config.input_mode=1 //设置输入的控制值以什么方式运转,我选择的是直接控制
odrv0.axis0.controller.config.vel_gain=0.3
odrv0.axis0.controller.config.vel_integrator_gain=0.6//设置速度环的P与I的值
odrv0.save_configuration() //保存配置
在配置完成之后,我们可以选择先通过USB来控制电机PI参数等是否设置合理,我们进行如下操作:
odrv0.axis0.requested_state=8 //电机进入闭环控制模式
odrv0.axis0.controller.input_vel=2 //给电机目标速度值 2rad/s
若此时电机正常转动,则表示我们配置成功,之后我们就可以进行最后一步:
odrv0.axis0.controller.input_vel=0 //给电机目标速度值 0rad/s
odrv0.axis0.requested_state=1 //电机进入空闲模式
odrv0.config.enable_can_a=True//打开can通信开关
odrv0.save_configuration() //保存配置
目前(2024-2-26)电机的固件版本为3.7,其不支持USB与CAN通信兼容,所以需要手动打开CAN通信,此CAN通信的波特率为500k,不要先入为主进行1M的波特率设置。(点名批评RM电机)当然,你也可以通过odrivetool中的命令来修改波特率。
完成上述配置之后我们就可以进行STM32开发了,笔者使用的是STM32CubeMx + Clion进行开发,首先我们需要在CubeMx上进行can通信的配置,其余配置请参考其他优秀文章,大疆c板的配置网上有大量开源资料,这里不再赘述。
截止到此,在Cubemx上的配置结束了,由于笔者在项目中驱动电机,使用了Freertos,不方便直接展示,我会给大家介绍驱动需要的函数步骤:
can1_filter_init(); //can通信需要对其过滤器进行配置
Motor_Init();//初始化所有电机使其都进入闭环控制模式
Read_beginPos(); //读取电机上电时候的初始位置
Eight_PID_Init(); //八个电机的位置环PID初始化
· 电机驱动所需要的初始化就是这些,之后只要调用相应的输入参数的函数即可控制,下面贴出来笔者写的部分通信用的命令等:
odrive.c
#include "odrive.h"
#include "can.h"
float begin_pos[9];
union_32 union_32f;
union_16 union_16f;
SetState Setstate;
SetMode Setmode;
Feedback GIM6010[9];
/**
* 输出目标速度值
* @param _hcan
* @param Input_Vel
* @param Torque
* @param stdid
*/
void Odrive_Axis_Set_Input_Vel(CAN_HandleTypeDef *_hcan, float Input_Vel,float Torque,uint32_t stdid)
{
CAN_TxHeaderTypeDef TxHeader;
uint8_t TxData[8];
uint32_t mbox; //发送使用到的can邮箱
TxHeader.StdId = stdid;
TxHeader.IDE = 0;
TxHeader.RTR = 0;
TxHeader.DLC = 8;
union_32f.data_f = Input_Vel;
TxData[0] = union_32f.data_8[0];
TxData[1] = union_32f.data_8[1];
TxData[2] = union_32f.data_8[2];
TxData[3] = union_32f.data_8[3];
union_32f.data_f = Torque;
TxData[4] = union_32f.data_8[0];
TxData[5] = union_32f.data_8[1];
TxData[6] = union_32f.data_8[2];
TxData[7] = union_32f.data_8[3];
//等一个空の邮箱呢
while(HAL_CAN_GetTxMailboxesFreeLevel(_hcan) == 0);
//发送成功了吗?失败就卡住了捏
if (HAL_CAN_AddTxMessage(_hcan, &TxHeader, TxData, &mbox) != HAL_OK)
{
Error_Handler();
}
}
/**
* 输出目标角度值
* @param _hcan
* @param Input_Pos
* @param Vel_FF
* @param Torque_FF
* @param stdid
*/
void Odrive_Axis_Set_Input_Position(CAN_HandleTypeDef *_hcan, float Input_Pos,int16_t Vel_FF,int16_t Torque_FF,