feat(FOC): 实现电角度零位自动校准并修复ADC采样干扰问题

- 新增FlashEEPROM用于保存零位校准角,掉电不丢失
- 实现安全的零位校准算法:运行中禁止校准、对齐后重新采样、保存到Flash
- 重构ADC架构:分离ADC0(PWM同步电流采样)和ADC1(VBUS/DRV温度轮询)
- 解决ADC采样冲突:移除ADC0的regular连续扫描,避免与注入组抢占资源
- 修复VBUS电压读取错误:从DMA缓冲区改为直接ADC1单次转换
- 修正开环控制Uq幅值限幅逻辑,保留符号避免反转时抖动
- 更新CAN协议:电流数据改为有符号16位打包,支持负电流传输
- 调整版本号至v26.8.16.7
This commit is contained in:
cbb
2026-08-16 02:13:37 +08:00
parent 42c9f2f669
commit 76f7987238
10 changed files with 214 additions and 95 deletions
+21
View File
@@ -73,6 +73,16 @@ u8 FlashEEPROM::init() {
// 读取系统配置
read_saved_system_config();
// 加载电角度零位校准角(首次无存储则用默认值)
float calib = ANGLESENS_CALIBRATION_ANGLE;
if (readFloat(ADDR_CALIBRATION_ANGLE, &calib) != FLASH_EEPROM_OK) {
calib = ANGLESENS_CALIBRATION_ANGLE;
} else if (calib == 0.0f) {
// 校准值为 0 视为未校准/异常,回退默认值,避免换向角度错误
calib = ANGLESENS_CALIBRATION_ANGLE;
}
KTH7823.set_calibration(calib);
if (EEPROMStatus == FLASH_EEPROM_OK) {
return FLASH_EEPROM_OK;
} else {
@@ -493,6 +503,15 @@ float FlashEEPROM::read_angle() {
return angle;
}
/**
* @brief 保存电角度零位校准角到 Flash
* @param[in] angle 校准角(度)
* @return FlashEepromStatus 操作状态
*/
FlashEepromStatus FlashEEPROM::save_calibration_angle(float angle) {
return writeFloat(ADDR_CALIBRATION_ANGLE, angle);
}
// ============================================================================
// 节点 ID 独立读写函数实现(使用魔数+双重备份+计数器机制)
// ============================================================================
@@ -884,6 +903,8 @@ u8 OTA_SET(u32 addr, u32 data) {
* @retval 无
*/
void jumpToBOOT() {
// 0. 进 BOOT 前保存系统配置与运行参数(兜底,确保数据落盘)
flashEEP.save_system_config(false);
// 1. 关闭所有中断
__disable_irq();
for (int i = 0; i < 8; i++) {