diff --git a/TODO.md b/TODO.md index 5b72dd7..53a7609 100644 --- a/TODO.md +++ b/TODO.md @@ -10,40 +10,23 @@ ### 待完成 -#### bsp_buzzer - -- [ ] 添加初始化完成时的音乐播放 - ### 待优化 -#### bsp_buzzer - -需要和**daemon**模块配合。 - -- [ ] 增加错误或异常提示音 -- [ ] 增加功能提示音 - -#### bsp_led - -需要和**daemon**模块配合。这同时会影响到module层的led_task,放在这一并解决。 - -- [ ] 增加错误或异常流水灯 -- [ ] 增加功能点灯 - +#### bsp_pwm +- [ ] 是否允许修改预分频计数器? ### 待添加 #### bsp_spi -- [ ] 增加spi的板级支持包,供IMU使用和其他外接模块使用 +- [x] 待测试(BMI088,预计1.20前完成) #### bsp_iic -- [ ] 增加iic的板级支持包,供磁力计和OLED屏等使用 -- [ ] 增加软件iic的支持包 +- [x] 待测试(OLED,IST8310,预计1.20前完成) #### bsp_gpio @@ -75,33 +58,21 @@ ### 待完成 +#### buzzer + +- [ ] 使用bsp_pwm添加buzzer模块 + +- [ ] 添加初始化完成时的音乐播放 + #### ==servo_motor== 舵机模块,需要预先定义90/180/360连续旋转的电机类型,并且能够设定max和min位置。 -- [ ] 编写舵机模块 - -#### ==daemon== - -应用和模块监视功能,用于提供掉线和异常检测与应对机制,和底层的buzzer、led、oled等配合提供快速的问题定位。 - -- [ ] 编写daemon - -#### LKMotor - -LK系列电机,目前仅用于平衡步兵驱动轮。后续可能使用其他瓴控电机。 - -- [ ] 重构LKMotor模块 - -#### HTMotor - -海泰04电机。目前仅用于平衡步兵关节电机。 - -- [ ] 重构海泰电机模块 +- [x] 编写舵机模块(待测试和优化) #### imu -- [ ] 增加角速度的反馈,并且能够获取加速度值(目前看来修改反馈数据类型定义即可) +- [x] 增加角速度的反馈,并且能够获取加速度值(目前看来修改反馈数据类型定义即可) #### refereeUI @@ -124,19 +95,29 @@ LK系列电机,目前仅用于平衡步兵驱动轮。后续可能使用其他 ### 待优化 -#### imu +#### buzzer -需要重写部分数据结构,并在bsp_spi完成之后移植到新的bsp上。 +> 是否需要在module层就和**daemon**模块配合? + +- [ ] 增加错误或异常提示音 +- [ ] 增加功能提示音 + +#### led + +> 是否需要和**daemon**模块配合?这同时会影响到module层的led_task,放在这一并解决。 + +- [ ] 增加错误或异常流水灯 +- [ ] 增加功能点灯 + +#### BMI088 + +需要重写部分数据结构,并在bsp_spi完成之后移植到新的bsp上。(等待bsp_spi的测试) - [ ] 重构imu模块 -#### motor_task - -- [ ] 给不同的伺服机构添加不同的执行频率 - #### remote_control -- [ ] 将键盘数据解析替换为位域操作 +- [x] 将键盘数据解析替换为位域操作(已完成,待测试) #### referee @@ -163,6 +144,8 @@ LK系列电机,目前仅用于平衡步兵驱动轮。后续可能使用其他 - [ ] 增加3508和2006的开环零位校准函数 - [ ] 为实例增加低通滤波系数变量,使不同电机有不同的配置 + + ### 待添加 #### step_motor @@ -178,9 +161,11 @@ LK系列电机,目前仅用于平衡步兵驱动轮。后续可能使用其他 - [ ] 增加扰动观测器,可能需要新增模块 - [ ] 增加模型控制器,可能需要新增模块 -#### master_process +#### ws2816 + +- [ ] 通过bsp_pwm添加支持 + -- [ ] 兼容其他通信方式,如can,spi,usb等 @@ -200,20 +185,17 @@ LK系列电机,目前仅用于平衡步兵驱动轮。后续可能使用其他 - [ ] 键盘控制 - [ ] 鼠标控制 -- [ ] 双板兼容 +- [x] 双板兼容(待测试) #### ==chassis== - [ ] 根据裁判系统的功率数据和超级电容,进行输出限幅 -- [ ] 双板兼容 +- [x] 双板兼容(待测试) #### ==shoot== -- [ ] 优化单发模式的位置闭环(是否要改成速度闭环,然后定时?) - [ ] 增加卡弹检测和反转 - [ ] 弹仓盖控制(需待servo_motor完成) - -- [ ] 双发射机构兼容 - [ ] 42mm发射机构兼容 @@ -227,7 +209,6 @@ LK系列电机,目前仅用于平衡步兵驱动轮。后续可能使用其他 #### gimbal -- [ ] 增加不同模式之间的过渡(是否有必要?) - [ ] 增加底盘速度前馈控制 #### chassis @@ -235,7 +216,5 @@ LK系列电机,目前仅用于平衡步兵驱动轮。后续可能使用其他 - [ ] 根据电机的实际速度计算底盘的真实运动 - [ ] 若为双板,根据IMU的数据对电机实际速度进行融合 -- [ ] 增加不同模式之间的过渡(是否有必要?) - #### shoot diff --git a/bsp/usart/bsp_usart.c b/bsp/usart/bsp_usart.c index 31fb0b2..0e26191 100644 --- a/bsp/usart/bsp_usart.c +++ b/bsp/usart/bsp_usart.c @@ -18,7 +18,7 @@ static uint8_t idx; static USARTInstance *usart_instance[DEVICE_USART_CNT] = {NULL}; /** - * @brief usart service will start automatically, after each module registered + * @brief 启动串口服务,会在每个实例注册之后自动启用接收,当前实现为DMA接收,后续可能添加IT和BLOCKING接收 * * @todo 串口服务会在每个实例注册之后自动启用接收,当前实现为DMA接收,后续可能添加IT和BLOCKING接收 * 可能还要将此函数修改为extern,使得module可以控制串口的启停 @@ -78,17 +78,12 @@ void USARTAbort(USARTInstance *_instance, USART_TRANSFER_MODE mode) * @brief 每次dma/idle中断发生时,都会调用此函数.对于每个uart实例会调用对应的回调进行进一步的处理 * 例如:视觉协议解析/遥控器解析/裁判系统解析 * - * @todo neozng给HAL库的github repo提了issue, ST在最新的一次更新中为此提供了一个HAL_UARTEx_GetRxEventType()函数 - * 这样就可以通过调用这个函数来确认是什么中断导致了回调函数的调用 - * - * @note because DMA half transfer iterrupt(DMA_IT_HT) would call this callback function too, so we just - * disable it when transfer complete using macro: __HAL_DMA_DISABLE_IT(huart->hdmarx,DMA_IT_HT) - * 关闭dma half transfer中断防止两次进入HAL_UARTEx_RxEventCallback() + * @note 通过__HAL_DMA_DISABLE_IT(huart->hdmarx,DMA_IT_HT)关闭dma half transfer中断防止两次进入HAL_UARTEx_RxEventCallback() * 这是HAL库的一个设计失误,发生DMA传输完成/半完成以及串口IDLE中断都会触发HAL_UARTEx_RxEventCallback() * 我们只希望处理,因此直接关闭DMA半传输中断第一种和第三种情况 * - * @param huart uart handle indicate which uart is being handled 发生中断的串口 - * @param Size not used temporarily,此次接收到的总数居量,暂时没用 + * @param huart 发生中断的串口 + * @param Size 此次接收到的总数居量,暂时没用 */ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { @@ -109,12 +104,11 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) } /** - * @brief when error occurs in the process of send/receive,this function will be called - * then just simply restart send/receive. + * @brief 当串口发送/接收出现错误时,会调用此函数,此时这个函数要做的就是重新启动接收 * - * @note most frequent error ex: parity/overrrun/frame error + * @note 最常见的错误:奇偶校验/溢出/帧错误 * - * @param huart uart handle type, indicate where error comes from + * @param huart 发生错误的串口 */ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { diff --git a/modules/motor/DJImotor/dji_motor.c b/modules/motor/DJImotor/dji_motor.c index 5ff014a..6d6d794 100644 --- a/modules/motor/DJImotor/dji_motor.c +++ b/modules/motor/DJImotor/dji_motor.c @@ -126,7 +126,7 @@ static void DecodeDJIMotor(CANInstance *_instance) static DJI_Motor_Measure_s *measure; rxbuff = _instance->rx_buff; // 这里对can instance的id进行了强制转换,从而获得电机的instance实例地址 - measure = &((DJIMotorInstance *)_instance->id)->motor_measure; // measure要多次使用,保存指针减小访存开销 + measure = &(((DJIMotorInstance *)_instance->id)->motor_measure); // measure要多次使用,保存指针减小访存开销 // 解析数据并对电流和速度进行滤波,电机的反馈报文具体格式见电机说明手册 measure->last_ecd = measure->ecd; diff --git a/modules/motor/DJImotor/dji_motor.h b/modules/motor/DJImotor/dji_motor.h index 7b14ecb..8fc0c6c 100644 --- a/modules/motor/DJImotor/dji_motor.h +++ b/modules/motor/DJImotor/dji_motor.h @@ -33,7 +33,7 @@ typedef struct uint16_t last_ecd; // 上一次读取的编码器值 uint16_t ecd; // 0-8191,刻度总共有8192格 float angle_single_round; // 单圈角度 - float speed_aps; // 角速度,单位为:度/秒 rounds per minute + float speed_aps; // 角速度,单位为:度/秒 rpm:rounds per minute int16_t real_current; // 实际电流 uint8_t temperate; // 温度 Celsius diff --git a/modules/motor/HTmotor/HT04.c b/modules/motor/HTmotor/HT04.c index 691cb36..5272b04 100644 --- a/modules/motor/HTmotor/HT04.c +++ b/modules/motor/HTmotor/HT04.c @@ -6,7 +6,7 @@ static uint8_t idx; HTMotorInstance *ht_motor_instance[HT_MOTOR_CNT]; /** - * @brief + * @brief * * @param cmd * @param motor @@ -111,24 +111,28 @@ void HTMotorControl() pid_measure = *motor->other_angle_feedback_ptr; else pid_measure = measure->real_current; + pid_ref = PID_Calculate(&motor->angle_PID, pid_measure, pid_ref); - if (setting->feedforward_flag & SPEED_FEEDFORWARD) - pid_ref += *motor->speed_feedforward_ptr; } if ((setting->close_loop_type & SPEED_LOOP) && setting->outer_loop_type & (ANGLE_LOOP | SPEED_LOOP)) { + if (setting->feedforward_flag & SPEED_FEEDFORWARD) + pid_ref += *motor->speed_feedforward_ptr; + if (setting->angle_feedback_source == OTHER_FEED) pid_measure = *motor->other_speed_feedback_ptr; else pid_measure = measure->speed_aps; + pid_ref = PID_Calculate(&motor->angle_PID, pid_measure, pid_ref); - if (setting->feedforward_flag & CURRENT_FEEDFORWARD) - pid_ref += *motor->current_feedforward_ptr; } if (setting->close_loop_type & CURRENT_LOOP) { + if (setting->feedforward_flag & CURRENT_FEEDFORWARD) + pid_ref += *motor->current_feedforward_ptr; + pid_ref = PID_Calculate(&motor->current_PID, measure->real_current, pid_ref); } diff --git a/modules/motor/LKmotor/LK_motor.md b/modules/motor/LKmotor/LK_motor.md new file mode 100644 index 0000000..657aa13 --- /dev/null +++ b/modules/motor/LKmotor/LK_motor.md @@ -0,0 +1,5 @@ +LK motor + +这是瓴控电机的模块封装说明文档。关于LK电机的控制报文和反馈报文值,详见LK电机的说明文档。 + +注意LK电机在使用多电机发送的时候,只支持一条总线上至多4个电机,多电机模式下LK仅支持接收ID为0x280. \ No newline at end of file diff --git a/modules/motor/motor_def.h b/modules/motor/motor_def.h index c650a22..ed16fec 100644 --- a/modules/motor/motor_def.h +++ b/modules/motor/motor_def.h @@ -31,7 +31,7 @@ typedef enum // only for checking SPEED_AND_CURRENT_LOOP = 0b0011, ANGLE_AND_SPEED_LOOP = 0b0110, - ALL_THREE_LOOP = 0b0111 + ALL_THREE_LOOP = 0b0111, } Closeloop_Type_e; typedef enum