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