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;
}
验证方法与判定标准
静态验证:
- 不连接电机,给电路上电,用万用表测量INA240输出引脚,应等于VREF(1.65V ± 10mV)。
- 用信号发生器在分流电阻两端注入10mV直流差分信号(或直接通入1A直流电流),测量输出应为1.65V + 1.0V = 2.65V(对应+1A)。
动态验证:
- 连接电机并运行FOC开环控制(低速),通过调试器实时读取ADC采样值。
- 在电机相线上串联电流探头(示波器),对比ADC换算电流与探头读数。
- 判定标准:在±5A范围内,ADC换算电流与探头读数误差 ≤ 2% 满量程(即 ≤ 0.2A)。
常见问题排查:
- 若输出始终接近0V或3.3V,检查REF引脚电压是否为1.65V,以及INA240供电是否正常。
- 若输出噪声过大(>50mV峰峰值),检查RC滤波器是否生效,以及AGND/PGND是否单点连接。
- 若ADC读数在电流为0时偏移超过±20mV,需校准VREF分压电阻精度(使用0.1%精度电阻)。