refactor(FOC): 移除齿槽转矩补偿功能
对硬编码的两张 128 点补偿表做谐波分解后确认该补偿无效: - 能量集中在 k=1(11次/转) 16.1% 与 k=2(22次/转) 82.2%,合计 98.3%; 而 22 极电机的真实齿槽基频应落在槽极 LCM 处(12槽=132次/转 k=12、 18槽 k=18、24槽 k=24),实测幅值仅 0.46/0.12/0.08 mA,在噪声地板内。 即表中属于齿槽的成分不足总能量 0.1%,k=1/k=2 实为电角度零位偏差与 电流采样通道增益/零点失配的特征。 - 表按电角度查表,而电角度含每台独立的 calibration_angle(Flash 读回)。 相位偏 φ 时残差比为 2sin(kφ/2):零点差 30° 电角度时 k=2 残差即等于 原幅值,补偿由减小扰动变为增大扰动。22 极下 2.7° 机械偏差即达此量级, 硬编码全局共用一张表不成立。 - 表采集于 bec7c11(2026-05),其电流链路为改版前方案,此后陆续修正了 采样时刻落在上管导通窗、PA3/4/5 未配 AIN、零点配平未应用等问题。 用当时的链路去测量比其自身误差小三个数量级的量,采到的是链路误差。 删除内容:get_cogging_compensation 查表插值、FOC_DEBUG 校准状态机及 其打印函数与静态缓冲、init() 中两张硬编码表、COGGING_TABLE_SIZE/ COGGING_COMP_SCALE、tasks.cpp 调度 tick、RESET 帧 bit4 触发(该位保留)。 六个控制模式的 Uq 输出去掉补偿项;angle_el_cog 仍供 update_el_sincos 使用,改名回 angle_el。mode3 注释中"反转阻力差异由 REV 齿槽补偿表承担" 的描述一并订正(该依赖本已失效)。
This commit is contained in:
@@ -149,105 +149,6 @@ class FOC_Controller {
|
||||
*/
|
||||
void fast_voltage_check(void); // 快速电压检测(100us周期调用)
|
||||
|
||||
// 齿槽转矩补偿
|
||||
bool cogging_comp_enabled = false;
|
||||
float cogging_comp_scale = COGGING_COMP_SCALE;
|
||||
float cogging_table[COGGING_TABLE_SIZE] = {0}; // 齿槽补偿表-正转 (mA)
|
||||
float cogging_table_rev[COGGING_TABLE_SIZE] = {0}; // 齿槽补偿表-反转 (mA)
|
||||
/**
|
||||
* @brief 获取 get_cogging_compensation 对应的数据或状态
|
||||
* @param[in] angle_el 参数
|
||||
* @return float 返回值
|
||||
*/
|
||||
inline float get_cogging_compensation(float angle_el);
|
||||
|
||||
// === 校准相关(DEBUG,平时不启用)===
|
||||
// 启用方法:config.h 中 FOC_DEBUG 改为 1
|
||||
#if FOC_DEBUG
|
||||
volatile bool cogging_calib_request = false;
|
||||
/**
|
||||
* @brief 齿槽校准状态机入口,每个周期按当前状态派发到对应处理函数
|
||||
* @return void
|
||||
*/
|
||||
void calibrate_cogging_tick(void);
|
||||
/**
|
||||
* @brief 处理齿槽校准空闲态,收到请求后保存现场并进入稳定等待态
|
||||
* @return void
|
||||
*/
|
||||
void start_cogging_calibration(void);
|
||||
/**
|
||||
* @brief 处理齿槽校准稳定等待态,等待电机进入稳定低速运行
|
||||
* @return void
|
||||
*/
|
||||
void cogging_settling_tick(void);
|
||||
/**
|
||||
* @brief 处理齿槽校准采样态,按分频周期累计每个电角度桶的电流
|
||||
* @return void
|
||||
*/
|
||||
void cogging_sampling_tick(void);
|
||||
/**
|
||||
* @brief 处理齿槽校准停止态,等待停稳后完成本轮数据归一化
|
||||
* @return void
|
||||
*/
|
||||
void cogging_stopping_tick(void);
|
||||
/**
|
||||
* @brief 处理齿槽校准完成态,生成补偿表并打印校准结果
|
||||
* @return void
|
||||
*/
|
||||
void cogging_done_tick(void);
|
||||
/**
|
||||
* @brief 计算当前校准轮次的平均电流并去除直流偏置
|
||||
* @return float 当前轮次直流偏置,单位 mA
|
||||
*/
|
||||
float process_cogging_run_data(void);
|
||||
/**
|
||||
* @brief 切换到下一轮齿槽校准运行方向并重新进入稳定等待态
|
||||
* @return void
|
||||
*/
|
||||
void start_next_cogging_run(void);
|
||||
/**
|
||||
* @brief 根据 3 次正转和 3 次反转采样结果生成最终补偿表
|
||||
* @return void
|
||||
*/
|
||||
void build_cogging_tables(void);
|
||||
/**
|
||||
* @brief 打印齿槽补偿表的人类可读角度/电流列表
|
||||
* @param[in] title 表格标题字符串
|
||||
* @param[in] table 待打印的补偿表
|
||||
* @return void
|
||||
*/
|
||||
void print_cogging_table(const char *title, float *table);
|
||||
/**
|
||||
* @brief 打印可直接复制回源码的齿槽补偿 C 数组
|
||||
* @param[in] title 输出标题字符串
|
||||
* @param[in] arrayName C 数组名
|
||||
* @param[in] table 待打印的补偿表
|
||||
* @return void
|
||||
*/
|
||||
void print_cogging_c_array(const char *title, const char *arrayName,
|
||||
float *table);
|
||||
/**
|
||||
* @brief CogCalibState 枚举定义
|
||||
*/
|
||||
enum class CogCalibState : u8 {
|
||||
IDLE = 0,
|
||||
SETTLING,
|
||||
SAMPLING,
|
||||
STOPPING,
|
||||
DONE
|
||||
};
|
||||
CogCalibState cog_calib_state = CogCalibState::IDLE;
|
||||
u8 cog_calib_run = 0;
|
||||
u32 cog_calib_sample_count = 0;
|
||||
u32 cog_calib_settle_tick = 0;
|
||||
u32 cog_calib_stop_tick = 0;
|
||||
u8 cog_calib_saved_mode = 0;
|
||||
float cog_calib_saved_vel = 0;
|
||||
static float cog_calib_run_data[6][COGGING_TABLE_SIZE]; // 3正+3反
|
||||
static float cog_calib_accum[COGGING_TABLE_SIZE];
|
||||
static u32 cog_calib_count[COGGING_TABLE_SIZE];
|
||||
#endif // FOC_DEBUG
|
||||
|
||||
// 此处默认值不作数
|
||||
// 注意:构造期 limit_voltage 尚为 0,分母一律用 voltage_power_supply(24V),
|
||||
// 否则 P 初始化为 +inf;运行期各模式每周期 set_P/set_PID 覆盖。
|
||||
|
||||
Reference in New Issue
Block a user