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:
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user