3. ADC采样电机相电流与偏置校准

ADC采样电机相电流与偏置校准 学习卡片

为什么相电流采样必须做偏置校准

电机相电流是双极性信号,而 C2000 的 ADC 输入只能接受 0~3.3V 单极性电压。因此硬件上通常用 1.65V 作为零电流基准,把 −I 映射到 1.65V 以下、+I 映射到 1.65V 以上。理想情况下零电流时 ADC 读数应等于 2048(12 位、3.3V 参考),但运放失调、电阻误差和温漂会让实际零点偏离,若直接用 2048 计算电流,会在零电流时产生虚假电流,导致转矩脉动甚至闭环失控。所以必须先测出真实的零电流偏置,再在换算时扣除。

硬件连接与采样通道分配

本例使用两路 ADC 通道分别采集 A 相和 B 相电流,由 EPWM 的 SOC 信号触发,保证在 PWM 中心对称点采样,避开开关噪声。典型连接如下:

信号ADC 通道触发源零电流理想值
A 相电流ADCINA0EPWM1 SOCA2048
B 相电流ADCINB0EPWM1 SOCA2048

ADC 配置与偏置校准实现

下面代码完成 ADC 初始化、两通道同步采样、零电流偏置采集与电流换算。偏置校准在电机未通电、PWM 封锁时执行,连续采样 1024 次取平均,降低随机噪声影响。

#include "F28x_Project.h"

#define ADC_BUF_LEN   1024
#define ADC_FULL_SCALE 4095.0f
#define VREF          3.3f
#define SENSITIVITY   0.02f   // 电流传感器灵敏度 20mV/A

Uint16 adcA[ADC_BUF_LEN];
Uint16 adcB[ADC_BUF_LEN];
float  offsetA = 2048.0f;
float  offsetB = 2048.0f;

void InitAdc(void)
{
    EALLOW;
    AdcRegs.ADCCTL2.bit.PRESCALE = 6;      // ADCCLK = SYSCLK/4
    AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;   // 采样结束后产生中断
    AdcRegs.ADCSOC0CTL.bit.CHSEL  = 0;     // SOC0 -> ADCINA0
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;    // EPWM1 SOCA 触发
    AdcRegs.ADCSOC1CTL.bit.CHSEL  = 8;     // SOC1 -> ADCINB0
    AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
    AdcRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    EDIS;
    DELAY_US(1000);
}

// 零电流偏置校准:电机断电、PWM 封锁时调用
void CalibrateOffset(void)
{
    Uint32 sumA = 0, sumB = 0;
    Uint16 i;
    for (i = 0; i < ADC_BUF_LEN; i++) {
        AdcRegs.ADCSOCFRC1.all = 0x0003;   // 软件强制触发 SOC0/SOC1
        while (AdcRegs.ADCINTFLG.bit.ADCINT1 == 0) {}
        AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
        sumA += AdcResult.ADCRESULT0;
        sumB += AdcResult.ADCRESULT1;
    }
    offsetA = (float)sumA / ADC_BUF_LEN;
    offsetB = (float)sumB / ADC_BUF_LEN;
}

// 将 ADC 原始值换算为实际电流(单位 A)
float AdcToCurrent(Uint16 raw, float offset)
{
    float voltage = (float)raw * VREF / ADC_FULL_SCALE;
    float vOffset = offset * VREF / ADC_FULL_SCALE;
    return (voltage - vOffset) / SENSITIVITY;
}
校准前务必确认电机母线断电或 PWM 输出已封锁,否则采样到的是真实电流而非零电流偏置,校准结果会完全错误。

采样链路与偏置扣除关系

下图展示从相电流到 ADC 原始值、再经偏置扣除得到实际电流的完整信号链,以及偏置校准在其中的作用位置。

电机相电流 −I ~ +I 电流传感器 1.65V ± 20mV/A ADC 采样 12bit, 0~4095 偏置扣除 raw − offset 实际电流 单位 A 零电流偏置校准 1024 次平均 offsetA / offsetB 校准值注入 EPWM1 SOCA 中心对称点触发 校准条件: 电机断电 / PWM 封锁 → 采样值应接近 2048 → 偏差即为真实偏置 验证方法: 注入已知电流,检查 (raw − offset) 与电流值呈线性,斜率 = 1/(灵敏度×满量程/VREF)

线性关系验证

校准完成后,用可调直流源或电子负载给传感器注入已知电流,记录 ADC 原始值与换算电流,检查线性度。下表为教学示例数据(假设灵敏度 20mV/A、VREF 3.3V、12 位 ADC):

实际电流 (A)理论 ADC 值实测 ADC 值(示例)换算电流 (A)误差
0204820520.032—
+5217221765.032+0.6%
+10229622999.984−0.2%
−519241921−5.048+1.0%
−1018001798−10.016+0.2%

若误差超过 ±2%,应检查传感器供电、参考电压稳定性以及偏置校准时的噪声水平。线性关系成立后,即可将 AdcToCurrent() 用于电流环反馈。

偏置会随温度漂移,长时间运行或环境温度变化大时,建议在每次上电初始化阶段重新执行一次校准,或在 PWM 封锁间隙周期性刷新偏置值。