一. SAR ADC原理分析
所有ADC的工作方式都是:将
与
比较,得到两者比例关系。
STM32中的SAR ADC的设计思想是这样的:
- 用二分法的办法,先比较
- 如果
- 重复上述过程,不断二分
那么,该ADC最小单位应为:
,其中n为ADC分辨率。‘、
下面是STM32内部SAR ADC的结构,该ADC分别率为10bit:
它包括一个电容阵列,几个开关,一个比较器,一个CLR。电容阵列的作用就是支持二分法,可以通过选取特定电容导通,从而得到想要的电压值,再将该电压与
比较。
为了方便作如下规定:所有电容上面为+极,下面为-极。
接下来逐步讲解这一个结构是如何运作的。
- 基本态,在这个状态,各个电容中电量为0,ADC工作前的状态
2. 采样态,ADC接收到指令,开关
闭合,开始采样。
采样其实就是通过
给各个电容充电。一段时间后,假设电容
电压均已达到
。
等效电路图如下:
3. 保持态:
断开,所有电容+极接地。
等效电路如下:
此时
电压为
,原因:电容没有放电通路,两端电压保持不变。
4. Step1:比较
与
,方法是将
的+极接
,其余电容+极接地。
等效电路为:
此时
为什么呢?可以按如下思路思考:在这个电路中,是没有相对外界的导电通路的,所以电容总电荷量不变。电荷在电容中的转移导致了
的变化。
方便起见,将+极接
的电容称作
,将+极接地的电容称作
。
由基尔霍夫电压定律:
由电容电荷守恒,任何时刻所有电容电荷总量等于采样时电容电荷总量
联立[1][2],带入
,解得
随后便是比较
和0的大小。如果
0" style="max-width: 100%; vertical-align: middle; margin-right: 3px; margin-left: 3px; display: inline-block;"> ,则
,如果
,则
\frac{1}{2}V_{REF}" style="max-width: 100%; vertical-align: middle; margin-right: 3px; margin-left: 3px; display: inline-block;"> 。
5. Step2:如果
\frac{1}{2}V_{REF}" style="max-width: 100%; vertical-align: middle; margin-right: 3px; margin-left: 3px; display: inline-block;"> ,则比较
与
可以通过改变电容阵列连接状态得到想要的
任何时候都有下列两条公式成立:
联立得:
二. SAR ADC噪声分析,以STM32为例
由于外部环境和ADC自身误差导致的噪声就不说了,提高电源稳定性,提高
稳定性,电磁兼容性设计,时钟信号与ADC引脚距离弄远点。
说几个特殊的。
- ADC采样时间
通过上述分析可知,ADC的工作流程是:先采样,再保持,再模数转换。
采样实际上就是给ADC内部电容充电,这个电容大小大概是16pF,等效电路图如下。
如果外部电阻阻值过大,充电电流就会变小,内部电容电压变化就会慢。
慢就容易出问题,你采样时间必须得设置长一些,假如说我们想采集到
的99%,内部电容就按16pf算,外部输出阻抗按5KΩ计算,采样时间至少为368ns。如果ADC时钟频率12MHz,采样周期至少设置为5个周期以上。
所以在STM32CubeIDE中别默认ADC 的sample time为1.5 cycle了,会出大问题的!你电压都采的不对,结果怎么可能精确?
2. ADC引脚电容不宜过大
滤波用软件滤波,别在ADC引脚加太大电容,道理很简单,大电容会导致充电时间拉长,很可能采集不到准确的电压数值。
3. 减小上一级输出阻抗
同样的道理,尽可能减小采样时间。
4. 为什么我的Vin有尖刺噪声?Spiky noise
正常现象,ADC每次转换前,ADC开关打开后,会向外部放电,导致Vin电压激增。不用担心,ADC最终采集的是Spiky noise结尾处电压。
但问题是,如果你的sample time不够长,就可能采集到Spiky Noise,如下图所示
拉长Sample Time就行了
给一个计算公式作为参考