编写对EPOS4控制板的工程文件,这里选用的方法是基于正点原子407的can通信实验为模板进行修改:
在研究MAXON官方的数据手册后,在如下地方做出修改
(1)去除冗余功能,如LCD、串口。(若有需要分析代码问题可以采用can分析仪)
(2)按照EPOS4要求,将正点原子can初始化部分的500kHZ修改为1000kHZ,发送模式改为普通模式,具体修改后的代码如下:
can_init(CAN_SJW_1TQ, CAN_BS2_6TQ, CAN_BS1_7TQ, 3, CAN_MODE_NORMAL);
/* CAN初始化, 普通模式, 波特率1000Kbps */
(3)需要注意的是,在实际测试中发现EPOS4控制板在初始化时常常不成功,需要反复按下单片机复位按键才可成功初始化。(连接多个控制板时尤为明显)简单研究后认为是can通信时发送命令过快导致控制板未及时响应,在每次发送命令后加入延时函数等待响应后问题得以解决。(之后有空可以研究下can的发送时间问题)
EPOS4_Init(0x01);
delay_ms(100);
EPOS4_Init(0x02);
delay_ms(100);
EPOS4_Init(0x03);
delay_ms(100);
EPOS4_Init(0x04);
delay_ms(100);
can_send_msg(node,canbuf0,8);
delay_ms(10);
can_send_msg(node,canbuf1,8);
delay_ms(10);
can_send_msg(node,canbuf3,8);
delay_ms(10);
can_send_msg(node,canbuf4,8);
delay_ms(10);
(4)由于电机安装方向不同,左右腿运转到相同位置需要取反
(5)编程时有必要将多余的0写出,以便为负数时保持正确,具体示例见如下分享的完整主函数代码部分:
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./USMART/usmart.h"
#include "./BSP/KEY/key.h"
#include "./BSP/CAN/can.h"
int main(void)
{
uint8_t key;
uint8_t t = 0;
uint8_t cnt = 0;
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
usmart_dev.init(84); /* 初始化USMART */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
can_init(CAN_SJW_1TQ, CAN_BS2_6TQ, CAN_BS1_7TQ, 3, CAN_MODE_NORMAL); /* CAN初始化, 普通模式, 波特率1000Kbps */
EPOS4_Init(0x01);
delay_ms(100);
EPOS4_Init(0x02);
delay_ms(100);
EPOS4_Init(0x03);
delay_ms(100);
EPOS4_Init(0x04);
delay_ms(100);
//编号1,2为左腿髋膝电机
//由于电机安装方向不同,左右腿运转到相同位置需要取反
//编程时有必要将多余的0写出,以便为负数时保持正确
while (1)
{
key = key_scan(0);
if (key == KEY0_PRES) {
switch (cnt){
case 0:
Profile_Position_Mode(0x01,0x00000000,0x01F4);
Profile_Position_Mode(0x02,0x00000000,0x07D0);
Profile_Position_Mode(0x03,0x0000012C,0x01F4);
Profile_Position_Mode(0x04,0x00000190,0x07D0);
cnt++;
break;
case 1:
Profile_Position_Mode(0x01,0xFFFFFED4,0x01F4);
Profile_Position_Mode(0x02,0xFFFFFE70,0x07D0);
Profile_Position_Mode(0x03,0xFFFFFE0C,0x01F4);
Profile_Position_Mode(0x04,0x00000320,0x07D0);
cnt++;
break;
case 2:
Profile_Position_Mode(0x01,0x000001F4,0x01F4);
Profile_Position_Mode(0x02,0xFFFFFCE0,0x07D0);
Profile_Position_Mode(0x03,0x00000000,0x01F4);
Profile_Position_Mode(0x04,0x00000000,0x07D0);
cnt++;
break;
}
if(cnt == 3){
cnt = 0;
}
}
t++;
delay_ms(10);
if (t == 20)
{
LED0_TOGGLE(); /* 提示系统正在运行 */
t = 0;
}
}
}
下一节来解析初始化与驱动电机的具体can命令部分。