Customer_controller/USER/dm_motor_ctrl.c

242 lines
12 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "dm_motor_drv.h"
#include "dm_motor_ctrl.h"
#include "string.h"
#include "stdbool.h"
motor_t motor[num];
/**
************************************************************************
* @brief: dm4310_motor_init: DM4310电机初始化函数
* @param: void
* @retval: void
* @details: 初始化1个DM4310型号的电机设置默认参数和控制模式。
* 设置ID、控制模式和命令模式等信息。
************************************************************************
**/
void dm_motor_init(void)
{
// 初始化Motor1和Motor2的电机结构
memset(&motor[Motor1], 0, sizeof(motor[Motor1]));
memset(&motor[Motor2], 0, sizeof(motor[Motor2]));
memset(&motor[Motor3], 0, sizeof(motor[Motor3]));
memset(&motor[Motor4], 0, sizeof(motor[Motor4]));
memset(&motor[Motor5], 0, sizeof(motor[Motor5]));
memset(&motor[Motor6], 0, sizeof(motor[Motor6]));
// 设置Motor1的电机信息
motor[Motor1].id = 0x01;
motor[Motor1].mst_id = 0x05;
motor[Motor1].tmp.read_flag = 1;
motor[Motor1].ctrl.mode = mit_mode;
motor[Motor1].ctrl.vel_set = 0.0f;
motor[Motor1].ctrl.pos_set = -1.7f;
motor[Motor1].ctrl.cur_set = 0.0f;
motor[Motor1].ctrl.kp_set = 1.0f;
motor[Motor1].ctrl.kd_set = 0.2f;
motor[Motor1].tmp.PMAX = 12.5f;
motor[Motor1].tmp.VMAX = 30.0f;
motor[Motor1].tmp.TMAX = 10.0f;
// 设置Motor2的电机信息
motor[Motor2].id = 0x02;
motor[Motor2].mst_id = 0x06;
motor[Motor2].tmp.read_flag = 1;
motor[Motor2].ctrl.mode = mit_mode;
motor[Motor2].ctrl.vel_set = 0.0f;
motor[Motor2].ctrl.pos_set = 0.0f;
motor[Motor2].ctrl.cur_set = 0.0f;
motor[Motor2].ctrl.kp_set = 1.0f;
motor[Motor2].ctrl.kd_set = 0.2f;
motor[Motor2].tmp.PMAX = 12.5f;
motor[Motor2].tmp.VMAX = 30.0f;
motor[Motor2].tmp.TMAX = 10.0f;
// 设置Motor3的电机信息
motor[Motor3].id = 0x03;
motor[Motor3].mst_id = 0x07;
motor[Motor3].tmp.read_flag = 1;
motor[Motor3].ctrl.mode = mit_mode;
motor[Motor3].ctrl.vel_set = 0.0f;
motor[Motor3].ctrl.pos_set = 0.0f;
motor[Motor3].ctrl.cur_set = 0.0f;
motor[Motor3].ctrl.kp_set = 1.0f;
motor[Motor3].ctrl.kd_set = 0.2f;
motor[Motor3].tmp.PMAX = 12.5f;
motor[Motor3].tmp.VMAX = 30.0f;
motor[Motor3].tmp.TMAX = 10.0f;
// 设置Motor4的电机信息
motor[Motor4].id = 0x04;
motor[Motor4].mst_id = 0x08;
motor[Motor4].tmp.read_flag = 1;
motor[Motor4].ctrl.mode = mit_mode;
motor[Motor4].ctrl.vel_set = 0.0f;
motor[Motor4].ctrl.pos_set = 0.0f;
motor[Motor4].ctrl.cur_set = 0.0f;
motor[Motor4].ctrl.kp_set = 0.0f;
motor[Motor4].ctrl.kd_set = 0.0f;
motor[Motor4].tmp.PMAX = 12.5f;
motor[Motor4].tmp.VMAX = 30.0f;
motor[Motor4].tmp.TMAX = 10.0f;
}
/**
************************************************************************
* @brief: read_all_motor_data: 读取电机的所有寄存器的数据信息
* @param: motor_t电机参数结构体
* @retval: void
* @details: 逐次发送读取命令
************************************************************************
**/
void read_all_motor_data(motor_t *motor)
{
switch (motor->tmp.read_flag)
{
case 1: read_motor_data(motor->id, RID_UV_VALUE); break; // UV_Value
case 2: read_motor_data(motor->id, RID_KT_VALUE); break; // KT_Value
case 3: read_motor_data(motor->id, RID_OT_VALUE); break; // OT_Value
case 4: read_motor_data(motor->id, RID_OC_VALUE); break; // OC_Value
case 5: read_motor_data(motor->id, RID_ACC); break; // ACC
case 6: read_motor_data(motor->id, RID_DEC); break; // DEC
case 7: read_motor_data(motor->id, RID_MAX_SPD); break; // MAX_SPD
case 8: read_motor_data(motor->id, RID_MST_ID); break; // MST_ID
case 9: read_motor_data(motor->id, RID_ESC_ID); break; // ESC_ID
case 10: read_motor_data(motor->id, RID_TIMEOUT); break; // TIMEOUT
case 11: read_motor_data(motor->id, RID_CMODE); break; // CTRL_MODE
case 12: read_motor_data(motor->id, RID_DAMP); break; // Damp
case 13: read_motor_data(motor->id, RID_INERTIA); break; // Inertia
case 14: read_motor_data(motor->id, RID_HW_VER); break; // Rsv1
case 15: read_motor_data(motor->id, RID_SW_VER); break; // sw_ver
case 16: read_motor_data(motor->id, RID_SN); break; // Rsv2
case 17: read_motor_data(motor->id, RID_NPP); break; // NPP
case 18: read_motor_data(motor->id, RID_RS); break; // Rs
case 19: read_motor_data(motor->id, RID_LS); break; // Ls
case 20: read_motor_data(motor->id, RID_FLUX); break; // Flux
case 21: read_motor_data(motor->id, RID_GR); break; // Gr
case 22: read_motor_data(motor->id, RID_PMAX); break; // PMAX
case 23: read_motor_data(motor->id, RID_VMAX); break; // VMAX
case 24: read_motor_data(motor->id, RID_TMAX); break; // TMAX
case 25: read_motor_data(motor->id, RID_I_BW); break; // I_BW
case 26: read_motor_data(motor->id, RID_KP_ASR); break; // KP_ASR
case 27: read_motor_data(motor->id, RID_KI_ASR); break; // KI_ASR
case 28: read_motor_data(motor->id, RID_KP_APR); break; // KP_APR
case 29: read_motor_data(motor->id, RID_KI_APR); break; // KI_APR
case 30: read_motor_data(motor->id, RID_OV_VALUE); break; // OV_Value
case 31: read_motor_data(motor->id, RID_GREF); break; // GREF
case 32: read_motor_data(motor->id, RID_DETA); break; // Deta
case 33: read_motor_data(motor->id, RID_V_BW); break; // V_BW
case 34: read_motor_data(motor->id, RID_IQ_CL); break; // IQ_c1
case 35: read_motor_data(motor->id, RID_VL_CL); break; // VL_c1
case 36: read_motor_data(motor->id, RID_CAN_BR); break; // can_br
case 37: read_motor_data(motor->id, RID_SUB_VER); break; // sub_ver
case 38: read_motor_data(motor->id, RID_U_OFF); break; // u_off
case 39: read_motor_data(motor->id, RID_V_OFF); break; // v_off
case 40: read_motor_data(motor->id, RID_K1); break; // k1
case 41: read_motor_data(motor->id, RID_K2); break; // k2
case 42: read_motor_data(motor->id, RID_M_OFF); break; // m_off
case 43: read_motor_data(motor->id, RID_DIR); break; // dir
case 44: read_motor_data(motor->id, RID_P_M); break; // pm
case 45: read_motor_data(motor->id, RID_X_OUT); break; // xout
}
}
/**
************************************************************************
* @brief: receive_motor_data: 接收电机返回的数据信息
* @param: motor_t电机参数结构体
* @param: data接收的数据
* @retval: void
* @details: 逐次接收电机回传的参数信息
************************************************************************
**/
void receive_motor_data(motor_t *motor, uint8_t *data)
{
if(motor->tmp.read_flag == 0)
return ;
float_type_u y;
if(data[2] == 0x33)
{
uint16_t rid_value = data[3];
y.b_val[0] = data[4];
y.b_val[1] = data[5];
y.b_val[2] = data[6];
y.b_val[3] = data[7];
switch (rid_value)
{
case RID_UV_VALUE: motor->tmp.UV_Value = y.f_val; motor->tmp.read_flag = 2; break;
case RID_KT_VALUE: motor->tmp.KT_Value = y.f_val; motor->tmp.read_flag = 3; break;
case RID_OT_VALUE: motor->tmp.OT_Value = y.f_val; motor->tmp.read_flag = 4; break;
case RID_OC_VALUE: motor->tmp.OC_Value = y.f_val; motor->tmp.read_flag = 5; break;
case RID_ACC: motor->tmp.ACC = y.f_val; motor->tmp.read_flag = 6; break;
case RID_DEC: motor->tmp.DEC = y.f_val; motor->tmp.read_flag = 7; break;
case RID_MAX_SPD: motor->tmp.MAX_SPD = y.f_val; motor->tmp.read_flag = 8; break;
case RID_MST_ID: motor->tmp.MST_ID = y.u_val; motor->tmp.read_flag = 9; break;
case RID_ESC_ID: motor->tmp.ESC_ID = y.u_val; motor->tmp.read_flag = 10; break;
case RID_TIMEOUT: motor->tmp.TIMEOUT = y.u_val; motor->tmp.read_flag = 11; break;
case RID_CMODE: motor->tmp.cmode = y.u_val; motor->tmp.read_flag = 12; break;
case RID_DAMP: motor->tmp.Damp = y.f_val; motor->tmp.read_flag = 13; break;
case RID_INERTIA: motor->tmp.Inertia = y.f_val; motor->tmp.read_flag = 14; break;
case RID_HW_VER: motor->tmp.hw_ver = y.u_val; motor->tmp.read_flag = 15; break;
case RID_SW_VER: motor->tmp.sw_ver = y.u_val; motor->tmp.read_flag = 16; break;
case RID_SN: motor->tmp.SN = y.u_val; motor->tmp.read_flag = 17; break;
case RID_NPP: motor->tmp.NPP = y.u_val; motor->tmp.read_flag = 18; break;
case RID_RS: motor->tmp.Rs = y.f_val; motor->tmp.read_flag = 19; break;
case RID_LS: motor->tmp.Ls = y.f_val; motor->tmp.read_flag = 20; break;
case RID_FLUX: motor->tmp.Flux = y.f_val; motor->tmp.read_flag = 21; break;
case RID_GR: motor->tmp.Gr = y.f_val; motor->tmp.read_flag = 22; break;
case RID_PMAX: motor->tmp.PMAX = y.f_val; motor->tmp.read_flag = 23; break;
case RID_VMAX: motor->tmp.VMAX = y.f_val; motor->tmp.read_flag = 24; break;
case RID_TMAX: motor->tmp.TMAX = y.f_val; motor->tmp.read_flag = 25; break;
case RID_I_BW: motor->tmp.I_BW = y.f_val; motor->tmp.read_flag = 26; break;
case RID_KP_ASR: motor->tmp.KP_ASR = y.f_val; motor->tmp.read_flag = 27; break;
case RID_KI_ASR: motor->tmp.KI_ASR = y.f_val; motor->tmp.read_flag = 28; break;
case RID_KP_APR: motor->tmp.KP_APR = y.f_val; motor->tmp.read_flag = 29; break;
case RID_KI_APR: motor->tmp.KI_APR = y.f_val; motor->tmp.read_flag = 30; break;
case RID_OV_VALUE: motor->tmp.OV_Value = y.f_val; motor->tmp.read_flag = 31; break;
case RID_GREF: motor->tmp.GREF = y.f_val; motor->tmp.read_flag = 32; break;
case RID_DETA: motor->tmp.Deta = y.f_val; motor->tmp.read_flag = 33; break;
case RID_V_BW: motor->tmp.V_BW = y.f_val; motor->tmp.read_flag = 34; break;
case RID_IQ_CL: motor->tmp.IQ_cl = y.f_val; motor->tmp.read_flag = 35; break;
case RID_VL_CL: motor->tmp.VL_cl = y.f_val; motor->tmp.read_flag = 36; break;
case RID_CAN_BR: motor->tmp.can_br = y.u_val; motor->tmp.read_flag = 37; break;
case RID_SUB_VER: motor->tmp.sub_ver = y.u_val; motor->tmp.read_flag = 38; break;
case RID_U_OFF: motor->tmp.u_off = y.f_val; motor->tmp.read_flag = 39; break;
case RID_V_OFF: motor->tmp.v_off = y.f_val; motor->tmp.read_flag = 40; break;
case RID_K1: motor->tmp.k1 = y.f_val; motor->tmp.read_flag = 41; break;
case RID_K2: motor->tmp.k2 = y.f_val; motor->tmp.read_flag = 42; break;
case RID_M_OFF: motor->tmp.m_off = y.f_val; motor->tmp.read_flag = 43; break;
case RID_DIR: motor->tmp.dir = y.f_val; motor->tmp.read_flag = 44; break;
case RID_P_M: motor->tmp.p_m = y.f_val; motor->tmp.read_flag = 45; break;
case RID_X_OUT: motor->tmp.x_out = y.f_val; motor->tmp.read_flag = 0 ; break;
}
}
}
/**
************************************************************************
* @brief: fdcan1_rx_callback: CAN1接收回调函数
* @param: void
* @retval: void
* @details: 处理CAN1接收中断回调根据接收到的ID和数据执行相应的处理。
* 当接收到ID为0时调用dm4310_fbdata函数更新Motor的反馈数据。
************************************************************************
**/
void fdcan1_rx_callback(void)
{
uint16_t rec_id;
uint8_t rx_data[8] = {0};
fdcanx_receive(&hfdcan1, &rec_id, rx_data);
switch (rec_id)
{
case 0x05: dm_motor_fbdata(&motor[Motor1], rx_data); receive_motor_data(&motor[Motor1], rx_data); break;
case 0x06: dm_motor_fbdata(&motor[Motor2], rx_data); receive_motor_data(&motor[Motor2], rx_data); break;
case 0x07: dm_motor_fbdata(&motor[Motor3], rx_data); receive_motor_data(&motor[Motor3], rx_data); break;
case 0x08: dm_motor_fbdata(&motor[Motor4], rx_data); receive_motor_data(&motor[Motor4], rx_data); break;
}
}