一. SAR ADC原理分析
所有ADC的工作方式都是:将 equation?tex=V_%7BIN%7D.jpg equation?tex=V_%7BREF%7D.jpg 比较,得到两者比例关系。
STM32中的SAR ADC的设计思想是这样的:

  • 用二分法的办法,先比较 equation?tex=V_%7BIN%7D.jpg equation?tex=%5Cfrac%7BV_%7BREF%7D%7D%7B2%7D.jpg 的大小
  • 如果 equation?tex=V_%7BIN%7D%3E%5Cfrac%7BV_%7BREF%7D%7D%7B2%7D.jpg \frac{V_{REF}}{2}" style="max-width: 100%; vertical-align: middle; margin-right: 3px; margin-left: 3px; display: inline-block;"> ,则将 equation?tex=V_%7BIN%7D.jpg equation?tex=%5Cfrac%7B3%7D%7B4%7DV_%7BREF%7D.jpg 比较,如果 equation?tex=V_%7BIN%7D%3C%5Cfrac%7BV_%7BREF%7D%7D%7B2%7D.jpg ,则将 equation?tex=V_%7BIN%7D.jpg equation?tex=%5Cfrac%7B1%7D%7B4%7DV_%7BREF%7D.jpg 比较
  • 重复上述过程,不断二分
那么,该ADC最小单位应为: equation?tex=%5Cfrac%7B1%7D%7B2%5E%7Bn%7D%7DV_%7BREF%7D.jpg ,其中n为ADC分辨率。‘、
下面是STM32内部SAR ADC的结构,该ADC分别率为10bit:
它包括一个电容阵列,几个开关,一个比较器,一个CLR。电容阵列的作用就是支持二分法,可以通过选取特定电容导通,从而得到想要的电压值,再将该电压与 equation?tex=V_%7BIN%7D.jpg 比较。
为了方便作如下规定:所有电容上面为+极,下面为-极。
v2-ad043b627e719cb6532066cdd59a834c_720w.jpg
接下来逐步讲解这一个结构是如何运作的。

  • 基本态,在这个状态,各个电容中电量为0,ADC工作前的状态
v2-3e4d590e1c1d28f8e958bd65d4d301a7_720w.jpg
2. 采样态,ADC接收到指令,开关 equation?tex=S_%7Bb%7D.jpg 闭合,开始采样。
v2-e872efb973855655292d364ec5295377_720w.jpg
采样其实就是通过 equation?tex=V_%7BIN%7D.jpg 给各个电容充电。一段时间后,假设电容 equation?tex=C_%7B1%7D%5Csim+C_%7B11%7D.jpg 电压均已达到 equation?tex=V_%7BIN%7D.jpg
等效电路图如下:
v2-97b34b00c2d4232b5b1d6b41fb9944b2_720w.jpg
3. 保持态: equation?tex=S_%7Bb%7D.jpg 断开,所有电容+极接地。
v2-ba4ff654b0f72650b7cdd01bc0b20a9a_720w.jpg
等效电路如下:
v2-8adee8c2b0e6dfbddd837bfd4e031f3b_720w.jpg
此时 equation?tex=V_%7BCOMP%7D.jpg 电压为 equation?tex=-V_%7BIN%7D.jpg ,原因:电容没有放电通路,两端电压保持不变。

4. Step1:比较 equation?tex=V_%7BIN%7D.jpg equation?tex=%5Cfrac%7B1%7D%7B2%7DV_%7BREF%7D.jpg ,方法是将 equation?tex=C_%7B1%7D.jpg 的+极接 equation?tex=V_%7BREF%7D.jpg ,其余电容+极接地。
v2-dbadd9e38ea4e934dd405d05504935fe_720w.jpg
等效电路为:
v2-65aa4fc83190b445ed5fc70cd95772c6_720w.jpg
此时 equation?tex=V_%7BCOMP%7D%3D-V_%7BIN%7D%2B%5Cfrac%7B1%7D%7B2%7DV_%7BREF%7D.jpg
为什么呢?可以按如下思路思考:在这个电路中,是没有相对外界的导电通路的,所以电容总电荷量不变。电荷在电容中的转移导致了 equation?tex=V_%7BCOMP%7D.jpg 的变化。
方便起见,将+极接 equation?tex=V_%7BREF%7D.jpg 的电容称作 equation?tex=C_%7BA%7D.jpg ,将+极接地的电容称作 equation?tex=C_%7BB%7D.jpg
v2-db5b4f261e828a96a15351803e30a970_720w.jpg
由基尔霍夫电压定律:
equation?tex=V_%7BREF%7D-U_%7BCA%7D%3D-U_%7BCB%7D+~~~~~~+%5B1%5D.jpg
由电容电荷守恒,任何时刻所有电容电荷总量等于采样时电容电荷总量
equation?tex=C_%7BA%7DU_%7BCA%7D%2BC_%7BB%7DU_%7BCB%7D%3D2CV_%7BIN%7D+~~~~~~+%5B2%5D.jpg
联立[1][2],带入 equation?tex=C_%7BA%7D%3DC%EF%BC%8CC_%7BB%7D%3DC.jpg ,解得 equation?tex=U_%7BCB%7D%3DV_%7BIN%7D-%5Cfrac%7B1%7D%7B2%7DV_%7BREF%7D%3D-V_%7BCOMP%7D.jpg
随后便是比较 equation?tex=V_%7BCOMP%7D.jpg 和0的大小。如果 equation?tex=V_%7BCOMP%7D%3E0.jpg 0" style="max-width: 100%; vertical-align: middle; margin-right: 3px; margin-left: 3px; display: inline-block;"> ,则 equation?tex=V_%7BIN%7D%3C%5Cfrac%7B1%7D%7B2%7DV_%7BREF%7D.jpg ,如果 equation?tex=V_%7BCOMP%7D%3C0.jpg ,则 equation?tex=V_%7BIN%7D%3E%5Cfrac%7B1%7D%7B2%7DV_%7BREF%7D.jpg \frac{1}{2}V_{REF}" style="max-width: 100%; vertical-align: middle; margin-right: 3px; margin-left: 3px; display: inline-block;"> 。

5. Step2:如果 equation?tex=V_%7BIN%7D%3E%5Cfrac%7B1%7D%7B2%7DV_%7BREF%7D.jpg \frac{1}{2}V_{REF}" style="max-width: 100%; vertical-align: middle; margin-right: 3px; margin-left: 3px; display: inline-block;"> ,则比较 equation?tex=V_%7BIN%7D+.jpg equation?tex=%5Cfrac%7B3%7D%7B4%7DV_%7BREF%7D.jpg
v2-533ddb5c66a211ca599c607b5009a273_720w.jpg v2-be789dee86d60cf6ae596a7eb0d3a903_720w.jpg 总结:
可以通过改变电容阵列连接状态得到想要的 equation?tex=V_%7BCOMP%7D.jpg
任何时候都有下列两条公式成立:
equation?tex=V_%7BREF%7D-U_%7BCA%7D%3D-U_%7BCB%7D+~~~~~~+%5B1%5D.jpg
equation?tex=C_%7BA%7DU_%7BCA%7D%2BC_%7BB%7DU_%7BCB%7D%3D2CV_%7BIN%7D+~~~~~~+%5B2%5D.jpg
联立得:
equation?tex=V_%7BCOMP%7D%3D-V_%7BIN%7D%2B%5Cfrac%7BC_%7BA%7D%7D%7B2C%7DV_%7BREF%7D.jpg

二. SAR ADC噪声分析,以STM32为例
由于外部环境和ADC自身误差导致的噪声就不说了,提高电源稳定性,提高 equation?tex=V_%7BREF%7D.jpg 稳定性,电磁兼容性设计,时钟信号与ADC引脚距离弄远点。
说几个特殊的。

  • ADC采样时间
通过上述分析可知,ADC的工作流程是:先采样,再保持,再模数转换。
采样实际上就是给ADC内部电容充电,这个电容大小大概是16pF,等效电路图如下。
v2-4233d3d8a46be93f3661ff2a4ac57cc4_720w.jpg
如果外部电阻阻值过大,充电电流就会变小,内部电容电压变化就会慢。
慢就容易出问题,你采样时间必须得设置长一些,假如说我们想采集到 equation?tex=V_%7BIN%7D.jpg 的99%,内部电容就按16pf算,外部输出阻抗按5KΩ计算,采样时间至少为368ns。如果ADC时钟频率12MHz,采样周期至少设置为5个周期以上。
所以在STM32CubeIDE中别默认ADC 的sample time为1.5 cycle了,会出大问题的!你电压都采的不对,结果怎么可能精确?

2. ADC引脚电容不宜过大
滤波用软件滤波,别在ADC引脚加太大电容,道理很简单,大电容会导致充电时间拉长,很可能采集不到准确的电压数值。

3. 减小上一级输出阻抗
同样的道理,尽可能减小采样时间。

4. 为什么我的Vin有尖刺噪声?Spiky noise
v2-328ed9445bdefe4712e200a6ec7f7e9a_720w.jpg
正常现象,ADC每次转换前,ADC开关打开后,会向外部放电,导致Vin电压激增。不用担心,ADC最终采集的是Spiky noise结尾处电压。
但问题是,如果你的sample time不够长,就可能采集到Spiky Noise,如下图所示
v2-1b2a66b1ab17fc0768ea2d42e611e123_720w.jpg
拉长Sample Time就行了
v2-5488ebc5db3b5f25c61934d3c8ff3603_720w.jpg
给一个计算公式作为参考
v2-46a80238aa90b750b4621dbc737880ff_720w.jpg