1. 单电阻采样技术概述
在电机控制系统中,相电流检测是实现精确控制的基础环节。传统方案通常采用三个电流传感器分别测量三相电流,但这会增加系统成本和PCB面积。单电阻采样技术通过在母线负端串联单个采样电阻,配合特定的采样时序和重构算法,能够以更低的成本实现三相电流的准确测量。
我在多个无刷直流电机(BLDC)和永磁同步电机(PMSM)控制项目中验证过这种方案,实测表明在合理的PWM频率下(10-20kHz),单电阻采样完全能满足大多数中低功率应用的需求。相比三电阻方案,BOM成本可降低30%以上,特别适合对成本敏感的量产产品。
2. 硬件设计关键点
2.1 采样电阻选型
采样电阻的阻值选择需要平衡信噪比和功耗:
- 典型值在0.5-5mΩ之间
- 计算公式:P = I²R (例如30A电流下,5mΩ电阻耗散4.5W)
- 建议使用锰铜合金电阻,温度系数<50ppm/℃
我在实际项目中常用的是VISHAY的WSHP2818系列,其3mΩ/1%精度规格在-55℃~170℃范围内表现稳定。布局时要特别注意:
采样电阻必须尽可能靠近MOSFET的源极
采用开尔文连接方式消除引线电阻影响
避免将电阻放置在高温元件附近
2.2 信号调理电路
由于采样信号幅度小且含有高频噪声,需要设计合理的调理电路:
circuit复制Vin --[10k]--+--[100nF]-- GND
|
[10k]
|
Vout-->ADC
- 一级RC滤波(截止频率约160Hz)
- 必要时可增加仪表放大器(如AD623)
- 确保ADC参考电压稳定(使用专用基准芯片如REF3030)
3. 相电流重构算法
3.1 基本重构原理
在FOC控制中,通过合理配置PWM时序,可以在特定时刻捕获到相电流信息。以SVPWM为例:
| PWM状态 | 有效电流路径 | 可测电流 |
|---|---|---|
| 0-60° | A相上管 + B相下管 | Ic = -Ia-Ib |
| 60-120° | A相上管 + C相下管 | Ib = -Ia-Ic |
算法实现步骤:
- 在PWM周期中插入采样窗口(通常在下管导通中期)
- 通过ADC捕获采样电阻电压
- 根据当前扇区选择重构公式
- 进行克拉克变换得到Iα/Iβ
3.2 STM32F103实现要点
在Keil工程中需要配置的关键外设:
c复制// PWM定时器配置(TIM1)
TIM_TimeBaseInitTypeDef TIM_Base;
TIM_Base.TIM_Prescaler = 72-1; // 1MHz计数频率
TIM_Base.TIM_Period = 1000-1; // 10kHz PWM
TIM_OCInitTypeDef TIM_OC;
TIM_OC.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OC.TIM_Pulse = 500; // 50%占空比
// ADC配置(注入通道)
ADC_InjectedSequencerLengthConfig(ADC1, 1);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5);
关键中断处理逻辑:
c复制void TIM1_CC_IRQHandler(void) {
if(TIM_GetITStatus(TIM1, TIM_IT_CC1)) {
ADC_SoftwareStartInjectedConv(ADC1); // 触发采样
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
}
}
4. 工程实现中的坑与技巧
4.1 采样时序优化
实测发现采样窗口位置对精度影响很大:
- 过早采样:MOSFET未完全导通
- 过晚采样:续流二极管开始导通
建议通过示波器观察实际波形,调整CCR值使采样点位于下管电流稳定区。
4.2 数字滤波处理
原始采样数据需进行滑动平均滤波:
c复制#define FILTER_LEN 8
int16_t filter_buf[FILTER_LEN];
int16_t moving_avg(int16_t new_val) {
static uint8_t idx = 0;
filter_buf[idx++] = new_val;
if(idx >= FILTER_LEN) idx = 0;
int32_t sum = 0;
for(uint8_t i=0; i<FILTER_LEN; i++) {
sum += filter_buf[i];
}
return (int16_t)(sum/FILTER_LEN);
}
4.3 校准补偿技巧
由于硬件存在零漂,建议:
- 上电时自动校准偏移量(电机静止状态)
- 存储补偿值到Flash
- 定期进行在线校准(检测死区电流)
5. 完整工程架构
我的Keil工程主要包含以下模块:
code复制/Drivers
/STM32F10x_StdPeriph_Driver // 标准库
/User
/bsp_adc.c // ADC驱动
/bsp_pwm.c // PWM配置
/current_recon.c // 重构算法
/foc_control.c // 核心控制
/main.c // 应用逻辑
关键参数配置:
c复制// 在current_recon.h中定义
#define SHUNT_RESISTOR 0.003f // 3mΩ
#define ADC_REF_VOLTAGE 3.3f // 参考电压
#define ADC_MAX_COUNT 4095 // 12bit ADC
电流重构函数示例:
c复制void ReconstructCurrents(void) {
float adc_voltage = (float)ADC_Value * ADC_REF_VOLTAGE / ADC_MAX_COUNT;
float bus_current = adc_voltage / SHUNT_RESISTOR;
switch(sector) {
case 1:
phaseC = -bus_current;
phaseA = (2*Ia + Ib)/3; // 克拉克逆变换
break;
// 其他扇区处理...
}
}
6. 实测性能数据
在24V/5A的PMSM平台上测试结果:
| 指标 | 单电阻方案 | 三电阻方案 |
|---|---|---|
| 静态误差 | ±0.05A | ±0.03A |
| 动态响应延迟 | 50μs | 20μs |
| CPU占用率 | 15% | 8% |
| 成本 | $0.3 | $1.2 |
虽然动态性能略逊于三电阻方案,但在大多数速度环控制场景下已经足够。如果使用F303系列芯片(带硬件PWM触发ADC),性能还可提升30%。
7. 进阶优化方向
对于要求更高的应用,可以考虑:
- 采用双采样技术(PWM周期中两次采样)
- 注入高频扰动补偿采样盲区
- 使用STM32的HRTIM配合ADC3实现硬件同步
- 引入卡尔曼滤波替代滑动平均
我在最近的一个无人机电调项目中,通过组合技术1和3,将电流检测延迟降低到了25μs以内,满足了高速FOC的控制需求。具体实现涉及PWM模式7的特殊配置,这里不再展开。