STM32G4系列ADC研探笔记

最近在试用STM32G4系列MCU设计一款FOC控制器。ADC当然是其中不可或缺的一部分,我们除了用它实现对单路或者三路电流的采集之外,还可以用它对母线电流、母线电压、电机温度(NTC)等数据的采集。

对于硬件设计,很多人可能简单的根据布线需要选择合适布线的ADC通道就到此为止了。但是很多时候硬件的选择需要的MCU的资源了解足够深才能方便软件工程师编程。比如FOC三相采集,如果能够同步快速采集多路(至少两路)电流是最好的。

对于软件设计,很多人对于硬件没有深刻的认识。一般是硬件提供什么样的资源,就采用什么样的软件策略。很多软件工程师陷入软件框架的泥沼提供了各种必要或者过度的设计,但是对于基础的硬件却并没有足够的研究。

本篇文章的目的在于通过以STM32G4系列的MCU为窗口,实现对ADC的深刻理解和最佳实践。本篇文章参考了ST官方提供的多篇手册。我将链接放在附件中。

STM32G4系列ADC基本信息交待

STM32G4根据硬件资源不同,大概分成三个系列:STM32G4x1最多3个独立12位ADC和4个12位DAC;STM32G4x3和STM32G4x4最多5个独立12位ADC和7个12位DAC. STM32G4系列的ADC采样率是4M,DAC是15M。但是具体到每个封装和每个型号可用的DAC和ADC数量都不同。而且这个系列的MCU内部存在一个电压参考基准缓冲器(internal voltage reference buffer)。

系列 ADC数量 DAC数量
STM32G431 2(4Mbps) 2(external) + 2(internal)
STM32G441 2(4Mbps) 2(external) + 2(internal)
STM32G491 3(5Mbps) 2(external) + 2(internal)
STM32G4A1 3(5Mbps) 2(external) + 2(internal)
STM32G473 5(4Mbps) 3(external) + 4(internal)
STM32G483 5(4Mbps) 3(external) + 4(internal)
STM32G474 5(4Mbps) 3(external) + 4(internal)
STM32G484 5(4Mbps) 3(external) + 4(internal)

需要注意,可能具体封装还有所区别。这里不一一列举。但是请注意不同系列价格差别还是挺大的。最便宜的也是最常见的似乎是STM32G431,在各种商城查询发现有三路ADC的STM32G491或者STM32G473价格大概是前者的两倍左右。所以如果能够在低端的STM32G431上实现你的需求,那么成本优势将是很明显的。

说句题外话,目前常用的ADC由两种技术:SAR(逐次逼近型)和sigma-delta(差分型)。我目前遇到的MCU使用的一般都是SAR型的。至于两者的原理,建议大家还是看书或者几大电子厂商官网的介绍。网上有很多人解释这两者。但有些人的讲解存在一些错误。

ADC的精度和速度

影响ADC的精度的因素非常的多,大致可以分为自身因素和环境因素。在附件AN2834中详细介绍了如何提高ADC精度的办法。但大概有几个注意点:

  1. 参考电压是一个比较大的印象因素。一般要尽可能的减小电源噪声:尽量使用LDO或专门的参考电压供电;一般需要两个电容分别过滤高频(1pf~100nf)和低频(1~10uf)噪声;使用高值电容稳定电源电压。
  2. VREF这边一般也要接两个电容。一个是10nf的MLCC(尽管很多电路时100nf,但是stm32建议的时10nf);另一个是1uf的MLCC或钽电容。
  3. 通过滤波器或过采样等方法对模拟输入信号噪声进行抑制。
  4. 通过波形注入改善分辨率。
  5. 将ADC动态范围与最大信号幅度进行匹配
  6. 在PCB设计时要之一布线,尤其至于I/O引脚串扰等问题。
  7. 各种其它方法都在参考文档里。这里不再一一列举。

除了这些还有一个有意思的是封装因素也会对ADC有一定的影响。比如LQFP的内部电感不其它封装大,就是因为这个封装较长的引脚。

ADC时钟配置

ADC的时钟频率对于采样速度很重要。而采样速度过长不仅会影响ADC的精度(内部采样保持电路也会有一定的电荷损失),还有可能影响其它任务的执行。对于STM32G4,最快的采样时钟时60MHz。STM32G4的采样事件时2.5个ADC Clock,转换事件时15个ADC Clock。(注意尽管写的时4Mbps,即60M/15。但是实际花费的事件时15+2.5个ADC Clock。怎么说呐,这属于参数的艺术?)

另外多ADC采样的时候,好像时钟最高只能时52MHz。具体原因在并行操作一章中会讲解。

多ADC并行操作

多ADC同步采样时会出现多个电容网络同步接通或断开到VREF的情况。这对电源的稳定本身就构成了影响,而且振荡的振幅也相应的增大了,这都影响了ADC的精度。因为这些影响想要将开关震荡要衰减到合理的水平就需要更多的时间。所以需要适当的降低ADC时钟以提高ADC采样的结果精度。

还要注意的一点时每一个ADC都有一个输入多路复用器。从当前通道切换到后续通道的多路复用器会产生一些噪声,这些噪声可能会影响当前正在进行的逐次逼近。最坏的情况是,各个ADC同步运行,并且它们的输入多路复用器在同一时钟周期切换到下一个通道。在这种情况下,噪声会累积,并且ADC结果的DNL误差最大。为了解决这个问题,最好的办法时是在ADC采样期间禁止多路复用器的切换。文中还建议使用格雷码序列来切换ADC通道。但这一条建议估计在实际应用中会有一定的限制。

同步采集模拟信号的集中策略

多于资源受限的MCU,比如只有一个独立的ADC,怎么同时获取两路或者多路ADC信号?

  1. 使用采样保持电路 理想的情况是对需要同步采样的信号“抓拍”之后再使用ADC依次处理。这种策略确实可以一个依次ADC依次采样这抓拍到的信号。这时候获取的数值可以认为他们相当于同步获取的。常见的采样保持电路有LF398等。但是不幸的是大部分采样保持电路芯片都挺昂贵的。所以我很少在FOC这种应用中见到过。(其实现在的ADC基本都有采样保持电路,但是一个独立ADC一般只有一个采样保持电路。如果有办法对一个独立ADC的多个通道实现同步采样将是很好的一种解决办法。)

  2. 切换同一引脚到两路不同的ADC

  3. 利用外部多路ADC

  4. 利用芯片内部运放实现

附件

  1. AN5346应用笔记:STM32G4 ADC use tips and recommendations(STM32G4系列ADC使用技巧和建议)
  2. AN2834应用笔记: 如何在STM32微控制器中获得最佳ADC精度
  3. AN5537应用笔记:How to use ADC Oversampling techniques to improve signal-to-noise ratio on STM32 MCUs(如何在STM32微控制器上使用ADC过采样计数改进信噪比)