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
}

运行与验证

  1. 硬件连接:将电机三相线接入驱动器,A、B两相下桥臂串联采样电阻,采样电阻两端接入差分放大电路后连接ADC通道。
  2. ADC触发配置:在PWM定时器中断中配置ADC注入组转换,触发时刻设为PWM计数峰值(此时下桥臂导通稳定)。
  3. 偏移校准:电机静止且所有下桥臂关断时,读取ADC值作为零电流偏移(代码中offset_a/offset_b)。
  4. 运行验证:调用verify_reconstruction(),通过调试器观察err_a、err_b、err_c变量。

通过条件:重构误差值小于满量程电流的2%(例如满量程10A时误差<0.2A)。若误差较大,检查采样时刻是否避开开关噪声、放大电路带宽是否足够、ADC偏移校准是否准确。

常见问题

  • 采样点噪声:PWM开关瞬间电流振荡剧烈,需将采样点设置在开关动作后的死区时间之外,通常为PWM周期的中间点。
  • 低调制比失效:当某相占空比接近0%或100%时,下桥臂导通时间过短,无法完成采样。此时需切换为其他采样策略(如单电阻或三电阻),或限制调制比范围。
  • ADC偏移漂移:温度变化会导致运放偏移漂移,建议在系统空闲时周期性校准。