1. 单电阻采样相电流重构技术解析
在电机控制领域,相电流检测是FOC(磁场定向控制)等先进算法的基石。传统方案采用三个采样电阻配合隔离运放,不仅增加BOM成本,还占用宝贵的PCB面积。单电阻采样技术通过在直流母线负极串联单个采样电阻,配合特定的重构算法,实现了三相电流的精确检测。我在多个无刷电机控制项目中验证,这种方案可降低约15%的硬件成本,特别适合STM32F103等资源受限的MCU。
单电阻采样的核心挑战在于:单个电阻只能获取母线电流瞬时值,而我们需要重构出三相电流(Ia、Ib、Ic)。这需要巧妙利用PWM开关状态与采样时序的配合。如图1所示,当上桥臂MOSFET导通时(Sa=1),母线电流即等于该相电流。通过合理安排采样时刻,可以在不同PWM周期片段中捕获各相电流信息。
关键提示:采样时刻必须避开PWM切换的死区时间,否则会引入严重噪声。根据我的实测,建议在PWM周期中点位置设置采样点,此时电流纹波最小。
2. 硬件设计与采样策略
2.1 典型电路拓扑
单电阻采样硬件电路包含三个关键部分:
- 低边采样电阻:通常选用50mΩ-100mΩ的锰铜电阻,功率需满足I²R计算值(例如2A电流下100mΩ电阻耗散0.4W)
- 差分放大电路:采用LMV358等低成本运放,增益设置20-50倍(对应输出电压0.5-2V)
- RC滤波网络:截止频率应高于PWM频率的1/10(如20kHz PWM对应2kHz截止频率)
我在实际项目中使用的参数如下表:
| 元件 | 参数选择 | 设计考量 |
|---|---|---|
| 采样电阻 | 50mΩ/1W 锰铜电阻 | 平衡灵敏度与功耗 |
| 运放增益 | 30倍 | 适配STM32 ADC输入范围 |
| 滤波电容 | 1nF陶瓷电容 | 抑制PWM开关噪声 |
2.2 PWM调制与采样时序
在空间矢量PWM(SVPWM)控制中,每个PWM周期可分为7个有效矢量区间。通过合理设计ADC触发时机,可以在特定区间捕获有效的相电流信息。以STM32F103为例,需要配置TIM1的触发输出(TRGO)与ADC的触发输入同步:
c复制// TIM1配置示例
TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger);
// ADC配置示例
ADC_ExternalTrigConvConfig(ADC1, ADC_ExternalTrigConv_T1_TRGO);
经验分享:在调试中发现,ADC采样保持时间应设置为7.5个时钟周期(72MHz主频下约104ns),可兼顾转换精度与速度。过短的保持时间会导致采样值波动较大。
3. 相电流重构算法实现
3.1 基本重构原理
根据基尔霍夫电流定律(Ia + Ib + Ic = 0),我们只需要重构出两相电流即可得到第三相。通过在不同PWM矢量区间采样母线电流,可以得到:
- 区间1:I_bus = Ia
- 区间2:I_bus = Ib
- 区间3:I_bus = -Ic
在Keil工程中,我采用状态机实现区间判断与数据关联:
c复制typedef enum {
SECTOR1 = 0,
SECTOR2,
//...其他扇区
} SectorType;
SectorType GetCurrentSector(float alpha, float beta) {
// 根据Clarke变换结果判断当前扇区
if(beta > 0) {
if(alpha > beta * 0.57735f) return SECTOR1;
else return SECTOR2;
}
//...其他扇区判断
}
3.2 非线性补偿技术
由于MOSFET导通电阻、死区时间等因素,实际采样值存在非线性误差。我采用三段式补偿方案:
- 零点校准:电机静止时记录ADC偏移值
- 增益校准:施加已知负载电流进行标定
- 死区补偿:根据电流方向添加补偿电压(约50-100mV)
在STM32F103上实现的补偿函数:
c复制float CurrentCompensation(float raw_adc, int direction) {
static const float deadtime_comp = 0.075f; // 75mV补偿量
float comp_value = (direction > 0) ? deadtime_comp : -deadtime_comp;
return (raw_adc - offset_calib) * gain_factor + comp_value;
}
4. Keil工程实现要点
4.1 工程架构设计
完整的Keil MDK工程包含以下关键模块:
- 硬件抽象层(HAL):ADC/TIMER/PWM配置
- 算法层:Clarke/Park变换、PID控制
- 重构核心:相电流状态机、补偿算法
- 调试接口:通过USART输出实时波形
工程目录结构建议如下:
code复制/Project
/CMSIS // 内核支持文件
/Drivers
/STM32F1xx_HAL // HAL驱动
/Middlewares
/MotorControl // 电机控制算法
/User
/App // 应用层代码
/BSP // 板级支持包
4.2 关键外设配置
在STM32CubeMX中需要特别注意的配置:
- ADC注入通道:设置4个注入通道(3相电流+母线电压)
- TIM1中央对齐模式:选择Mode 2(中央对齐模式1)
- DMA设置:配置ADC与内存间的循环DMA传输
对应的初始化代码片段:
c复制// ADC多通道DMA配置
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DMAContinuousRequests = ENABLE;
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 4);
5. 调试技巧与问题排查
5.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电流波形畸变 | 采样时序不对齐 | 调整ADC触发偏移 |
| 零电流时有偏置 | 运放零点漂移 | 重新校准偏移量 |
| 高频噪声干扰 | 滤波电容失效 | 更换为低ESR陶瓷电容 |
| 重构电流不连续 | 扇区切换逻辑错误 | 检查GetCurrentSector函数 |
5.2 示波器调试技巧
- 同步触发:将TIM1的CH4输出作为示波器触发源
- 多通道观测:
- 通道1:PWM输出(TIM1_CH1)
- 通道2:ADC采样保持信号(通过GPIO模拟)
- 通道3:采样电阻两端电压
- 电流重建验证:对比重构值与电流探头测量结果
我在调试中发现,当PWM频率超过15kHz时,需要将ADC采样时钟分频至14MHz以下(72MHz/6=12MHz),否则转换精度会明显下降。这个经验在STM32F103数据手册中并未明确说明。
6. 性能优化方向
对于需要更高精度的应用,可以考虑以下增强措施:
-
过采样技术:通过16倍过采样将12位ADC提升至14位有效精度
c复制// 过采样实现示例 #define OVERSAMPLE 16 uint32_t sum = 0; for(int i=0; i<OVERSAMPLE; i++) { sum += adc_buffer[0]; // 假设通道0为电流采样 while(!DMA_Flag); // 等待新数据 } current_raw = sum >> 2; // 16倍过采样提升2位 -
动态补偿算法:根据温度传感器读数实时调整补偿参数
-
滑动窗口滤波:对重构结果进行移动平均滤波
在资源允许的情况下,还可以移植到STM32F4系列,利用其硬件浮点单元加速算法运算。实测表明,F407的FPU可将Clarke/Park变换耗时从56us(F103软件浮点)降低到3.2us。
