Makerbase oDrive第九课 CAN测试
标题第1部分 硬件介绍1.1 硬件清单序号品名数量1ODRIVE主板12MKS X2212电机13MKS X2212电机14USB数据线1512V 2.0A电源适配器16杜邦线27编码器连接线1850W 2欧 耗散电阻19CANable_Z USB to CAN1硬件清单如下图所示。1.2 硬件连接电机与ODrive主板接线参考之前课程,这次需要介绍的是CANable_Z与主板,连接。
第1部分 硬件介绍
1.1 硬件清单
序号 | 品名 | 数量 |
---|---|---|
1 | ODRIVE主板 | 1 |
2 | MKS X2212电机 | 1 |
3 | MKS X2212电机 | 1 |
4 | USB数据线 | 1 |
5 | 12V 2.0A电源适配器 | 1 |
6 | 杜邦线 | 2 |
7 | 编码器连接线 | 1 |
8 | 50W 2欧 耗散电阻 | 1 |
9 | CANable_Z USB to CAN | 1 |
10 | micro USB 线 | 1 |
硬件清单如下图所示。
1.2 硬件连接
电机与ODrive主板、主板与PC接线参考之前课程,这次需要介绍的是CANable_Z与主板连接。
- ODrive主板CAN功能引脚为L、H;CANable_Z功能引脚为CAN L、CAN H。对应关系如下表格所示。
序号 | ODrive主板 | CANable_Z |
---|---|---|
CANL | L | CAN L |
CANH | H | CAN H |
-
两主板连线,一共连接2根线:
L----CAN L,
H----CAN H,
GND----GND(选接)。如下图所示。 -
用USB数据线将CANable_Z与PC连接。
-
硬件连接如下图所示:
第2部分 下载文件
-
测试组件可在CANable官网:https://canable.io/getting-started.html下载,也可以通过Q群(732557609)下载,如下图所示。
-
解压后文件如下图所示。
第3部分 配置准备
3.1 配置ODrive
-
打开
odrivetool
命令窗口。 -
配置Axis0的CAN Node ID为2。
odrv0.axis0.config.can_node_id = 0x010
-
配置CAN通讯波特率。
odrv0.can.set_baud_rate(250000)
-
保存配置。
odrv0.save_configuration()
-
重启主板。
odrv0.reboot()
3.2 配置CAN调试助手
- 打开下载好的CAN调试助手(cangaroo),如下图所示。
进入页面,如下图所示。
2.按F5,进入配置页面,选择candle0
,如下图1所示。
3.将波特率设置为250000
,如下图2所示;点击OK,如下图3所示。
4.配置成功,页面出现提示,CANable_Z的RX、TX灯亮,如下图所示。
5.若ODrive主板电源开启,则会有心跳信息返回且CANable_Z的TX灯闪烁,如下图所示。
第4部分 状态参数配置测试
- 状态配置命令如下表所示
命令 ID | 名称 | 信号 | 起始字节 | 信号类型 | 位 | 数量 | 补位 | 字节顺序 |
---|---|---|---|---|---|---|---|---|
0x007 | 设置Axis请求状态 | Axis Requested State | 0 | Unsigned Int | 32 | 1 | 0 | Intel |
-
在ODrive源代码
can_simple.cpp
文件的节点命令解析函数void CANSimple::handle_can_message(can_Message_t& msg)
中设置状态参数指令进行选择,如下图2所示。0x007指令选择执行
MSG_SET_AXIS_REQUESTED_STATE
,如下图3所示。注:ODrive接收到的每个命令都会在
void CANSimple::handle_can_message()
中先进行解析,然后选择对应的指令,往后不再说明命令解析与指令选择的内容。 -
在ODrive源代码
interfaces.hpp
文件中对状态参数(Axis State
)进行了定义,如下图2所示。 -
在ODrive源代码
can_simple.cpp
文件的void CANSimple::set_axis_requested_state_callback()
函数对状态的配置数据进行解析。can_getSignal()
读取起始位0,数据长度16位,类型为整型。如下图4所示。
4.1 检测电机参数
- 在Address输入栏中输入
207
(axis0 NodeID=2,CMDID=0x007
),如下图1所示。 - 在Payload的字节1中输入
04
(AXIS_STATE_MOTOR_CALIBRATION
),如下图2所示。 - 点击Send Single,如下图3所示。
- 发送成功,如下图4所示。
- 执行命令成功,返回心跳信息,如下图5所示。
- 这条命令执行成功约2秒后,应听到ODrive主板发出“哔”声音。
4.2 编码器偏移校准
-
在Address输入栏中输入
207
,如下图1所示。 -
Payload的字节1中输入
07
(AXIS_STATE_ENCODER_OFFSET_CALIBRATION
),如下图1所示。 -
点击Send Single。
-
执行命令成功,返回心跳信息,如下图2所示。
-
发送这条命令后,电机将正向转一圈,再反向转一圈。
注意:校准完成后会退出闭环模式,需要继续设置闭环。
4.3 设置闭环运行模式
- 在Address输入栏中输入
207
,如下图1所示。 - Payload的字节1中输入
08
(AXIS_STATE_CLOSED_LOOP_CONTROL
),如下图1所示。 - 点击Send Single。
- 执行命令成功,返回心跳信息,如下图所示。
- 发送这条命令后,电机将进入闭环模式。
第5部分 控制器参数配置
- 控制器参数配置命令如下表所示
命令 ID | 名称 | 信号 | 起始字节 | 信号类型 | 位 | 数量 | 补位 | 字节顺序 |
---|---|---|---|---|---|---|---|---|
0x00B | 设置控制器模式 | Control Mode | 0 | Unsigned Int | 32 | 1 | 0 | Intel |
0x00B | 设置控制器模式 | Input Mode | 4 | Unsigned Int | 32 | 1 | 0 | Intel |
-
在ODrive源代码
interfaces.hpp
文件中对控制器模式(Control Mode&Input Mode
)进行了定义,如下图2所示。 -
在ODrive源代码can_simple.cpp文件的
void CANSimple::set_axis_requested_state_callback()
函数对控制器的配置数据进行解析。
控制模式(ControlMode)读取起始位0,数据长度32位,类型为整型。
输入模式(InputMode)读取起始位32位,数据长度32位,类型为整型。
如下图4所示。
5.1 配置位置控制与通用输入模式
- 在Address输入栏中输入
20B
。 - Payload的8个字节中分别输入
03 00 00 00 01 00 00 00
,如下图所示1。 - 点击Send Single。
- 执行命令成功,返回心跳信息,如下图所示2。
- 发送这条命令后,电机将进入位置控制、通用输入模式。
5.2 配置位置控制与梯形轨迹模式
1.在Address输入栏中输入20B
。
2.Payload的8个字节中分别输入03 00 00 00 05 00 00 00
,如下图所示1。
3.点击Send Single。
4.执行命令成功,返回心跳信息,如下图所示2。
5.发送这条命令后,电机将进入位置控制、梯形轨迹输入模式。
第6部分 电机控制测试
- 电机位置控制命令如下表所示
命令 ID | 名称 | 信号 | 起始字节 | 信号类型 | 位 | 数量 | 补位 | 字节顺序 |
---|---|---|---|---|---|---|---|---|
0x00C | 设定输入位置 | Input Pos | 0 | IEEE 754 Float | 32 | 1 | 0 | Intel |
0x00C | 设定输入位置 | Vel FF | 4 | Signed Int | 16 | 0.001 | 0 | Intel |
0x00C | 设定输入位置 | Torque FF | 6 | Signed Int | 16 | 0.001 | 0 | Intel |
- 在ODrive源代码
can_simple.cpp
文件的void CANSimple::set_input_pos_callback()
函数对电机控制的数据进行解析。
位置数据(input_pos)读取起始位0,数据长度32位,类型为浮点型。
速度数据(input_vel)读取起始位32位,数据长度16位,类型为整型。
扭矩数据(input_torque),读取起始位48位,数据长度16位,类型为整型。
如下图2所示。
6.1 控制电机正转50圈
-
打开下载好的4字节和浮点互转工具。如下图所示。
-
在4字节和浮点互转工具中转换出浮点数
50
的16进制字节(00 00 48 42
),如下图所示。 -
在Address输入栏中输入
20C
。 -
Payload的8个字节中分别输入
00 00 48 42 00 00 00 00
,如下图所示1。 -
点击Send Single。
-
执行命令成功,返回心跳信息,如下图所示2。
-
发送这条命令后,电机会正转50圈。
注意:若不设置速度,则速度为已配置的最大速度。
6.2 控制电机反转50圈
- 在4字节和浮点互转工具中转换出浮点数0的16进制字节。
- 在Address输入栏中输入
20C
。 - Payload的8个字节中分别输入
00 00 00 00 00 00 00 00
,如下图所示1。 - 点击Send Single。
- 执行命令成功,返回心跳信息,如下图所示2。
- 发送这条命令后,电机会反转50圈。
第7部分 查询主板数据测试
7.1 查询编码器位置和转速估值
- 获取编码器估算值命令如下表所示。
命令 ID | 名称 | 信号 | 起始字节 | 信号类型 | 位 | 数量 | 补位 | 字节顺序 |
---|---|---|---|---|---|---|---|---|
0x009 | 获取编码器估算值 | Encoder Pos Estimate | 0 | IEEE 754 Float | 32 | 1 | 0 | Intel |
0x009 | 获取编码器估算值 | Encoder Vel Estimate | 4 | IEEE 754 Float | 32 | 1 | 0 | Intel |
-
在ODrive源代码
can_simple.cpp
文件的void CANSimple::get_encoder_estimates_callback()
进行发送查询请求、数据整合。
发送查询编码器位置请求,如下图2所示,发送查询转速估值请求,如下图4所示。
对查询到的位置数据移位保存到数组元素0-3,等待发送,如下图3所示。
对查询到的转速数据保存到数组元素4-7,如下图5所示。 -
在Address输入栏中输入
209
。 -
Payload的1字节中输入
10
,如下图所示1。 -
选择RTR选项,如下图2所示。
-
点击Send Single。
-
执行命令成功,返回位置转速数据(
01 D7 4D 3D 00 00 00 00
)、心跳信息,如下图所示3。 -
对查询到的位置和转速的16进制数据转换。
前4字节为位置数据,即01 D7 4D 3D
,换算浮点为0.05025387
,如下图所示。
后4字节为转速数据,即00 00 00 00
,换算浮点为0。
7.2 查询总线电压
- 获取总线电压命令如下表所示。
命令 ID | 名称 | 信号 | 起始字节 | 信号类型 | 位 | 数量 | 补位 | 字节顺序 |
---|---|---|---|---|---|---|---|---|
0x017 | 获取总线电压 | Vbus Voltage | 0 | IEEE 754 Float | 32 | 1 | 0 | Intel |
0x017 | 获取总线电压 | Vbus Voltage | 4 | IEEE 754 Float | 32 | 1 | 0 | Intel |
-
在ODrive源代码
can_simple.cpp
文件的void CANSimple::get_vbus_voltage_callback()
进行发送总线电压查询请求、数据整合。
发送查询总线电压请求,如下图2所示。
对查询到的电压数据移位保存到数组元素0-3,多余数组元素4-7填0,如下图3所示。 -
在Address输入栏中输入
217
,如下图所示1。 -
Payload的1字节中输入
10
,如下图所示1。 -
选择RTR选项,如下图2所示。
-
点击Send Single。
-
执行命令成功,返回总线电压数据(
33 8D 56 41 00 00 00 00
)、心跳信息,如下图所示3。 -
对查询到的位置和转速的16进制数据转换。
前4字节为总线电压数据,即33 8D 56 41
,换算浮点为13.40947
,如下图所示。
第8部分 重启ODrive测试
- 获取总线电压命令如下表所示。
命令 ID | 名称 | 信号 | 起始字节 | 信号类型 | 位 | 数量 | 补位 | 字节顺序 |
---|---|---|---|---|---|---|---|---|
0x016 | 重启ODrive | - | - | - | - | - | - | - |
-
在ODrive源代码
core_cm0.h
文件中对重启进行函数(NVIC_SystemReset()
)定义,如下图4所示。 -
在Address输入栏中输入
216
,如下图1所示。 -
Payload中不需要填写,如图1。
-
点击Send Single。
-
执行命令成功,返回心跳信息,如下图3所示。
-
发送这条命令后,ODrive会重启启动,电机正转一圈再反转一圈进行校准。
至此, ODrive CAN测试完成。
创客基地oDrive第九课 ODrive CAN测试 到此结束。
欢迎加入 创客基地 电机控制Q群 讨论电机控制相关问题:732557609
更多推荐
所有评论(0)