3. 电流采样与调理电路:相电流采样方案、运放电路设计、ADC同步触发、采样窗口对齐
做FOC控制,电流采样是第一步,也是最容易出问题的一步。我见过不少项目,算法调得再好,采样进来的信号全是噪声,那什么SVPWM、PI调节器全白搭。说白了,电流采样就是FOC的“眼睛”,眼睛看不清,后面再折腾也没用。
这一章我们重点聊三个事:用什么方案采电流、运放电路怎么搭、ADC怎么跟PWM同步触发。嗯,还有一个容易被忽略的细节——采样窗口对齐。
3.1 相电流采样方案对比
目前主流的方案有三种:三电阻采样、双电阻采样和单电阻采样。我个人的习惯是,能上双电阻就别上单电阻,除非成本压得特别死。
| 方案 | 采样电阻数 | 成本 | 精度 | 重构复杂度 | 适用场景 |
|---|---|---|---|---|---|
| 三电阻采样 | 3个 | 高 | 最高 | 低 | 伺服、高端驱动 |
| 双电阻采样 | 2个 | 中 | 高 | 中 | 通用FOC驱动 |
| 单电阻采样 | 1个 | 低 | 较低 | 高 | 低成本、小功率 |
三电阻采样:每个下桥臂串联一个采样电阻,三相电流直接读,不需要重构。精度最高,但成本也最高。我在做伺服驱动器时用的就是这种方案,调试起来最省心。
双电阻采样:只采两相电流,第三相通过基尔霍夫定律算出来(Ia + Ib + Ic = 0)。这是目前FOC驱动里最常用的方案,性价比很高。GD32的ADC有3个通道,刚好可以同时采两相,非常方便。
单电阻采样:只用一个电阻,放在直流母线上。通过在不同PWM状态下采样,重构出三相电流。这个方案对时序要求极高,采样窗口窄,容易出噪声。我建议新手别碰这个,除非你真的很清楚自己在做什么。
我的建议:做GD32 FOC实战,优先选双电阻采样。成本可控,精度够用,调试难度适中。
3.2 运放电路设计要点
采样电阻上的电压信号非常微弱,一般只有几十到几百毫伏。直接送ADC肯定不行,必须经过运放放大和偏置处理。
运放电路的核心任务就两个:放大和电平移位。
3.2.1 放大倍数怎么定
假设采样电阻是10mΩ,最大相电流10A,那采样电阻上的最大电压就是100mV。GD32的ADC参考电压一般是3.3V,但实际采样范围建议用到2.5V左右,留点余量。
放大倍数 = 2.5V / 0.1V = 25倍。
我一般选25~30倍之间,具体看电阻精度和噪声水平。放大倍数太大,小信号噪声也会被放大;太小,ADC分辨率浪费了。
3.2.2 电平移位
电机电流是交流的,有正有负。但ADC只能采0~3.3V的正电压。所以需要把双极性的电流信号,抬升到ADC的中间电平附近。
常用的做法是用一个Vref/2的偏置电压,把信号整体抬升1.65V。这样,正电流对应1.65V以上,负电流对应1.65V以下。
小技巧:偏置电压的精度直接影响电流零点漂移。我习惯用精密电阻分压加一个电压跟随器,或者直接用基准源芯片。别图省事直接从3.3V分压,温漂会让你怀疑人生。
3.2.3 运放选型
FOC电流采样对运放的要求:低失调电压、低噪声、足够的带宽。
- 失调电压:最好小于1mV,否则零点漂移严重。
- 带宽:至少10倍于PWM频率。PWM一般20kHz,运放带宽至少要200kHz。
- 压摆率:足够快,避免信号失真。
我常用的运放型号:LMV358(低成本)、OPA2333(高精度)、MCP6002(通用)。GD32内部也有运放,但性能一般,建议外部搭。
3.3 ADC同步触发与采样窗口对齐
这是FOC电流采样里最容易被忽视,但也是最关键的一环。
为什么要同步触发?因为电流采样必须在PWM周期的特定时刻进行,才能采到真实的相电流。
3.3.1 采样时刻的选择
在SVPWM调制中,电流采样通常选在PWM周期的中间点,也就是下桥臂全部导通的时候。这时候母线电流等于相电流,噪声最小。
为什么是中间点?因为PWM开关动作会产生尖峰噪声,采样点要避开这些尖峰。中间点离开关动作最远,噪声最小。
注意:采样窗口不能太宽,也不能太窄。太宽容易采到开关噪声,太窄ADC转换时间不够。GD32的ADC转换时间可以配置,一般设到500ns~1μs比较稳妥。
3.3.2 GD32的ADC触发配置
GD32的ADC支持多种触发源,包括定时器的TRGO事件。我们可以用高级定时器(如TIMER0)的TRGO来触发ADC转换。
配置步骤大致如下:
- 配置PWM定时器,设置TRGO事件发生在PWM周期中间点。
- 配置ADC为外部触发模式,触发源选择对应的定时器TRGO。
- 配置ADC采样时间,确保在采样窗口内完成转换。
- 启动ADC,等待触发。
// GD32 ADC同步触发配置示例
void adc_sync_config(void) {
// 1. 配置ADC时钟
rcu_periph_clock_enable(RCU_ADC0);
adc_clock_config(ADC_ADCCK_PCLK2_DIV6);
// 2. 配置ADC为外部触发模式
adc_external_trigger_config(ADC0, ADC_EXT_TRIGGER_CONV, ENABLE);
adc_external_trigger_source_config(ADC0, ADC_EXT_TRIGGER_CONV, ADC0_EXT_TRIGGER_T0_TRGO);
// 3. 配置采样时间
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);
adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);
adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);
// 4. 使能ADC
adc_enable(ADC0);
delay_1ms(1);
adc_calibration_enable(ADC0);
}
3.3.3 采样窗口对齐的实战经验
我曾经在一个项目里,电流波形总是有毛刺,怎么滤波都滤不干净。后来用示波器一看,发现采样点正好落在了PWM开关噪声的尖峰上。调整了TRGO的触发延迟,把采样窗口往后挪了200ns,毛刺立刻消失了。
所以,采样窗口对齐不是配好寄存器就完事了。一定要用示波器实测,确认采样点确实在PWM周期的中间点,并且避开了开关噪声。
避坑指南:我曾经因为采样窗口没对齐,导致电流环PI参数怎么调都调不好。后来发现是采样值里混了开关噪声,电流反馈不准。所以,采样窗口对齐是FOC调试的第一步,也是最重要的一步。
3.4 整体采样链路结构图
下面这张图展示了从相电流到ADC的完整信号链路,方便你理解整个流程。
3.5 采样电路调试检查清单
最后,我整理了一份调试检查清单,每次做新板子我都会过一遍:
- 运放输出静态电压:无电流时,输出应该是1.65V ± 10mV。偏差太大说明偏置电路有问题。
- 放大倍数验证:加一个已知的小电流,测运放输出,计算实际放大倍数是否跟设计一致。
- ADC采样值零点校准:无电流时,ADC读数应该在2048附近(12位ADC)。如果偏差大,软件做零点校准。
- 采样时刻验证:用示波器同时看PWM输出和ADC触发信号,确认采样点位置。
- 噪声水平评估:电机静止时,看ADC采样值的波动范围。波动超过5个LSB,说明噪声偏大,需要检查布局和滤波。
我的习惯:每次新板子回来,我都会先测运放输出,再测ADC采样值,最后才上电机。一步一步确认,避免烧板子。