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:
cbb
2026-09-09 02:53:11 +08:00
parent 25ed2a2bde
commit 9fbd9c3d30
5 changed files with 26 additions and 406 deletions
-99
View File
@@ -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 覆盖。