3. 电流采样与重构
任务目标
在FOC控制中,三相电流的准确获取是电流环控制的基础。本案例使用双电阻采样方案,在PWM周期内对两相下桥臂电阻的电流进行采样,并通过基尔霍夫定律重构第三相电流,最终验证重构精度。
实现原理
双电阻采样利用电机三相下桥臂串联的采样电阻,在一个PWM周期内,当某一相下桥臂导通时,该相电流流过采样电阻。由于任意时刻三相电流之和为零(星形连接且无中线),只需采样两相即可计算第三相:i_c = -(i_a + i_b)。采样时刻需避开PWM开关切换引起的电流振荡,通常在PWM计数器的特定点(如计数峰值或谷值)触发ADC采样。
关键代码
// 双电阻电流采样与重构 - 基于STM32 HAL库
#include "main.h"
// 采样电阻阻值(Ω)与放大电路增益
#define R_SHUNT 0.01f
#define AMP_GAIN 50.0f
#define VREF 3.3f
#define ADC_RESOLUTION 4095.0f
// 三相电流重构结果
typedef struct {
float ia; // A相电流(A)
float ib; // B相电流(A)
float ic; // C相电流(A)
} PhaseCurrents;
// 根据ADC原始值计算实际电流
static float adc_to_current(uint16_t adc_val, float offset_val) {
float voltage = (adc_val / ADC_RESOLUTION) * VREF;
float current = (voltage - offset_val) / (R_SHUNT * AMP_GAIN);
return current;
}
// 双电阻采样重构 - 在PWM中断中调用
// adc_a: A相采样电阻ADC值, adc_b: B相采样电阻ADC值
// offset_a, offset_b: 零电流时的ADC偏移(校准值)
PhaseCurrents reconstruct_currents(uint16_t adc_a, uint16_t adc_b,
float offset_a, float offset_b) {
PhaseCurrents currents;
// 采样时刻对应下桥臂导通,电流方向为流出电机
currents.ia = adc_to_current(adc_a, offset_a);
currents.ib = adc_to_current(adc_b, offset_b);
// 基尔霍夫定律重构C相
currents.ic = -(currents.ia + currents.ib);
return currents;
}
// 验证函数:给定已知三相电流,模拟ADC采样并重构
void verify_reconstruction(void) {
// 测试用例1:平衡三相电流
float test_ia = 2.0f, test_ib = -1.0f, test_ic = -1.0f;
// 模拟ADC转换(理想情况,忽略噪声)
float va = test_ia * R_SHUNT * AMP_GAIN + VREF/2;
float vb = test_ib * R_SHUNT * AMP_GAIN + VREF/2;
uint16_t adc_a = (uint16_t)(va / VREF * ADC_RESOLUTION);
uint16_t adc_b = (uint16_t)(vb / VREF * ADC_RESOLUTION);
// 零电流偏移(此处设为VREF/2对应值)
float offset_a = VREF/2 / VREF * ADC_RESOLUTION;
float offset_b = VREF/2 / VREF * ADC_RESOLUTION;
PhaseCurrents result = reconstruct_currents(adc_a, adc_b, offset_a, offset_b);
// 计算重构误差
float err_a = result.ia - test_ia;
float err_b = result.ib - test_ib;
float err_c = result.ic - test_ic;
// 输出验证结果(通过串口或调试器观察)
// 预期:err_a≈0, err_b≈0, err_c≈0
}
运行与验证
- 硬件连接:将电机三相线接入驱动器,A、B两相下桥臂串联采样电阻,采样电阻两端接入差分放大电路后连接ADC通道。
- ADC触发配置:在PWM定时器中断中配置ADC注入组转换,触发时刻设为PWM计数峰值(此时下桥臂导通稳定)。
- 偏移校准:电机静止且所有下桥臂关断时,读取ADC值作为零电流偏移(代码中
offset_a/offset_b)。 - 运行验证:调用
verify_reconstruction(),通过调试器观察err_a、err_b、err_c变量。
通过条件:重构误差值小于满量程电流的2%(例如满量程10A时误差<0.2A)。若误差较大,检查采样时刻是否避开开关噪声、放大电路带宽是否足够、ADC偏移校准是否准确。
常见问题
- 采样点噪声:PWM开关瞬间电流振荡剧烈,需将采样点设置在开关动作后的死区时间之外,通常为PWM周期的中间点。
- 低调制比失效:当某相占空比接近0%或100%时,下桥臂导通时间过短,无法完成采样。此时需切换为其他采样策略(如单电阻或三电阻),或限制调制比范围。
- ADC偏移漂移:温度变化会导致运放偏移漂移,建议在系统空闲时周期性校准。