在STM32中,集成了12位逐次逼近型ADC。
12位:指ADC的采样深度,使用12位2进制数来表示一个采样点。例如4位ADC,就是把0-3.3V分成了2^4 -1份,每份为0.22V。参考下表
| 二进制数 | 对应电压 |
|---|---|
| 0000 | 0V |
| 0001 | 0.22V |
| 0011 | 0.44V |
| … | … |
| 1111 | 3.30V |
逐次逼近型(SAR):每次比较输入电压与内部基准电压,逐步逼近输入电压。
默认的ADC时钟为4Mhz(最大为14Mhz)。
假设输入到ADC的时钟周期为14Mhz,时钟周期为$\frac{1}{14}MHz$ us
采样时间$0.1 us = 1.5 \times \frac{1}{14} us = 1.5 cycle$
转换时间$0.9 us = 12.5 \times \frac{1}{14} us = 12.5 cycle$
最优采样时间计算:
$$
T_S = (R_{AIN} + R_{ADC}) \times C_{ADC} * ln(2^{N+2})
$$
$R_{AIN}$ 表示模拟输入的内阻
$R_{ADC}$表示采样保持电路的电阻,为1k欧姆
$C_{ADC}$表示采样保持电路的电容,为8pF
$ln(2^{N+2})$里面的N表示采样深度,为12
带入计算,得到:
$$
T_S = (R_{AIN} + 1000) \times 77.6 * 10^{-12}
$$
只和模拟输入的内阻有关。
例如,当$R_{AIN}$ = 400欧姆时
$$
T_S = (400 + 1000) \times 77.6 * 10^{-12} = 0.11us
$$
当$R_{AIN}$ = 10k欧姆时
$$
T_S = (10e3 + 1000) \times 77.6 * 10^{-12} = 0.85us
$$
当$R_{AIN}$ = 50k欧姆时
$$
T_S = (50e3 + 1000) \times 77.6 * 10^{-12} = 3.96us
$$
计算cycle还要在后面乘上$f_{ADC}$,例如设置的$f_{ADC} = 14MHz$
当$R_{AIN}$ = 400欧姆时
$$
T_S = 0.11us \times f_{ADC} = 0.11us \times 14MHz = 1.54 cycle
$$
当$R_{AIN}$ = 10k欧姆时
$$
T_S = 0.85us \times f_{ADC} = 0.85us \times 14MHz = 11.9 cycle
$$
当$R_{AIN}$ = 50k欧姆时
$$
T_S = 3.96us \times f_{ADC} = 3.96us \times 14MHz = 55.4 cycle
$$
常用函数
1 | HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hADC); |
作用:启动常规序列
1 | HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hADC, uint32_t Timeout); |
作用:以轮询(标志位)的方式等待(常规序列)转换完成
1 | uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hADC); |
作用:获取常规序列的转换结果
示例:单通道转换ADC,光敏电阻点灯
光敏电阻的阻值为10k欧姆,计算采样时间
$$
T_S = (1e4 + 1000) \times 77.6 * 10^{-12} = 0.85us
$$
设定的ADC时钟为4MHz,计算cycle
$$
T_S = 0.85us \times 4MHz = 3.4cycle
$$
1 | while (1) |
示例:定时器触发ADC
1 | HAL_TIM_Base_Start(&htim3);//启动TIM3 |











