diff --git a/application/balance_chassis/balance.c b/application/balance_chassis/balance.c index 1d27e57..741c35b 100644 --- a/application/balance_chassis/balance.c +++ b/application/balance_chassis/balance.c @@ -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 = { diff --git a/application/gimbal/gimbal.c b/application/gimbal/gimbal.c index 5798ce5..5f23d3e 100644 --- a/application/gimbal/gimbal.c +++ b/application/gimbal/gimbal.c @@ -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 = { diff --git a/modules/motor/DJImotor/dji_motor.c b/modules/motor/DJImotor/dji_motor.c index 36b6641..6ca6fba 100644 --- a/modules/motor/DJImotor/dji_motor.c +++ b/modules/motor/DJImotor/dji_motor.c @@ -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要多次使用,保存指针减小访存开销 // 解析数据并对电流和速度进行滤波,电机的反馈报文具体格式见电机说明手册 diff --git a/modules/motor/LKmotor/LK9025.c b/modules/motor/LKmotor/LK9025.c index 01af445..8db73a7 100644 --- a/modules/motor/LKmotor/LK9025.c +++ b/modules/motor/LKmotor/LK9025.c @@ -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; diff --git a/modules/motor/LKmotor/LK_motor.md b/modules/motor/LKmotor/LK_motor.md index f815d37..1c9e7f1 100644 --- a/modules/motor/LKmotor/LK_motor.md +++ b/modules/motor/LKmotor/LK_motor.md @@ -2,4 +2,6 @@ 这是瓴控电机的模块封装说明文档。关于LK电机的控制报文和反馈报文值,详见LK电机的说明文档,由于电机实例已经自带三环PID计算,一般来说**我们能用到的只有单电机的力矩指令和多电机指令。** -注意LK电机在使用多电机发送的时候,只支持一条总线上至多4个电机,多电机模式下LK仅支持发送id 0x280为接收ID为0x140+id. \ No newline at end of file +注意LK电机在使用多电机发送的时候,只支持一条总线上至多4个电机,多电机模式下LK仅支持发送id 0x280为接收ID为0x140+id. + +要设置为多电机模式,请通过串口连接电机,并使用该文件夹下的LK motor tool.exe进行配置。 \ No newline at end of file diff --git a/如何定位bug.md b/如何定位bug.md index 3138e9a..045e711 100644 --- a/如何定位bug.md +++ b/如何定位bug.md @@ -1,5 +1,7 @@ # how to locate bug in your code +[TOC] + 只讨论运行中的bug(指程序的运行结果不符合你的期望)和异常(直接异常终止)。编译期出现的warning和error不在此范畴,他们都可以通过直接阅读报错信息解决。 ## Debug方法论 @@ -81,4 +83,8 @@ long long的范围比float小。无符号和有符号数直接转换可能变成 // 宏通过空格来解析替换字段,YOUR_DEF空格后的第一个字段当作替换文本 ``` -**宏只在当前文件生效**,如果宏放在.c那么对其他的文件是不可见的,这也一般称作私有宏。 \ No newline at end of file +**宏只在当前文件生效**,如果宏放在.c那么对其他的文件是不可见的,这也一般称作私有宏。 + +## 典型debug案例 + +这是一个结合了软件和硬件且多模块耦合的异常。 \ No newline at end of file