ARTICLE DETAIL

资讯详情

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

STM32G4 VREFBUF在电机控制中的ADC采样原理与实战

STM32G4 VREFBUF在电机控制中的ADC采样原理与实战 做FOC电机驱动的时候我最怕看到的不是过流报警而是电流波形上那一层细密的毛刺。之前调一套低压无感FOC驱动板三相电流采样用STM32G431的ADC参考电压直接接VDDA。开环启动时电流波形还算干净一进闭环就完蛋PI参数怎么调都有高频抖动反馈回来的电流数值一跳一跳的。用示波器点开VREF引脚才发现采样参考信号全是逆变桥开关带来的噪声。后来把ADC参考切到片上VREFBUF输出毛刺肉眼可见地消停了。从那次之后我再没把VREFBUF当成“一个可有可无的外设”它其实是电机控制信号链里一个很值得认真对待的环节。这篇就借“VREFBUF and motor control”这个题目把我实际用VREFBUF做电机控制项目的经验拆开讲讲这个外设到底怎么回事、在电机控制里应该怎么接、代码怎么初始化、以及我踩过的几个坑。适合正在调FOC电流环、对STM32G4系列外设还不够熟的嵌入式工程师也适合正在纠结“要不要用VREFBUF”的硬件选手参考。1. 先搞明白VREFBUF在电机控制里到底扮演什么角色1.1 VREFBUF的“身份”片上参考电压缓冲器VREFBUF全称是Voltage Reference Buffer翻译过来就是“电压参考缓冲器”。它不是LDO也不是DCDC它更像是一个精密基准源加上一级低输出阻抗的缓冲器。在STM32G4、L4、H7这些系列里它通常能输出1.5V、2.048V、2.5V这几个固定档位内部自带校准输出直接引到VREF引脚给ADC做参考电压也可以引出去给外部传感器或放大电路当基准。很多人第一次看到VREFBUF会有一个疑惑VDDA都已经是3.3V了ADC直接用VDDA做参考不就行了为什么还要专门搞一个缓冲器输出去做VREF这里面有个关键区别VDDA是给整个模拟域供电的电源轨它受芯片内部数字逻辑翻转、IO翻转、外部电源纹波的影响很大。电机控制场景最明显——MOSFET开关瞬间会有大电流跳变地弹和电源噪声会毫不客气地耦合到VDDA上。而ADC的转换精度是相对于参考电压而言的参考电压一旦抖动采样结果就是一堆噪声。VREFBUF内部是一个经过设计的精密基准源输出噪声比VDDA小得多所以把VREF从VDDA切换到VREFBUF相当于把“测量尺子”换了一把更稳的。1.2 电机控制里它夹在哪个环节在典型的FOC控制链路里MCU要采样三相电流、母线电压、母线电流有时候还要采编码器或者霍尔信号。电流环PI算得再快输入采样的信噪比如果不够控制效果也不会好。VREFBUF在“电机控制信号链”里主要管两件事第一给ADC做参考电压让电流采样和电压采样更干净。这是最核心、最常见的用法。三电阻采样时ADC得到的是一个相对于参考电压的比例值如果参考电压稳定换算出来的电流值就稳定如果参考电压有毛刺电流值也跟着毛刺走。第二给外部模拟器件提供一个低噪声基准。比如霍尔电流传感器、运放电路、编码器芯片它们可能不需要一个完整的电源轨而只需要一个精确的参考电压。VREFBUF输出就是干这个的前提是负载电流不要超。1.3 不是所有电机项目都需要VREFBUF说句实在话VREFBUF不是电机控制的必需品。很多项目用VDDA直供跑得也挺好。问题在于你的“挺好”是建立在什么基础上的。如果你的电机控制板用的是低成本方案电源本身比较干净开关频率不高控制性能要求也没到“极致”的程度那VDDA直供完全够用。但如果你的项目是高带宽电流环、低电感高速电机、伺服级应用或者你的PCB布局紧凑、电源没那么干净那就很有必要认真考虑一下VREFBUF。我当时判断要不要用VREFBUF就一句话去用示波器看VREF上的噪声如果开关瞬间毛刺幅度超过半个LSB对应的电压就值得换。ADC是12位3.3V参考下1个LSB大概是0.8mV电机驱动器里想让VREF引脚纹波小于0.8mVVDDA直供基本很难做到VREFBUF则会省心很多。2. 决定能不能用好的关键点带载能力、启动时间与校准2.1 输出档位和精度指标怎么读VREFBUF的输出档位要在硬件设计阶段就定好。不同型号的MCU档位稍有差别常见是1.5V、2.048V、2.5V三档。电机控制场景我建议优先考虑2.5V原因后面详细说。精度指标是容易忽略的地方。VREFBUF本质上是个片上基准手册里会给TUE总未调整误差和温度漂移。我手上的G431手册VREFBUF的初始精度大约在千分之几的量级经过内部校准之后还会更好一点。这里要提醒一句这是“基准的绝对精度”跟ADC采样的“短期稳定性”是两回事。在电流环里短期稳定性比绝对精度更关键。PI控制器对恒定增益误差其实没那么敏感它最怕的是采样值跳变。所以VREFBUF的价值主要是低噪声和低漂移而不是“我比其他片子准了0.1%”。2.2 4mA带载能力到底意味着什么这是VREFBUF最容易被误解的地方。它内部是一级运放缓冲器输出能力不是无限大的典型输出电流也就几毫安级别必须当成一个“微功率基准”来用而不是稳压电源。我见过有人把VREFBUF拿去给霍尔传感器供电结果电压直接往下掉采样数据跟着飘。原因很简单霍尔传感器工作电流动辄十几毫安VREFBUF输出能力根本喂不动。判断一个负载能不能接在VREFBUF上先看输入电流或输入阻抗。像ADC的VREF引脚输入阻抗通常在几十千欧以上静态输入电流极小这种负载完全没问题。像运放的同相输入端也是高阻没问题。但如果是给整个传感器模块供电、给LED指示灯供电、给逻辑芯片供电那想都别想老老实实外接基准芯片或LDO。2.3 启动时序和稳定时间容易被忽略VREFBUF不是一使能输出就立刻稳的。它内部有一个启动过程从ENVR置位到VRR电压就绪标志置位需要一段时间手册里会给具体数值微秒到几十微秒量级。这段启动时间在电机控制里非常关键。MCU从复位释放到主循环跑起来可能只有几十到几百微秒。如果你在这段时间里直接去采样电流VREFBUF还没站稳采出来的值全是错的。更隐蔽的问题是ADC校准如果校准在校准期间参考电压还没稳定校准结果就是错的等你真正使用的时候再发现数据不对排查周期会拉得很长。2.4 片内校准位和EN引脚的正确用法VREFBUF内部有校准电路但要注意不同型号使能方式和校准位不完全一样。使用的时候一定要去参考手册的VREFBUF章节把校准加载或者VREFSCAL之类的位设置好。EN引脚的用法更值得讲。有些型号VREFBUF使能可以从寄存器控制也可以通过外部EN引脚控制。在电机控制里如果想让VREFBUF只在电机运行时开启其他时间关闭以省电可以用PWM或GPIO控制EN引脚。但务必注意VREFBUF重新使能后需要等待稳定所以控制逻辑里必须加延时或轮询VRR标志别从EN拉高到ADC采样之间不隔时间。我在初始化代码里实际用的流程是这样的// 1. 使能VREFBUF外设时钟 RCC-APB2ENR | RCC_APB2ENR_VREFBUFEN; // 2. 退出高阻模式配置输出档位 VREFBUF-CSR ~VREFBUF_CSR_HIZ; VREFBUF-CSR | VREFBUF_CSR_ENVR; // VRS位域选择输出档位具体值以参考手册为准2.5V对应配置 // 3. 等待VREFBUF输出就绪 while (!(VREFBUF-CSR VREFBUF_CSR_VRR)) { // 可加超时保护 } // 4. 加载内部校准配置 // 某些系列需要单独配置校准位这里按手册要求补充 // 5. 然后再做ADC校准、ADC使能顺序不能乱先VREFBUF稳定再ADC校准最后才开采样这套流程是硬性的。3. 电机控制板上的典型接法从原理图到初始化代码3.1 接法一VREFBUF输出直接作为ADC参考源这是最标准的用法。把VREFBUF_OUT引脚和MCU的VREF引脚在PCB上连起来软件配置好VREFBUF输出档位ADC参考就从VDDA切到VREFBUF输出。原理图设计时要注意两点第一VREF引脚和VREFBUF_OUT引脚之间要放去耦电容通常一个100nF加一个4.7uF电容要尽量靠近引脚放置。别小看这两颗电容VREFBUF内部运放的稳定性和输出噪声很大程度上取决于输出电容的位置和ESR。电容离引脚太远环路阻抗变大轻微负载变化都可能振荡。第二VREFBUF_OUT一般不需要串联电阻直接连过去就行。如果一定要加串个10欧以内的小电阻可以抑制高频振荡但不要串大电阻否则会影响ADC参考输入端的瞬态响应。G4系列里面VREFBUF_OUT、VREF、VDDA这几个引脚的连接关系要查具体型号的引脚图。有些型号内部已经把VREFBUF_OUT跟VREF连好了外部只需要给VREF加电容有些型号需要外部短接。画原理图之前一定要看数据手册里的“ADC reference voltage”部分别想当然。3.2 接法二给编码器、霍尔或运放做供电轨如果VREFBUF直接给外部芯片供电就要严格计算负载电流。以我调过的电感式编码器接口为例芯片手册上标注参考输入电流只有几个微安用VREFBUF 2.5V供电完全没问题。但同样一块板子上霍尔电流传感器的供电就不能从VREFBUF拉因为霍尔芯片本身要消耗几毫安以上电流VREFBUF扛不住。还有一个折中方案VREFBUF输出给运放的基准输入端比如一个差分放大电路需要1.25V的偏置基准可以把2.5V输出经过两个精密电阻分压得到1.25V送进运放同相端。这种情况下运放输入电流很小VREFBUF只承担电阻分压网络的泄漏完全在能力范围内。从原理图角度这类负载一定要在VREFBUF输出节点上加足够的去耦电容并且从VREFBUF到负载的走线要短、要粗别绕一大圈从板子这头走到那头。VREFBUF输出电压一旦被噪声干扰整个信号链的性能都会跟着崩。3.3 CubeMX配置和寄存器初始化实例用STM32CubeMX配置VREFBUF很简单在Analog分类下找到VREFBUFEnable它选择输出档位然后生成代码。但CubeMX生成的代码里初始化顺序不一定完全适合电机控制特别是ADC校准和VREFBUF使能的相对顺序可能需要手动调整。我自己更习惯直接用寄存器代码短逻辑清楚排查问题也快。核心初始化的完整序列大概是void vrefbuf_2v5_init(void) { // 使能时钟 RCC-APB2ENR | RCC_APB2ENR_VREFBUFEN; // 配置VREFBUF控制寄存器 VREFBUF-CSR 0; VREFBUF-CSR | VREFBUF_CSR_ENVR; // 使能缓冲器 VREFBUF-CSR | VREFBUF_CSR_VRS; // 选择2.5V档位具体位值以手册为准 // 如果有HIZ位确保清除否则输出是高阻 // 等待就绪 uint32_t timeout 0xFFFF; while (!(VREFBUF-CSR VREFBUF_CSR_VRR)) { if (--timeout 0) break; } // 校准配置按手册执行 // VREFBUF-CSR | VREFBUF_CSR_VREFSCAL; 之类的 } void adc_calibrate_after_vrefbuf(void) { // 确保VREFBUF已经稳定之后再做ADC校准 ADC1-CR ~ADC_CR_ADEN; ADC1-CR | ADC_CR_ADCAL; while (ADC1-CR ADC_CR_ADCAL) { // 等待校准完成 } }如果你的平台用HAL库核心流程等价的先调HAL_VREFBUF_Init再调HAL_ADCEx_Calibration_Start之后才HAL_ADC_Start。顺序反了就是给自己挖坑。3.4 一个关键顺序VREFBUF必须先于ADC校准这条值得单独拎出来说。ADC校准时芯片内部会基于当前参考电压测量零点和增益误差把校准值存储在寄存器里用于补偿后续转换。如果你在VREFBUF还没使能、VREF还是悬空或者还是VDDA的时候做校准然后运行中又把参考切到VREFBUF校准结果就不匹配了。我在一个项目里犯过这个错。代码框架是CubeMX生成的VREFBUF初始化的位置在ADC初始化之后理论上VREFBUF先使能ADC后校准但那次我为了省时间手动改了一段初始化把时钟使能提前了导致第一次上电ADC数据有固定偏置怎么采样都不对。查到最后才发现是ADC校准用的参考和实际采样用的参考不一样。所以无论用哪种方式初始化请记住这个顺序VREFBUF使能 → 等待VRR → 配置ADC参考源 → ADC校准 → ADC采样。任何一步被挪到后面都可能造成你花三个小时找不到的“数据乱跳”。4. 实测记录VREFBUF帮了忙也埋过三个坑4.1 坑一参考电压从3.3V降到2.5V满量程变小VREFBUF输出2.5V作为ADC参考而采样前端电路是照着3.3V满量程设计的这会儿坑就来了。我调的一套板子电流采样用的是INA240之类的高边电流放大器输出范围接近0到3.3V。VDDA直供时ADC满量程是0到3.3V刚好匹配放大器输出范围。切到VREFBUF 2.5V之后ADC满量程变成0到2.5V放大器输出超过2.5V的部分直接削顶电流波形在峰值处被“切平”过流保护阈值也全部错位。这个问题的本质是“参考电压变了但前端增益和偏置没跟着改”。解决办法有两种一是把参考档位选成2.5V重新设计前端电路让电流信号的最大输出电压低于2.5V留出裕量二是干脆选高一点的参考档位或者继续用VDDA直供别硬上VREFBUF。我后来是重新调整了采样电阻和运放增益让最大电流对应的输出电压压在2.2V左右这样2.5V参考下既不会削顶还有约10%的过流检测余量。改完之后过流保护阈值重新标定才算是真正用上了VREFBUF。4.2 坑二外接负载后输出电压跌落有一次图省事想用VREFBUF 2.5V给一颗数字角度传感器的内部参考网络供电传感器规格书只说了“参考电压输入”没说输入电流实际一测里面有个分压网络一直抽电流VREFBUF电压被拉到了2.3V以下。这种坑特别隐蔽因为静态测试时万用表量2.5V是正常的一旦传感器开始工作内部动态电流增大VREFBUF就撑不住了。我用示波器看VREFBUF输出波形电压整体往下掉还叠加了传感器数字通信的耦合噪声整个位置数据都在飘。解决方法是把VREFBUF的负载严格限制在高阻输入端需要供电的模块全部换成一路低噪声LDO或者外部精密基准芯片。从那以后我立了一个规矩VREFBUF只接参考输入不接供电负载只有输入电流明确小于几百微安的节点才敢直接挂上去。4.3 坑三上电瞬间采样毛刺根因在启动时序还有一个坑是上电瞬间的采样毛刺。听起来像是ADC配置问题实际上根因在VREFBUF启动时序上。电机控制器上电瞬间母线电容充电、MCU复位释放、PWM开始输出整个系统是乱的。如果你的采样触发源在VREFBUF使能之前就已经开始工作VREF引脚还没有一个稳定的参考电压ADC跑出来的就是一串随机值。这串随机值如果被用在了启动阶段的堵转检测或过流保护里很危险。我从代码层面解决了这个问题在PWM启动之前加上一段“VREFBUF稳定等待”逻辑确保VRR标志置位再延迟几十微秒最后才启动PWM和采样触发。同时在ADC采样的DMA缓冲里加了一个软件滤波丢掉前几次采样值。这样一来上电瞬间的毛刺被彻底隔离了。4.4 优化后的实测收益做完以上几项调整效果非常直观。同一个电机、同一套PID参数VDDA直供时电流波形上的高频毛刺大约有正负几十个LSB切到VREFBUF之后同样的毛刺降到了几个LSB级别。电流环带宽可以稍微往上提而不至于把采样噪声放大成嘶嘶声。从频谱上看用VREFBUF做参考后电流采样数据里与MOSFET开关频率相关的尖峰明显减小。对一台电机来说这意味着同样的PI参数下运行噪音更小电流波形更干净。5. 判断VREFBUF健康度的三个手段万用表、波形与ADC码值5.1 万用表和示波器检查装机后第一步用万用表量VREFBUF_OUT的对地电压确认输出档位是否与配置一致。如果是2.5V档误差应该在手册指标范围内。如果低很多检查HIZ位是不是没清掉或者后端负载过重。第二步用示波器看纹波。示波器探头要用短地线尽量直接点在VREF引脚旁边的电容两端。电机运行起来之后重点看两个时刻MOSFET开通关断瞬间的噪声尖峰以及PWM周期内的电压跌落。纹波如果超过几十毫伏就得查PCB布局和去耦电容了。5.2 ADC码值自检接一个固定的已知电压到ADC通道从软件里读码值就能判断参考电压是否正常。方法很简单拿一个精密电阻分压器从VREFBUF输出分出一个稳定的已知电压比如50%分压送到一个空闲ADC通道。理想情况下12位ADC的采样码值应该在2048附近。如果码值明显偏离说明VREFBUF输出电压或分压电阻有问题。这个自检最大的好处是能在电机运行过程中实时做不需要停机。我一般在固件里放一个自检函数每隔一段时间读一下参考通道码值如果偏离超过阈值就置一个告警标志。调试伺服系统时这招帮我抓过两次电源异常。5.3 寄存器状态位和温度变化的观察VREFBUF的VRR标志置位代表电压就绪这个状态位在运行时也可以读。如果在高温或负载变化下VRR被清掉说明VREFBUF进入了异常状态多半是输出过流或者内部保护动作需要第一时间检查负载。温度变化对VREFBUF的影响是长期性的。量产产品在高温试验时可以通过ADC码值自检观察参考电压的温漂。如果用的是VREFBUF温漂应该表现为缓慢的、单调的码值偏移而不是随机跳动。如果是随机跳动优先怀疑VREFBUF供电、地线或者去耦电容。6. 方案取舍VREFBUF和外部基准、VDDA直供怎么选6.1 外部基准芯片和内部VREFBUF的对比很多工程师会纠结选内部VREFBUF还是外挂一颗基准芯片。我做过的对比是这样的维度内部VREFBUF外部基准芯片成本几乎没有额外成本增加一颗芯片加外围电容PCB面积极小要占一点板面绝对精度中等取决于内置校准通常更高可选择高精度型号温漂中等可以选低漂移型号负载能力几毫安很有限取决于型号但普遍更强噪声低可以做到极低灵活性固定档位不可微调可选项多可微调对大部分电机控制应用来说内部VREFBUF是一个性价比极高的选择尤其是STM32G4这种本身就为电机控制设计的MCU片上外设的匹配度已经不错了。只有当ADC精度要求极高、环境温度范围很大、或者需要输出一个非标准电压时才值得外挂基准芯片。6.2 VDDA直供的适用范围VDDA直供最大的优势是“什么都不用配置接线也最简单”。很多demo板和低成本连板子都用这种方式跑起来也没问题。适用场景包括电源本身非常干净比如前级有低噪声LDO开关电源噪声没耦合进模拟域或者控制性能要求不高比如泵类、风扇类负载电流环带宽低对采样噪声不敏感还有单电阻采样这种本身采样窗口就很紧张、对绝对精度依赖没那么强的方案。但一旦进入高性能应用VDDA直供的弊端就会暴露一是VDDA上通常叠加了MCU内部数字电路动作的噪声这个跟外部电源质量无关二是当你用PWM驱动逆变桥时地弹会直接影响参考地采样结果会整体偏移。所以我现在的做法很明确开发阶段先用VDDA直供跑通逻辑性能调优阶段再切到VREFBUF做个A/B对比用数据决定最终方案。6.3 不同电机控制场景的推荐组合根据我经手的几种电机应用大致可以给出这样的选型建议三电阻FOC低压伺服级直接用VREFBUF 2.5V做ADC参考前端增益按2.5V满量程设计效果好。两电阻/单电阻低成本方案如果成本压力大VDDA直供可接受如果板子空间够留一个VREFBUF的焊盘量产时再决定是否贴上。高精度编码器、绝对值编码器接口VREFBUF 2.5V或外部基准芯片给编码器提供低噪声参考同时保持ADC采样稳定。电池供电、低功耗电机VREFBUF可以动态开关只在采样时使能但开关时要处理好稳定时间。6.4 关于VREFBUF和ADC采样窗口的一点延展最后说一个容易被忽略的点ADC采样窗口。电机控制里电流采样经常是PWM中心对齐触发采样窗口只有1到2微秒。VREFBUF输出经过缓冲器后等效输出阻抗较低VREF引脚上的电压能更快地跟随采样电容的电荷汲取。这意味着在极短的采样窗口里参考电压不会因为瞬间抽电流而崩掉。而VDDA直供虽然有电源平面撑着但MCU内部参考路径上可能经过较长的金属线瞬态响应并不一定比VREFBUF好。我曾经做一个高载波频率的方案PWM频率到40kHz采样窗口压得很紧VDDA直供时最后几个LSB明显不稳切到VREFBUF后这个问题就消失了。这不是玄学是缓冲器低输出阻抗带来的实际优势。7. 一点个人经验把VREFBUF当模拟器件对待我在几个项目里过了一遍VREFBUF之后最大的体会是它不是单片机里那种“开个寄存器就完事”的数字外设而是一个需要被当模拟器件对待的单元。所谓模拟器件就是有启动时间、有输出阻抗、有负载限制、有PCB布局要求。你在原理图上画VREFBUF_OUT的时候别再把它想成“一个引脚”而是想成“一个微功率低噪声基准电源的输出端”。它需要旁路电容需要短走线需要远离功率走线需要明确负载电流预算。这些功夫花在原理图阶段调试阶段能省一大半的时间。另外一个小技巧量产固件里给VREFBUF留一个自检函数把VREF分压通道的ADC码值周期性地记录下来既能在出厂测试时判断芯片焊得对不对又能在现场故障时快速判断是不是参考电压出了问题。我在售后返修里遇到过一次“输出电流不准”的板子插上调试器一看自检码值发现是板子受潮导致VREF电容漏电VREFBUF被拉低了几分钟就定位了问题。如果你正在调电机控制被电流采样的毛刺、电流环噪声、过流阈值不稳定折磨得头疼先别急着换运放、加滤波。花半天时间折腾一下VREFBUF很可能是投入产出比最高的一个改动。
返回列表