4. ADC采样与电流检测:ADC工作原理、电流采样电阻、霍尔电流传感器、过采样技术
各位同学,咱们今天聊点实在的——电流检测。做电机控制,说白了就是在跟电流打交道。你电流都测不准,那还谈什么控制精度?我刚开始做无刷电机驱动那会儿,就吃过这个亏。板子画得漂漂亮亮,代码写得洋洋洒洒,结果电机一转起来,波形跟心电图似的……后来一查,是ADC采样时序没处理好。
好,咱们一步步来。先搞清楚ADC到底是怎么工作的。
4.1 ADC工作原理:从模拟到数字的那一步
ADC,全称模数转换器。它的任务很简单:把连续的模拟电压,变成离散的数字量。但简单背后有门道。
咱们MCU里最常用的是逐次逼近型ADC(SAR ADC)。它的工作原理,你可以想象成“用天平称重量”。
- 你有一个未知电压(模拟量)
- 内部有一个DAC,可以产生参考电压的一半、四分之一、八分之一……
- 比较器不断比较:未知电压比参考大还是小?
- 从最高位开始,逐位逼近,直到精度满足
举个例子:参考电压3.3V,12位ADC。那么1LSB = 3.3V / 4096 ≈ 0.8mV。也就是说,你测到的数字量每变化1,对应电压变化0.8mV。
关键参数:
- 分辨率:12位、16位最常见。位数越高,精度越高,但采样速度会下降。
- 采样率:单位是SPS(每秒采样次数)。电机控制一般需要几十kSPS到几百kSPS。
- 转换时间:从启动采样到输出数字量所需的时间。包括采样时间和转换时间。
嗯,这里要注意一点:ADC的采样时间不能太短。采样时间不够,采样电容没充满,结果就会偏小。我见过有人把采样时间设成1个时钟周期,结果测出来的电压永远差一截。后来我把采样时间调到8个周期,数据就正常了。
4.2 电流采样电阻:最直接的方法
电流采样电阻,也叫分流电阻、采样电阻。原理就是欧姆定律:V = I × R。测电阻两端的电压,除以电阻值,就得到电流。
听起来简单,但实际用起来坑不少。
避坑指南:
- 电阻值选多大?太小了,压降小,信噪比差;太大了,发热严重,还影响电路效率。我一般选1mΩ到10mΩ之间,具体看电流大小。
- 功率要留余量:P = I² × R。比如10A电流,5mΩ电阻,功率就是0.5W。我习惯选2倍余量,也就是1W的电阻。
- 四线开尔文接法:这个必须用!采样电阻的焊盘会引入接触电阻,用四线接法才能消除这个误差。我早期做的一个项目,就是因为没用四线接法,电流误差高达5%。
采样电阻的位置也有讲究。常见的有三种:
- 低端采样:电阻放在MOS管源极和GND之间。优点是共模电压低,ADC好处理。缺点是电流路径上多了个电阻,会影响驱动电路。
- 高端采样:电阻放在电源和MOS管漏极之间。优点是电流路径干净。缺点是共模电压高,需要差分放大器。
- 三相桥臂采样:在每相下管串联电阻。这是FOC控制最常用的方式,可以分别检测三相电流。
我个人习惯用三相桥臂采样,配合差分运放。虽然成本高一点,但信号质量好,调试起来省心。
4.3 霍尔电流传感器:隔离与精度兼得
采样电阻虽然便宜,但它有个硬伤——不隔离。如果系统里有大功率部分,或者需要做电气隔离,那霍尔电流传感器就是更好的选择。
霍尔传感器的工作原理,说白了就是:电流流过导体,产生磁场;霍尔元件检测磁场强度,输出对应的电压。输入和输出之间是电气隔离的,安全性高。
| 对比项 | 采样电阻 | 霍尔传感器 |
|---|---|---|
| 成本 | 低(几毛到几块) | 高(十几到几十块) |
| 隔离 | 无 | 有 |
| 精度 | 高(0.1%~1%) | 中等(1%~3%) |
| 带宽 | 高(取决于运放) | 中等(几十kHz) |
| 功耗 | 有发热 | 几乎无发热 |
我在一个工业伺服驱动项目里用过霍尔传感器。当时客户要求隔离电压3kV,采样电阻根本没法用。我选了ACS712系列的芯片,30A量程,输出灵敏度66mV/A。用起来挺方便,直接接ADC就行。
不过要注意,霍尔传感器有零点漂移。上电后先测一次零电流时的输出,然后在软件里做校准。我曾经因为没做这个校准,导致电机在零速时还有0.5A的电流显示,查了半天才发现是温漂引起的。
4.4 过采样技术:用速度换精度
好,现在问题来了:你的MCU只有12位ADC,但你需要14位的精度,怎么办?换芯片?成本太高。加外部ADC?太麻烦。
其实有个巧妙的办法——过采样技术。
原理很简单:对同一个信号多次采样,然后求平均。根据统计学原理,每增加4倍采样次数,信噪比提升6dB,相当于增加1位有效分辨率。
公式是这样的:
有效分辨率 = 原始分辨率 + log₂(过采样率) / 2
举个例子:
12位ADC,过采样率16倍(采样16次求平均)
有效分辨率 = 12 + log₂(16) / 2 = 12 + 4/2 = 14位
是不是很划算?但要注意几个前提:
- 信号中必须包含足够的噪声。如果信号太干净,过采样就没效果。我一般会在ADC输入端故意加一点白噪声,或者利用电路本身的噪声。
- 采样速度要够快。16倍过采样意味着采样时间变成16倍。如果你的控制周期是100μs,那每次采样必须在6.25μs内完成。
- 求平均时要注意数据溢出。16次12位数据累加,最大值是16×4095=65520,需要16位变量来存。
实战技巧:
我在做低压伺服驱动器时,MCU的ADC只有12位,但电流环需要14位的分辨率。我用了64倍过采样,配合DMA自动采集,每64个采样点触发一次中断做平均。这样既保证了精度,又不占用CPU时间。代码大概长这样:
// 过采样配置示例
#define OVERSAMPLE_RATIO 64
uint16_t adc_buffer[OVERSAMPLE_RATIO];
uint32_t sum = 0;
// DMA传输完成中断
void DMA_ADC_Complete_IRQ(void) {
for(int i = 0; i < OVERSAMPLE_RATIO; i++) {
sum += adc_buffer[i];
}
uint16_t result = sum / OVERSAMPLE_RATIO; // 12位结果
// 或者保留高位,得到14位结果
uint16_t high_res = sum >> 2; // 等效14位
sum = 0;
}
嗯,这里要提醒一下:过采样不是万能的。如果你的信号本身就有周期性干扰(比如PWM开关噪声),那过采样反而会把噪声“平均”进信号里。我建议先做硬件滤波,再做软件过采样,效果最好。
4.5 电流检测的实战要点
最后,我把自己这些年踩过的坑总结一下,给大家做个参考:
- 采样时序要对齐:电流采样一定要在PWM的特定时刻触发。我一般在下管导通的中点采样,这时候电流最稳定。如果随便采,采到的可能是开关噪声。
- 运放选型要匹配:采样电阻的压降很小(几十mV),需要运放放大。运放的失调电压要小于1mV,温漂要小。我常用的是LMV358或者MCP6002,性价比不错。
- PCB布局要讲究:采样电阻到运放的走线要短,要远离大电流回路。我见过有人把采样电阻放在电感旁边,结果采出来的电流全是毛刺。
- 软件滤波不能少:即使硬件做得再好,软件里也要加一阶低通滤波。截止频率我一般设在1kHz到5kHz之间,具体看控制周期。
好了,这一章的内容就到这儿。电流检测是电机控制的“眼睛”,眼睛看不清,后面再好的算法也白搭。下一章咱们聊聊电流环的PI参数整定,那又是一个让人头秃的话题……