7260fe9fba
根因:imu_init(200) 声明200Hz,但imu_update实际在50Hz任务中调用, Mahony积分dt差4倍,导致转90度只测出22度。 修复:imu_update移至10ms任务(100Hz),传感器采集与控制频率对齐。 同时将任务周期全部参数化: - Task.h 统一定义 TASK_10MS/20MS/50MS_FREQ_HZ - 各子系统init改为传入频率(Hz),内部算周期(dt) - PIT定时器周期由存储的dt自动计算,消除硬编码
49 lines
1.9 KiB
C
49 lines
1.9 KiB
C
#ifndef __TASK_H
|
|
#define __TASK_H
|
|
|
|
#include "zf_common_typedef.h"
|
|
|
|
#include "PID_Controller.h"
|
|
|
|
//==================================================================================================
|
|
// 任务频率配置(统一入口,修改这里即可全局生效)
|
|
//==================================================================================================
|
|
#define TASK_10MS_FREQ_HZ 100 // 10ms 任务:电机编码器、电机控制、IMU 姿态更新
|
|
#define TASK_20MS_FREQ_HZ 50 // 20ms 任务:灰度传感器、位置环、角度环
|
|
#define TASK_50MS_FREQ_HZ 20 // 50ms 任务:按键扫描、蜂鸣器、指令处理
|
|
|
|
void task_init(void);
|
|
|
|
void set_yaw_ref(float set_value);
|
|
|
|
//子系统初始化(传入频率 Hz,内部存储频率和周期)
|
|
void motor_control_init(float freq_hz);
|
|
void angle_control_init(float freq_hz);
|
|
void position_control_init(float freq_hz);
|
|
|
|
//供外部控制使用
|
|
extern volatile uint8_t motor_control_task_enable;
|
|
extern volatile uint8_t angle_control_task_enable;
|
|
extern volatile uint8_t position_control_task_enable;
|
|
|
|
extern volatile uint8_t position_turn_right_90_runing;
|
|
|
|
extern volatile PIDInstance pid_speed_right;
|
|
extern volatile PIDInstance pid_speed_left;
|
|
extern volatile PIDInstance pid_yaw;
|
|
extern volatile PIDInstance pid_position;
|
|
|
|
/*速度环的输入,开启角度环后由角度环接管(范围-50到+50)*/
|
|
extern volatile int16_t motor_speed_right_ref;
|
|
extern volatile int16_t motor_speed_left_ref;
|
|
/*角度环接管速度之后的基础直行速度*/
|
|
extern volatile int16_t motor_speed_base;
|
|
/*角度环参考值*/
|
|
extern volatile float yaw_ref;//建议不直接修改此变量,而是通过set_yaw_ref(float set_value)设置,以防预期之外的值
|
|
/*角度速率控制,开启位置环后由位置环接管*/
|
|
extern volatile float angle_velocity;
|
|
//配置项
|
|
/*自动模式下的基础直行速度*/
|
|
#define AUTO_MODE_BASE_SPEED 10
|
|
|
|
#endif |