修复LK电机反馈异常和总线拥塞的问题
This commit is contained in:
parent
3cf1831237
commit
48326bbd5c
|
@ -134,7 +134,7 @@ void BalanceInit()
|
|||
.cali_mode = BMI088_CALIBRATE_ONLINE_MODE,
|
||||
.work_mode = BMI088_BLOCK_PERIODIC_MODE,
|
||||
};
|
||||
imu = BMI088Register(&imu_config);
|
||||
// imu = BMI088Register(&imu_config);
|
||||
|
||||
SuperCap_Init_Config_s cap_conf = {
|
||||
// 超级电容初始化
|
||||
|
@ -162,10 +162,28 @@ void BalanceInit()
|
|||
|
||||
Motor_Init_Config_s driven_conf = {
|
||||
// 写一个,剩下的修改方向和id即可
|
||||
.can_init_config.can_handle = &hcan1,
|
||||
.controller_param_init_config = {
|
||||
.current_PID = {
|
||||
.Kp = 1,
|
||||
.Ki = 0,
|
||||
.Kd = 0,
|
||||
.MaxOut = 500,
|
||||
},
|
||||
},
|
||||
.controller_setting_init_config = {
|
||||
.angle_feedback_source = MOTOR_FEED,
|
||||
.speed_feedback_source = MOTOR_FEED,
|
||||
.outer_loop_type = CURRENT_LOOP,
|
||||
.close_loop_type = CURRENT_LOOP,
|
||||
},
|
||||
.motor_type = LK9025,
|
||||
|
||||
};
|
||||
driven_conf.can_init_config.tx_id=1;
|
||||
l_driven = LKMotorInit(&driven_conf);
|
||||
|
||||
driven_conf.can_init_config.tx_id=2;
|
||||
r_driven = LKMotorInit(&driven_conf);
|
||||
|
||||
CANComm_Init_Config_s chassis_comm_conf = {
|
||||
|
|
|
@ -55,7 +55,7 @@ void GimbalInit()
|
|||
.work_mode=BMI088_BLOCK_PERIODIC_MODE,
|
||||
};
|
||||
// imu=BMI088Register(&imu_config);
|
||||
gimba_IMU_data = INS_Init(); // IMU先初始化,获取姿态数据指针赋给yaw电机的其他数据来源
|
||||
// gimba_IMU_data = INS_Init(); // IMU先初始化,获取姿态数据指针赋给yaw电机的其他数据来源
|
||||
// YAW
|
||||
Motor_Init_Config_s yaw_config = {
|
||||
.can_init_config = {
|
||||
|
|
|
@ -126,6 +126,7 @@ static void DecodeDJIMotor(CANInstance *_instance)
|
|||
static DJI_Motor_Measure_s *measure;
|
||||
rxbuff = _instance->rx_buff;
|
||||
// 这里对can instance的id进行了强制转换,从而获得电机的instance实例地址
|
||||
// _instance指针指向的id是对应电机instance的地址,通过强制转换为电机instance的指针,再通过->运算符访问电机的成员motor_measure,最后取地址获得指针
|
||||
measure = &(((DJIMotorInstance *)_instance->id)->motor_measure); // measure要多次使用,保存指针减小访存开销
|
||||
|
||||
// 解析数据并对电流和速度进行滤波,电机的反馈报文具体格式见电机说明手册
|
||||
|
|
|
@ -16,7 +16,7 @@ static void LKMotorDecode(CANInstance *_instance)
|
|||
static LKMotor_Measure_t *measure;
|
||||
static uint8_t *rx_buff;
|
||||
rx_buff = _instance->rx_buff;
|
||||
measure = &((LKMotorInstance *)_instance)->measure; // 通过caninstance保存的id获取对应的motorinstance
|
||||
measure = &(((LKMotorInstance *)_instance->id)->measure); // 通过caninstance保存的id获取对应的motorinstance
|
||||
|
||||
measure->last_ecd = measure->ecd;
|
||||
measure->ecd = (uint16_t)((rx_buff[7] << 8) | rx_buff[6]);
|
||||
|
@ -59,7 +59,10 @@ LKMotorInstance *LKMotorInit(Motor_Init_Config_s *config)
|
|||
motor->motor_can_ins = CANRegister(&config->can_init_config);
|
||||
|
||||
if (idx == 0) // 用第一个电机的can instance发送数据
|
||||
{
|
||||
sender_instance = motor->motor_can_ins;
|
||||
sender_instance->tx_id = 0x280; // 修改tx_id为0x280,用于多电机发送,不用管其他LKMotorInstance的tx_id,它们仅作初始化用
|
||||
}
|
||||
|
||||
LKMotorEnable(motor);
|
||||
lkmotor_instance[idx++] = motor;
|
||||
|
|
|
@ -3,3 +3,5 @@
|
|||
这是瓴控电机的模块封装说明文档。关于LK电机的控制报文和反馈报文值,详见LK电机的说明文档,由于电机实例已经自带三环PID计算,一般来说**我们能用到的只有单电机的力矩指令和多电机指令。**
|
||||
|
||||
注意LK电机在使用多电机发送的时候,只支持一条总线上至多4个电机,多电机模式下LK仅支持发送id 0x280为接收ID为0x140+id.
|
||||
|
||||
要设置为多电机模式,请通过串口连接电机,并使用该文件夹下的LK motor tool.exe进行配置。
|
|
@ -1,5 +1,7 @@
|
|||
# how to locate bug in your code
|
||||
|
||||
[TOC]
|
||||
|
||||
只讨论运行中的bug(指程序的运行结果不符合你的期望)和异常(直接异常终止)。编译期出现的warning和error不在此范畴,他们都可以通过直接阅读报错信息解决。
|
||||
|
||||
## Debug方法论
|
||||
|
@ -82,3 +84,7 @@ long long的范围比float小。无符号和有符号数直接转换可能变成
|
|||
```
|
||||
|
||||
**宏只在当前文件生效**,如果宏放在.c那么对其他的文件是不可见的,这也一般称作私有宏。
|
||||
|
||||
## 典型debug案例
|
||||
|
||||
这是一个结合了软件和硬件且多模块耦合的异常。
|
Loading…
Reference in New Issue