3. 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 相电流 | ADCINA0 | EPWM1 SOCA | 2048 |
| B 相电流 | ADCINB0 | EPWM1 SOCA | 2048 |
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 原始值、再经偏置扣除得到实际电流的完整信号链,以及偏置校准在其中的作用位置。
线性关系验证
校准完成后,用可调直流源或电子负载给传感器注入已知电流,记录 ADC 原始值与换算电流,检查线性度。下表为教学示例数据(假设灵敏度 20mV/A、VREF 3.3V、12 位 ADC):
| 实际电流 (A) | 理论 ADC 值 | 实测 ADC 值(示例) | 换算电流 (A) | 误差 |
|---|---|---|---|---|
| 0 | 2048 | 2052 | 0.032 | — |
| +5 | 2172 | 2176 | 5.032 | +0.6% |
| +10 | 2296 | 2299 | 9.984 | −0.2% |
| −5 | 1924 | 1921 | −5.048 | +1.0% |
| −10 | 1800 | 1798 | −10.016 | +0.2% |
若误差超过 ±2%,应检查传感器供电、参考电压稳定性以及偏置校准时的噪声水平。线性关系成立后,即可将 AdcToCurrent() 用于电流环反馈。
偏置会随温度漂移,长时间运行或环境温度变化大时,建议在每次上电初始化阶段重新执行一次校准,或在 PWM 封锁间隙周期性刷新偏置值。