2、电流采样原理:霍尔电流传感器与采样电阻的对比、三相电流重构技术、采样时刻与PWM同步
电流采样,是电流环的「眼睛」。眼睛不好使,后面控制得再好也白搭。我这些年调试伺服驱动,遇到最多的坑,十有八九都出在采样环节。今天咱们就把这块掰开揉碎了讲清楚。
2.1 霍尔电流传感器 vs 采样电阻
先说两种主流方案。你想想看,一个几十千瓦的大电机,母线电流几百安培,用采样电阻?那电阻得冒烟。反过来,一个几十瓦的小伺服,用霍尔传感器?成本上划不来。
霍尔电流传感器,说白了就是利用霍尔效应,把电流转换成磁场,再转成电压信号。它的优点是隔离、不发热、带宽高。我做过一个项目,电机峰值电流600A,用的就是LEM的闭环霍尔传感器,精度能做到0.5%以内。
采样电阻(也叫分流器),原理就是欧姆定律,I = U / R。简单、便宜、线性度好。但有个致命问题——发热。我记得有一次调试,采样电阻温度从25℃升到85℃,阻值漂了将近5%,电流环的增益直接跟着飘,电机跑起来嗡嗡响。
| 对比项 | 霍尔电流传感器 | 采样电阻 |
|---|---|---|
| 隔离方式 | 磁隔离(天然隔离) | 需额外隔离放大器 |
| 功耗 | 低(毫瓦级) | 高(I²R,大电流时发热严重) |
| 带宽 | 通常100kHz~500kHz | DC~数MHz(取决于寄生参数) |
| 温度漂移 | 约±100ppm/℃ | 铜电阻约3900ppm/℃,锰铜约±50ppm/℃ |
| 成本 | 高(几十到几百元) | 低(几毛到几元) |
| 适用场景 | 中大功率、高精度、需要隔离 | 小功率、低成本、板级集成 |
2.2 三相电流重构技术
好,现在问题来了。伺服驱动器通常只需要两相电流(比如Ia和Ib),第三相Ic = -(Ia + Ib)就能算出来。但有些场合,比如单电阻采样方案,你只有一个采样点,怎么拿到三相电流?
这就是三相电流重构要干的事。说白了,就是利用PWM开关状态,在特定的时刻只采样母线电流,然后反推出三相电流。
为什么会这样?因为逆变器的开关管导通时,母线电流就等于某相电流。比如A相上管导通、B相下管导通、C相下管导通时,母线电流就等于Ia。换个开关状态,母线电流又等于Ib。
我做过一个单电阻采样的项目,当时为了省成本,把双电阻改成了单电阻。结果发现,在PWM占空比接近0%或100%时,采样窗口太窄,根本采不到有效值。嗯,这里要注意——重构算法有个「盲区」问题。
- 根据PWM开关状态,确定当前母线电流对应哪一相
- 在合适的采样时刻触发ADC
- 至少采集两个不同开关状态下的母线电流
- 结合基尔霍夫电流定律,计算出第三相
举个例子,假设在一个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);
}
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);
}
最后说一句,采样时刻和PWM同步这件事,看似简单,但实际调试时往往会被忽略。你想想看,电流环带宽越高,对采样时刻的精度要求就越苛刻。1kHz带宽时,采样抖动允许几十微秒;10kHz带宽时,抖动必须控制在几微秒以内。所以,硬件上要用高精度定时器,软件上要用中断优先级保证ADC触发的实时性。
公众号:蓝海资料掘金营,微信deep3321