feat(adc): 添加三相电流零点配平并扩展初始化错误上报

- ADC: 新增 zero_calibrate() 函数,在上电后采集 200 帧计算各通道零点偏差
- ADC: 修改 current_adc_to_ma() 支持逐通道扣除配平后的零点偏移
- ADC: 调整电流采样引脚为模拟输入模式并优化采样时间至 13.5 周期
- CAN: STATUS 帧字节 32~35 新增 InitStatus 字段,反馈初始化错误位图
- main: 细化初始化错误检测,分别标记角度/ADC/CAN/Kalman/FOC/门驱动故障
- config.h: 新增 INIT_ERR_* 错误码定义及 CURRENT_ZERO_CAL_LIMIT 阈值
This commit is contained in:
cbb
2026-09-07 03:34:47 +08:00
parent 7c4aaa5ee6
commit 25ed2a2bde
7 changed files with 250 additions and 36 deletions
+48 -3
View File
@@ -102,6 +102,23 @@ constexpr u16 BOOT_VERSION_BUILD = 0;
constexpr float DRV8323_CSA_GAIN_VV = 10.0f;
constexpr float DRV8323_SHUNT_OHM = 0.010f;
#endif
// ===================== 相电流采样前端选择(独立于门驱动芯片) =====================
// 1 = 低边采样板(DRV8313 + 下桥臂 10mΩ + INA240A2):采样电阻串在各相下管
// 源极(PGNDx)与功率地之间,INA240A2(50V/V)放大后接 ADC0 注入组。
// OUT 静态中点 = (V_REF1+V_REF2)/2 = 1.65V(REF1 接 AGND、REF2 接 A3V3,
// 由芯片内部分压取中,数据手册支持的接法)。
// 换算 0.5V/A → 2.0 A/V,与老板外置放大链(50倍×10mΩ)数值一致,
// 电流链路单位为安培(get_current 返回 A,上报处 ×1000 转 mA)。
// 注意:下桥臂采样电阻只有对应下管导通(INx=0)时才有相电流流过,
// ADC 采样点必须在三相下管同时导通的窗口内(见 TIMER1_CH3_COMPARE_VALUE)。
// 0 = 老板(DRV8313 + 外置放大链):保持原标定系数与采样点。
#define CURRENT_SENSE_INA240 1
#if CURRENT_SENSE_INA240
constexpr float INA240_CSA_GAIN_VV = 50.0f; // INA240A2 = 50V/V(A1=20/A3=100/A4=200)
constexpr float INA240_SHUNT_OHM = 0.010f; // 低边采样电阻 10mΩ
#endif
// 编译时间(AC6 编译器自动生成)
#define APP_BUILD_DATE __DATE__
#define APP_BUILD_TIME __TIME__
@@ -167,7 +184,25 @@ constexpr u32 OTA_AVAL = 0x00000000; // 全零表示可用
constexpr u8 PP = 11;
constexpr float DIR = 1.0f; // 默认方向:-1.0f 反转,1.0f 正转
constexpr u16 REDUCTION_RATIO = 25;
constexpr float CURRENT_OFFSET = -3.31f / 2.0f; // 当前电流传感器的零点偏移
constexpr float CURRENT_OFFSET = -3.31f / 2.0f; // 电流通道零点偏移(V),
// 与 INA240 中点 1.65V / DRV8323 SO 中点 VREF/2 一致
// 三相电流零点配平:配平值(各通道实测零偏折算电流)超过该限值视为
// 电流检测初始化错误,随 init_status 阻止启动
constexpr float CURRENT_ZERO_CAL_LIMIT = 0.1f; // 100mA
// ===================== 初始化错误码(CAN STATUS 帧 InitStatus 反馈) =====================
// hardware_init 按模块置位(可位或组合),InitStatus=0 表示全部初始化正常;
// 信号定义见 DBC v0.74 的 STATUS 帧字节 32~35
constexpr u32 INIT_ERR_ANGLE_SENSOR = 1u << 0; // 角度传感器 KTH7823 初始化错误
constexpr u32 INIT_ERR_ADC = 1u << 1; // 采样器/ADC 初始化错误
constexpr u32 INIT_ERR_CAN = 1u << 2; // CAN 初始化错误
constexpr u32 INIT_ERR_ANG_KALMAN = 1u << 3; // 角度滤波器初始化错误
constexpr u32 INIT_ERR_VEL_KALMAN = 1u << 4; // 速度滤波器初始化错误
constexpr u32 INIT_ERR_FOC = 1u << 5; // FOC 初始化错误
constexpr u32 INIT_ERR_CURRENT_BAL = 1u << 6; // 电流检测:零点配平值超限(>100mA)
constexpr u32 INIT_ERR_CURRENT_NOFRAME = 1u << 7; // 电流检测:无采样帧(触发链路异常)
constexpr u32 INIT_ERR_GATE_DRIVER = 1u << 8; // 门驱动 bringup 错误
extern volatile u32 init_error_flags; // 初始化错误位图,定义在 main.cpp
constexpr float HOLD_PWM_DUTY = 0.1f;
constexpr u16 ANGLESENS_OFFSET = 0;
constexpr float ANGLESENS_CALIBRATION_ANGLE = 83.0f;
@@ -336,8 +371,18 @@ constexpr float MOTOR_FREQUENCY = 1 / TIME_SLICE / MOTOR_PERIOD; // 频率
constexpr int TIMER1_PRESCALER = 0; // 不分频,计数器时钟为 120MHz
constexpr int TIMER1_PERIOD = 2999; // 120MHz / (0+1) / (2999+1) = 40kHz计数, 中心对齐实际PWM 20kHz
constexpr int TIMER1_DEFAULT_PULSE = 0;
constexpr int TIMER1_CH3_COMPARE_VALUE =
(TIMER1_PERIOD + 1) * 0.41 - 1; // PWM 周期 41% 位置触发ADC采样
// CH3 为固定 ADC 采样触发点(TRGO=O3CPRE)。低边采样要求触发落在"三相下管
// 同时导通"的窗口内:中心对齐 PWM0 下 INx 高(上管导通)区间以计数谷底
// CNT=0 为中心,INx 低(下管导通)区间以计数峰顶 CNT=PERIOD 为中心,故采样
// 点必须贴近峰顶(在线采样时代取 41% 是任意有效点,直接沿用会采到上管
// 导通期、三相电流恒读零)。
// 取 PERIOD-10:紧贴峰顶。中心对齐下每周期匹配两次(上升沿 2989 / 下降沿
// 3011,仅差 22 计数),无论第二次触发被 ADC 忽略(注入转换忙)还是重启
// 序列,帧的等效采样位置都在峰顶附近——行为确定,不依赖芯片的触发丢弃
// 策略;配合 ADC.cpp 电流通道 13.5 周期短采样,最大占空比 ~90% 时三相样本
// 仍全部落在下管导通窗内。占空比更高时序列末位的 W 相先落出窗口(读数
// 趋零、U+V+W≠0),软件侧需对占空比限幅。
constexpr int TIMER1_CH3_COMPARE_VALUE = TIMER1_PERIOD - 10;
// 齿槽转矩补偿
constexpr u16 COGGING_TABLE_SIZE = 128; // 每电周期采样点数