ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CC6920差分霍尔电流传感器与STM32 ADC采样实战指南

CC6920差分霍尔电流传感器与STM32 ADC采样实战指南 1. 为什么偏偏选中CC6920这颗差分霍尔电流传感器1.1 从“采样电阻运放”到霍尔方案的转折点做过电机控制或者电源管理的朋友大概率都经历过用采样电阻加运放测电流的阶段。这种方案便宜、直接但痛点也很明显采样电阻上会持续消耗功率电流越大发热越严重运放的共模抑制比在高边采样时经常不够用温漂一上来数据就飘更麻烦的是当被测回路和你的控制电路不共地时采样电阻方案基本就废了。我第一次接触CC6920是在一个低压伺服项目里母线电流需要双向检测峰值能到20A而且功率地和信号地之间有几伏的电位差。当时试过隔离运放成本高、外围复杂后来改用霍尔方案选型时对比了ACS712、ACS724和CC6920。ACS712便宜但带宽只有80kHz响应慢而且零点漂移在温变环境下比较明显ACS724性能好一些但价格上去了。CC6920吸引我的点是差分霍尔架构、带宽能到200kHz以上、零磁滞设计、而且原边和副边之间是天然隔离的耐压值足够应付大多数低压场景。这里要解释一下“差分霍尔”到底差在哪。普通霍尔传感器是单点检测磁场外界共模磁场比如旁边有电机或者变压器漏磁会直接叠加到输出上造成干扰。差分霍尔是在芯片内部放两个霍尔元件一个感应原边电流产生的磁场另一个感应环境磁场两者相减环境共模磁场就被抵消掉了。这个原理和差分放大器抑制共模信号是一个道理只不过这里处理的是磁场而不是电压。1.2 CC6920的核心参数与选型逻辑选型时我一般会先看几个硬指标这里直接列一个对比表方便你快速判断CC6920是否适合你的场景参数项CC6920典型值选型关注点测量范围±20A可定制峰值电流留20%余量灵敏度100mV/A5V供电与ADC参考电压匹配带宽200kHz需覆盖被测信号最高次谐波隔离耐压2.5kVrms按实际共模电压选供电电压4.5V~5.5V注意与MCU电平匹配零点输出VCC/2双向测量时关键非线性度±0.5%高精度场景需校准响应时间2μs过流保护场景要算进去选型时最容易踩的坑是只看电流范围不看带宽。比如你测的是PWM驱动的电机相电流载波频率20kHz那么电流波形里至少包含到100kHz以上的谐波成分如果传感器带宽不够波形就会被“磨圆”峰值测不准FOC控制里的电流环就会振荡。CC6920的200kHz带宽在这个场景下是够用的但如果你做的是GaN或者SiC的高频电源开关频率上了500kHz那就要重新评估了。另一个关键是灵敏度与ADC量程的匹配。CC6920在5V供电下灵敏度是100mV/A零点在2.5V。如果你测±10A输出范围就是1.5V~3.5V正好落在STM32的ADC量程内3.3V参考下需要分压或者用外部参考。但如果你测±20A输出就是0.5V~4.5V超过了3.3V必须做电平搬移或者选3.3V供电的版本。我一般建议直接选3.3V供电的型号省去分压电阻带来的误差和温漂。注意CC6920的零点输出是VCC/2这个“零点”并不是真正的0V而是供电电压的一半。在双向电流测量中ADC读到的值需要先减去这个偏置再除以灵敏度才能得到实际电流。很多人第一次用的时候忘了减偏置结果正负电流全变成正的了。2. 硬件电路设计从原理图到PCB布局的实战细节2.1 外围电路到底需要几个元件CC6920的外围电路极其简单官方数据手册里基本就是几个去耦电容加一个输出滤波。但“简单”不等于“随便画”我见过太多因为外围没处理好导致波形一塌糊涂的案例。先说你至少需要的东西电源去耦VCC引脚旁边放一个0.1μF的陶瓷电容再并一个10μF的钽电容或者MLCC。0.1μF负责高频噪声10μF负责低频波动。这两个电容要尽量靠近芯片引脚走线越短越好。输出滤波CC6920的输出是模拟电压如果后面直接进ADC建议加一个RC低通滤波。我一般用1kΩ电阻加1nF电容截止频率约160kHz刚好在传感器带宽附近既能滤掉高频开关噪声又不会明显影响有用信号。如果你测的是直流或者低频电流可以把截止频率降到10kHz左右用10kΩ加1.5nF。原边走线这是最容易被忽视的地方。CC6920的原边电流路径是芯片内部的铜排但PCB上的走线需要承载大电流。我一般用2oz铜厚走线宽度按1A/mm估算20A至少要走20mm宽或者用铺铜的方式。如果走线太细发热不说还会引入额外的寄生电感影响高频响应。这里有一个我踩过的坑有一次为了省空间原边走线只走了5mm宽结果测20A的时候芯片附近温度到了80多度输出开始漂。后来改成铺铜温度降到40度以下数据就稳了。所以原边走线不是“连通就行”而是要按大电流路径来设计。2.2 PCB布局的四个关键原则布局比原理图重要这句话在电流传感器上体现得淋漓尽致。我总结下来有四个原则第一原边和副边严格分区。CC6920的引脚一边是原边大电流一边是副边信号和电源。PCB上要把这两部分物理隔开中间留足够的爬电距离。如果空间允许可以在芯片下方开槽增加隔离耐压。我一般会在原边和副边之间留至少3mm的间隙高压场景还要更宽。第二模拟输出远离开关节点。如果你的板子上有MOSFET或者IGBT在开关输出走线绝对不要从开关节点旁边经过。我通常会把输出走线走在板子的另一层或者用地线包围起来。有一次一个项目输出走线和MOSFET的漏极走线平行走了3cm结果ADC读到的波形上叠加了明显的开关尖峰后来把输出线改到内层尖峰就消失了。第三地平面处理要讲究。原边地和副边地是分开的最后在一点连接。这个连接点一般选在电源输入电容的接地端。如果你把两个地随便连原边的大电流会在地平面上产生压差这个压差会串到副边信号里造成测量误差。第四去耦电容的接地回路要短。去耦电容的接地引脚要直接打到地平面不要通过过孔绕来绕去。过孔的寄生电感在高频下会让去耦效果大打折扣。我一般会在电容焊盘旁边直接放两个过孔一个接电源一个接地。2.3 与STM32的接口设计CC6920的输出是模拟电压接STM32的ADC引脚就行。但这里有几个细节要注意STM32的ADC输入阻抗不是无穷大在采样的时候会有一个充电过程。如果信号源内阻太大采样电容充不满读数就会偏低。CC6920的输出阻抗典型值是1Ω左右加上我前面说的1kΩ滤波电阻总内阻约1kΩ。STM32的ADC采样时间需要根据这个内阻来设置。以STM32F4为例ADC时钟周期为30MHz时采样时间设为84个周期对应的采样窗口约2.8μs对于1kΩ内阻来说是足够的。如果你用的是STM32G4或者H7系列ADC速度更快采样时间可以适当缩短但建议至少保留15个周期以上。如果你测的是双向电流还需要注意ADC的参考电压。STM32的VDDA通常接3.3V但实际值可能在3.2V到3.4V之间波动。如果你直接用VDDA做参考测量精度会受电源波动影响。高精度场景建议用外部基准比如REF3033或者ADR4533精度能到0.1%以内。提示STM32的ADC引脚在未初始化时是浮空的如果CC6920先上电输出会通过ADC引脚漏电。建议在ADC引脚和传感器输出之间串一个100Ω电阻限流保护。3. STM32端ADC配置与DMA搬运的完整实现3.1 CubeMX里的关键配置项用CubeMX配置ADC的时候有几个参数直接决定了你能不能采到干净的波形。我以STM32G474为例一步步说。首先ADC的时钟源要选对。G474的ADC时钟来自PLLP或者系统时钟最高可以到60MHz。但时钟越快采样窗口越短对信号源内阻的要求越高。我一般把ADC时钟设在40MHz左右兼顾速度和精度。然后是对应通道的采样时间。前面说了CC6920输出内阻约1kΩ我一般设采样时间为247.5个周期G474支持这个档位对应的采样窗口约6μs。这个时间足够采样电容充满读数稳定。触发方式选定时器触发。用TIM2或者TIM3产生PWM触发ADC采样。触发频率根据你的需求来我测电机相电流时一般用20kHz和PWM载波同步。这样每次采样都发生在PWM周期的固定点避免开关噪声干扰。DMA配置选循环模式数据宽度选半字16位因为ADC是12位存在16位变量里就行。DMA的目标地址指向一个数组数组长度根据你需要的缓冲区大小来定。我一般用256或者512个点的缓冲区方便后面做FFT或者波形显示。3.2 代码实现从寄存器到实际读数CubeMX生成代码后你需要自己写几个函数。第一个是ADC校准这个必须在开始转换之前做HAL_ADCEx_Calibration_Start(hadc1, ADC_SINGLE_ENDED);第二个是启动DMA传输HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_buffer, BUFFER_SIZE);第三个是电流换算函数。假设你用的是3.3V供电的CC6920灵敏度是66mV/A3.3V供电时灵敏度会按比例降低零点在1.65V。ADC是12位参考电压3.3V那么#define VREF 3.3f #define ADC_RES 4096.0f #define SENSITIVITY 0.066f // 66mV/A #define ZERO_CURRENT 1.65f float get_current(uint16_t adc_value) { float voltage (float)adc_value / ADC_RES * VREF; return (voltage - ZERO_CURRENT) / SENSITIVITY; }这个函数每调用一次就做一次浮点运算如果你在中断里高频调用可能会影响实时性。优化方法是把除法和乘法合并成一次乘法#define CURRENT_SCALE (VREF / ADC_RES / SENSITIVITY) #define CURRENT_OFFSET (ZERO_CURRENT / SENSITIVITY) float get_current_fast(uint16_t adc_value) { return (float)adc_value * CURRENT_SCALE - CURRENT_OFFSET; }这样每次换算只有一次乘法和一次减法速度快很多。3.3 定时器触发与采样时刻的选择采样时刻的选择直接决定了你采到的波形质量。以电机相电流为例PWM驱动下相电流在开关瞬间会有振铃如果你正好在振铃的时候采样读到的值会偏大或者偏小。正确的做法是在PWM周期的中点采样这时候电流已经稳定振铃也衰减得差不多了。具体实现用TIM1的CH1产生PWM同时用CH4或者另一个定时器产生触发信号。触发信号的位置设在PWM周期的中点。比如PWM频率20kHz周期50μs那么触发点设在25μs处。在CubeMX里你可以把TIM1的TRGO设为OC4REF然后调整CCR4的值来移动触发点。我实测下来中点采样和边沿采样的读数差异能到10%以上尤其是在低占空比的时候。所以这个细节不能省。注意如果你用的是中心对齐PWM模式中点采样会更自然因为计数器在周期中间会经过零点。但中心对齐模式下PWM频率会减半计算的时候要注意。4. 波形分析从原始数据到电流波形的还原4.1 去直流与归一化处理ADC采到的原始数据是0到4095的整数里面包含了零点偏置。要还原成电流波形第一步是去直流。去直流有两种方法一种是硬件上已经知道零点电压直接减另一种是软件上算平均值再减。硬件去直流的前提是你的零点电压很准。但实际中CC6920的零点会随温度漂移典型漂移量是±5mV对应到电流就是±75mA按66mV/A算。如果你测的是小电流这个漂移就很明显了。所以我一般用软件去直流先采一段没有电流的数据算平均值作为零点后面所有数据都减这个值。归一化是把去直流后的数据除以灵敏度得到实际的电流值。如果你只是看波形形状归一化可以省略直接看ADC码值的变化趋势就行。但如果你要做FFT分析谐波就必须归一化否则幅值没有物理意义。4.2 用WaveVersion导入ADC数据做波形分析WaveVersion是一个常用的波形查看工具支持导入CSV格式的数据。你可以把STM32采到的ADC数据通过串口打印成CSV然后在WaveVersion里打开。具体步骤在STM32代码里把ADC缓冲区里的数据通过串口发送出去格式为每行一个数值或者用逗号分隔。用串口助手接收数据保存为.txt或者.csv文件。打开WaveVersion选择导入数据设置采样率。在WaveVersion里做去直流、滤波、FFT等操作。这里有一个小技巧串口打印会拖慢采样速度如果你需要连续采很多点建议用DMA把ADC数据搬到内存采完一整块之后再统一打印。我一般用512点的缓冲区采满之后通过串口发送发送期间ADC继续采下一块用双缓冲机制。4.3 常见波形异常与排查思路波形不对的时候先别急着改代码按下面的顺序排查现象可能原因排查方法波形削顶电流超过量程检查实际电流是否超过传感器范围波形毛刺多开关噪声耦合检查输出滤波和PCB布局零点漂移温度变化或电源波动测量零点电压检查供电稳定性波形失真带宽不足或采样率不够提高采样率检查传感器带宽读数跳动ADC参考不稳或地环路用示波器看VDDA和地平面我遇到最多的是毛刺问题。有一次测一个BLDC电机波形上全是尖峰后来发现是输出滤波电容的地线走得太长和功率地形成了环路。把滤波电容的地直接打到模拟地平面毛刺就没了。另一个常见问题是采样率不够导致的混叠。如果你测的信号里有高频成分但采样率只有信号频率的两倍高频成分会混叠到低频波形看起来完全不对。解决方法是提高采样率或者在ADC前面加抗混叠滤波器。我一般把采样率设在信号最高频率的5到10倍留足余量。5. 实战避坑经验与常见问题速查5.1 供电与参考电压的坑CC6920对供电电压比较敏感尤其是零点输出直接跟VCC挂钩。如果你用5V供电但5V电源本身有纹波零点就会跟着波动。我一般会在CC6920的VCC引脚旁边放一个LDO比如TLV70233把5V稳到3.3V再给传感器供电。这样零点稳定性会好很多。STM32的VDDA也要干净。如果VDDA和VDD共用一路电源数字部分的开关噪声会串到ADC参考上。我通常会在VDDA引脚旁边放一个磁珠加电容把数字噪声滤掉。磁珠选100MHz时阻抗600Ω左右的电容用1μF加0.1μF。5.2 原边电流路径的寄生参数原边走线的寄生电感会影响高频响应。假设你的走线电感是10nH电流变化率是10A/μs那么感应电压就是100mV这个电压会叠加在传感器输出上。虽然CC6920是磁场检测原边电流路径的寄生电感不会直接影响磁场但走线电感和传感器内部铜排电感串联后会影响电流的实际波形。所以原边走线要尽量短、粗、直。我一般会在原边走线上并联一个RC吸收电路比如10Ω加100nF吸收高频振铃。这个不是必须的但如果你的波形上有明显的高频振荡可以试试。5.3 温度漂移的补偿方法CC6920的灵敏度温漂典型值是±0.1%/°C零点温漂是±0.5mV/°C。在宽温场景下这些漂移会累积。补偿方法有两种一种是硬件补偿用热敏电阻网络调整参考电压另一种是软件补偿用温度传感器读温度查表修正。我一般用软件补偿因为灵活。在板子上放一个NTC或者数字温度传感器比如DS18B20测到温度后根据数据手册里的温漂曲线做线性修正。修正公式float compensate(float raw_current, float temperature) { float sensitivity_error 1.0f 0.001f * (temperature - 25.0f); float zero_error 0.0005f * (temperature - 25.0f); return (raw_current - zero_error) / sensitivity_error; }这个公式是简化版实际使用时要根据实测数据调整系数。5.4 常见问题速查表问题原因解决方法ADC读数一直是0DMA没启动或通道配置错检查HAL_ADC_Start_DMA返回值读数一直是4095输入超过参考电压检查分压或供电电压波形上下不对称零点偏置没减对重新校准零点串口打印乱码波特率不匹配检查串口配置和晶振频率采样率上不去ADC时钟太低或采样时间太长提高ADC时钟缩短采样时间波形有周期性尖峰定时器触发和PWM不同步调整触发点位置5.5 一个完整的调试流程最后分享我常用的调试流程按这个顺序走基本能解决90%的问题先不接电流只给传感器供电用万用表测输出确认零点电压在VCC/2附近。接上STM32用轮询方式读ADC确认读数在2048附近12位ADC3.3V参考。加上已知电流比如1A看读数变化是否符合灵敏度。启动DMA和定时器触发用串口打印波形数据。在WaveVersion里看波形检查有没有毛刺、削顶、失真。如果有问题按前面的排查表逐项检查。这个流程看起来简单但每一步都能帮你定位问题。我见过很多人一上来就搞DMA和定时器结果出了问题不知道是硬件还是软件白白浪费时间。提示调试的时候先用低速采样比如1kHz确认基本功能正常后再提高采样率。高速采样对布线和电源的要求更高容易引入新问题。6. 从模块到系统CC6920在典型项目中的落地案例6.1 基于STM32的电机电流环在一个BLDC电机控制项目里我用CC6920测三相电流STM32G474做FOC控制。三相电流分别接三个CC6920输出接STM32的三个ADC通道用TIM1触发三路ADC同时采样。采样率20kHz和PWM同步。这里的关键是三个传感器的零点要一致。如果三个零点不一样FOC的电流环会引入直流偏置导致电机发热和效率下降。我的做法是上电时先做一次零点校准三个通道各采100个点算平均值存到Flash里后面每次上电直接读。波形分析方面我用WaveVersion看三相电流的正弦度。正常情况下三相电流应该是相位差120度的正弦波如果波形有畸变说明FOC的电流环参数需要调整或者传感器带宽不够。6.2 基于STM32的智能台灯电流检测智能台灯项目里CC6920用来测LED驱动电流。这个场景电流不大一般几百毫安但要求精度高因为要调光。CC6920在低电流下的非线性度是±0.5%对于调光来说够用了。这个项目里我用了STM32的ADC内部参考因为电流小对参考精度要求不高。采样率设了1kHz用定时器触发DMA搬运。波形分析主要看电流的纹波如果纹波太大LED会有频闪。我在CC6920输出加了RC滤波截止频率1kHz纹波从50mA降到了5mA以内。6.3 基于STM32的空气质量检测项目中的电流监测空气质量检测项目里CC6920用来监测风扇电机的电流判断风扇是否堵转。这个场景对精度要求不高但对响应速度有要求堵转发生时要在100ms内检测到并报警。我用STM32的ADC看门狗功能设置一个电流阈值超过阈值就触发中断。CC6920的响应时间小于2μsSTM32的ADC采样加中断响应大概10μs整体响应时间在20μs以内远小于100ms的要求。这个项目里我踩过一个坑风扇启动的时候电流冲击很大会误触发堵转报警。后来在软件里加了延时启动后500ms内不检测堵转问题就解决了。6.4 逆变器方案中的母线电流检测在STM32芯片逆变器方案里CC6920测母线电流用于过流保护和功率计算。母线电流是直流加交流纹波纹波频率是开关频率的两倍。CC6920的200kHz带宽足够覆盖。这个场景要注意的是隔离。逆变器的母线电压可能到400V虽然CC6920的隔离耐压是2.5kVrms但PCB上原边和副边的爬电距离要够。我一般会在PCB上开槽槽宽至少2mm槽内不铺铜。另外原边走线要加绝缘套管防止高压击穿。波形分析方面母线电流的纹波大小反映了母线电容的健康状态。如果纹波突然变大说明电容老化或者容量不足。我用STM32的ADC采母线电流做FFT分析纹波频率和幅值通过串口上报。这个功能在实际运维中很有用能提前发现电容故障。7. 写在最后的一些个人体会CC6920这颗芯片我用了一年多从最初的选型对比到后来的批量部署踩过的坑不少但整体来说是一颗性价比很高的差分霍尔电流传感器。它的优势在于隔离、带宽和易用性缺点是对供电和布局比较敏感需要花点心思在硬件设计上。如果你刚开始用我的建议是先搭一个最小系统用轮询方式读ADC确认基本功能正常。然后再逐步加上DMA、定时器触发、波形分析。不要一上来就搞复杂的配置出了问题很难定位。另外数据手册一定要仔细看尤其是灵敏度、零点、温漂这些参数。很多问题其实手册里都写了只是容易被忽略。比如CC6920的灵敏度是随供电电压变化的5V供电和3.3V供电的灵敏度不一样换算的时候要用对值。最后波形分析工具只是辅助关键还是对电路原理的理解。知道波形为什么长这样比会用工具更重要。我见过有人用WaveVersion看波形但不知道波形畸变的原因最后还是得从头查电路。所以多花点时间在原理上比什么都值。
返回列表