2、电流采样原理:霍尔电流传感器与采样电阻的对比、三相电流重构技术、采样时刻与PWM同步

电流采样,是电流环的「眼睛」。眼睛不好使,后面控制得再好也白搭。我这些年调试伺服驱动,遇到最多的坑,十有八九都出在采样环节。今天咱们就把这块掰开揉碎了讲清楚。

2.1 霍尔电流传感器 vs 采样电阻

先说两种主流方案。你想想看,一个几十千瓦的大电机,母线电流几百安培,用采样电阻?那电阻得冒烟。反过来,一个几十瓦的小伺服,用霍尔传感器?成本上划不来。

霍尔电流传感器,说白了就是利用霍尔效应,把电流转换成磁场,再转成电压信号。它的优点是隔离、不发热、带宽高。我做过一个项目,电机峰值电流600A,用的就是LEM的闭环霍尔传感器,精度能做到0.5%以内。

采样电阻(也叫分流器),原理就是欧姆定律,I = U / R。简单、便宜、线性度好。但有个致命问题——发热。我记得有一次调试,采样电阻温度从25℃升到85℃,阻值漂了将近5%,电流环的增益直接跟着飘,电机跑起来嗡嗡响。

对比项 霍尔电流传感器 采样电阻
隔离方式 磁隔离(天然隔离) 需额外隔离放大器
功耗 低(毫瓦级) 高(I²R,大电流时发热严重)
带宽 通常100kHz~500kHz DC~数MHz(取决于寄生参数)
温度漂移 约±100ppm/℃ 铜电阻约3900ppm/℃,锰铜约±50ppm/℃
成本 高(几十到几百元) 低(几毛到几元)
适用场景 中大功率、高精度、需要隔离 小功率、低成本、板级集成
我的个人习惯: 功率超过1kW,我基本不用采样电阻。不是不能用,而是你算算散热和温漂的账,往往得不偿失。1kW以下,采样电阻配合高精度运放,性价比很高。

2.2 三相电流重构技术

好,现在问题来了。伺服驱动器通常只需要两相电流(比如Ia和Ib),第三相Ic = -(Ia + Ib)就能算出来。但有些场合,比如单电阻采样方案,你只有一个采样点,怎么拿到三相电流?

这就是三相电流重构要干的事。说白了,就是利用PWM开关状态,在特定的时刻只采样母线电流,然后反推出三相电流。

为什么会这样?因为逆变器的开关管导通时,母线电流就等于某相电流。比如A相上管导通、B相下管导通、C相下管导通时,母线电流就等于Ia。换个开关状态,母线电流又等于Ib。

我做过一个单电阻采样的项目,当时为了省成本,把双电阻改成了单电阻。结果发现,在PWM占空比接近0%或100%时,采样窗口太窄,根本采不到有效值。嗯,这里要注意——重构算法有个「盲区」问题。

三相电流重构的核心步骤:
  1. 根据PWM开关状态,确定当前母线电流对应哪一相
  2. 在合适的采样时刻触发ADC
  3. 至少采集两个不同开关状态下的母线电流
  4. 结合基尔霍夫电流定律,计算出第三相

举个例子,假设在一个PWM周期内,你先后采集到了母线电流等于Ia和Ib,那么Ic = -(Ia + Ib)。听起来简单,但实际做起来,采样时刻的选取非常讲究。

// 三相电流重构伪代码示例
// 假设PWM周期为Tpwm,ADC在特定时刻触发

void CurrentReconstruction(void)
{
    // 读取ADC结果
    uint16_t adc_val1 = ADC_GetResult(ADC_CH0);  // 时刻1:母线电流 = Ia
    uint16_t adc_val2 = ADC_GetResult(ADC_CH1);  // 时刻2:母线电流 = Ib
    
    // 转换为实际电流值
    float Ibus1 = ADC_To_Current(adc_val1);
    float Ibus2 = ADC_To_Current(adc_val2);
    
    // 根据PWM状态判断对应关系
    if (pwm_state == STATE_A) {
        Ia = Ibus1;
        Ib = Ibus2;
    } else if (pwm_state == STATE_B) {
        Ia = Ibus1;
        Ic = Ibus2;
    }
    // ... 其他状态判断
    
    // 计算第三相
    Ic = -(Ia + Ib);
}
我曾经踩过的坑: 单电阻采样在占空比接近50%时,两个采样窗口会重叠,导致无法区分两相电流。解决办法是「移相法」或「注入零序分量」,把采样窗口错开。这个技巧,我当年调了整整两周才搞定。

2.3 采样时刻与PWM同步

这是电流环带宽提升的关键。你想想看,如果ADC采样时刻和PWM开关时刻不同步,采到的电流值里混入了开关噪声,那电流环的反馈信号就是脏的。脏信号进PI调节器,出来的控制量能干净吗?

我个人习惯的做法是:在PWM载波的波峰或波谷触发ADC采样。为什么选这两个点?因为此时开关管处于稳定导通状态,母线电流纹波最小,信噪比最高。

具体来说,对于对称PWM(中心对齐模式),波峰和波谷正好对应着开关周期的中间和边界。我一般选择在波谷触发采样,因为此时三相电流都处于稳态,而且距离下一次开关动作还有半个周期的时间,ADC有充足的时间完成转换。

采样同步的黄金法则:
  • 采样时刻避开开关动作瞬间(死区时间前后)
  • 采样窗口宽度要大于ADC转换时间 + 信号建立时间
  • 多相采样时,各相采样时刻要严格对齐(使用同步采样ADC或采样保持器)

我记得有一次,客户反馈电机在低速时抖动厉害。我查了半天,最后发现是ADC采样时刻和PWM同步出了问题。PWM用的是上升沿对齐模式,而ADC采样触发点设在了PWM周期的中间。结果每次采样都正好赶上开关管关断瞬间,电流波形上全是毛刺。后来改成下降沿对齐模式,采样点移到周期末尾,问题立刻解决。

// PWM与ADC同步配置示例(基于STM32)
// 使用定时器的更新事件触发ADC

void PWM_ADC_Sync_Init(void)
{
    // 配置PWM定时器(中心对齐模式)
    TIM_TimeBaseInitTypeDef tim;
    tim.TIM_Prescaler = 0;
    tim.TIM_Period = PWM_PERIOD;  // 例如 1000
    tim.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
    TIM_TimeBaseInit(TIM1, &tim);
    
    // 配置ADC触发源为TIM1的更新事件
    ADC_InitTypeDef adc;
    adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
    adc.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
    ADC_Init(ADC1, &adc);
    
    // 使能定时器更新事件触发ADC
    TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
    TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
}
一个小技巧: 如果ADC转换速度不够快,可以考虑「双采样」——在一个PWM周期内采样两次(波峰和波谷各一次),然后取平均值。这样既能抑制噪声,又能提高等效采样率。我有个项目就是这么干的,电流环带宽从800Hz提到了1.2kHz。

最后说一句,采样时刻和PWM同步这件事,看似简单,但实际调试时往往会被忽略。你想想看,电流环带宽越高,对采样时刻的精度要求就越苛刻。1kHz带宽时,采样抖动允许几十微秒;10kHz带宽时,抖动必须控制在几微秒以内。所以,硬件上要用高精度定时器,软件上要用中断优先级保证ADC触发的实时性。

电流采样原理知识体系 霍尔 vs 采样电阻 • 隔离方式不同 • 功耗与温漂差异 • 带宽与成本权衡 • 适用功率等级 → 选型决定采样精度 三相电流重构 • 单/双/三电阻方案 • PWM状态与电流对应 • 盲区问题与解决 • 移相法/零序注入 → 降低硬件成本 采样时刻与PWM同步 • 波峰/波谷采样 • 避开开关动作时刻 • ADC触发配置 • 双采样平均法 → 提升信噪比 三者共同决定电流环的采样精度与带宽上限 选型 → 重构 → 同步,环环相扣,缺一不可 带宽越高,对采样时刻的精度要求越苛刻
总结一下: 电流采样这件事,选型看功率和成本,重构看PWM策略,同步看时序精度。三者环环相扣。我见过太多工程师只盯着PI参数调来调去,结果问题出在采样上。先把采样搞干净,电流环的带宽自然就上去了。

公众号:蓝海资料掘金营,微信deep3321