3. 电流采样与调理电路设计

任务目标

设计一个用于无感FOC控制器的相电流采样与调理电路,将电流传感器输出的差分信号经过放大、偏置和滤波后,送入MCU的ADC引脚。要求电路能够将双极性电流信号(例如±10A)映射到ADC的0~3.3V输入范围,并保证信号带宽满足FOC控制环的需求。

电路方案与关键参数

采用INA240(或等效的高共模差分放大器)作为电流检测放大器,搭配采样电阻(分流电阻)。INA240的输出为以基准电压(VREF)为中心的电压信号,可直接适配单极性ADC。

设计规格:

  • 分流电阻:Rshunt = 1 mΩ(功率≥2W,低感)
  • 检测电流范围:Imax = ±10A
  • INA240增益:G = 100 V/V(A3版本)
  • 基准电压:VREF = 1.65V(由MCU的3.3V分压或精密基准源提供)
  • ADC输入范围:0 ~ 3.3V

信号链路计算:

  • 最大差分输入:Vdiff,max = Imax × Rshunt = 10A × 1mΩ = 10mV
  • 放大器输出摆幅:Vout = VREF ± (Vdiff × G) = 1.65V ± 1.0V → 0.65V ~ 2.65V
  • ADC利用率:(2.65 - 0.65) / 3.3 ≈ 60.6%,满足FOC采样精度要求

完整电路原理图

// 电流采样调理电路(单相为例,三相重复此结构)
// 电源:AVDD=3.3V, AGND

// 分流电阻与INA240连接
R_shunt (1mΩ) 串联于电机相线低端(或高端)
  IN+ ── R_shunt 高端 ── 电机相线
  IN- ── R_shunt 低端 ── 功率地(PGND)

// INA240A3 (增益100)
U1 INA240:
  VCC   → 5V(或3.3V,需确认共模范围)
  GND   → AGND(与PGND单点连接)
  IN+   → 分流电阻高端
  IN-   → 分流电阻低端
  REF   → VREF_1V65(来自分压电阻)
  OUT   → 至RC滤波器

// 基准电压生成(1.65V)
R1 10kΩ: 3.3V ── R1 ──┬── R2 10kΩ ── AGND
                       └── C1 100nF ── AGND
                       节点 = VREF_1V65

// 输出RC低通滤波器(抗混叠)
R3 100Ω: INA240_OUT ── R3 ──┬── C2 1nF ── AGND
                             └── ADC_CHx(MCU引脚)

// ESD/过压保护
D1 (BAT54S): ADC_CHx ── D1 ── 3.3V(钳位到3.3V+0.3V)
             ADC_CHx ── D2 ── AGND(钳位到-0.3V)

PCB布局关键要点

  • 分流电阻采用四线开尔文连接,避免走线电阻引入误差
  • INA240的IN+和IN-走线应紧贴且等长,减少差分噪声拾取
  • REF引脚走线远离功率开关节点,避免耦合干扰
  • RC滤波器靠近MCU的ADC引脚放置
  • 模拟地(AGND)与功率地(PGND)在分流电阻的采样点处单点连接

ADC配置与采样验证

以STM32G4系列为例,配置ADC1注入组通道,采样时间设为最大(如 47.5 周期),触发源选择定时器(与PWM同步)。

// ADC初始化(STM32 HAL库示例)
void ADC_Init(void) {
    hadc1.Instance = ADC1;
    hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.ScanConvMode = DISABLE;
    hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    hadc1.Init.LowPowerAutoWait = DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.NbrOfConversion = 1;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_TRGO;
    hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
    hadc1.Init.DMAContinuousRequests = DISABLE;
    hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
    hadc1.Init.SamplingTimeCommon = ADC_SAMPLINGTIME_47CYCLES_5;
    HAL_ADC_Init(&hadc1);

    // 配置采样通道(假设PA0为ADC1_IN1)
    sConfig.Channel = ADC_CHANNEL_1;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLINGTIME_47CYCLES_5;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

// 读取ADC值并转换为电流
float ReadPhaseCurrent(void) {
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, 10);
    uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

    // 反算电流:I = (Vout - VREF) / (G * Rshunt)
    float vout = (adc_val / 4095.0f) * 3.3f;
    float current = (vout - 1.65f) / (100.0f * 0.001f);
    return current;
}

验证方法与判定标准

静态验证:

  1. 不连接电机,给电路上电,用万用表测量INA240输出引脚,应等于VREF(1.65V ± 10mV)。
  2. 用信号发生器在分流电阻两端注入10mV直流差分信号(或直接通入1A直流电流),测量输出应为1.65V + 1.0V = 2.65V(对应+1A)。

动态验证:

  1. 连接电机并运行FOC开环控制(低速),通过调试器实时读取ADC采样值。
  2. 在电机相线上串联电流探头(示波器),对比ADC换算电流与探头读数。
  3. 判定标准:在±5A范围内,ADC换算电流与探头读数误差 ≤ 2% 满量程(即 ≤ 0.2A)。

常见问题排查:

  • 若输出始终接近0V或3.3V,检查REF引脚电压是否为1.65V,以及INA240供电是否正常。
  • 若输出噪声过大(>50mV峰峰值),检查RC滤波器是否生效,以及AGND/PGND是否单点连接。
  • 若ADC读数在电流为0时偏移超过±20mV,需校准VREF分压电阻精度(使用0.1%精度电阻)。