ADC学习笔记
文章目录
1、什么是ADC?
ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器
2、类型
类型主要有,逐次逼近型、并行比较型、积分型、压频变换型,分级型,流水线型和∑-Δ型ADC
常用的有:逐次逼近型、并行比较型
ADC电路类型 | 优点 | 缺点 |
---|---|---|
并联比较型 | 转换速度最快 | 成本高、功耗高,分辨率低 |
逐次逼近型 | 结构简单,功耗低 | 转换速度较慢 |
并行比较型
V
R
E
F
V_{REF}
VREF——参考电压
输出口D0~2,也就是有三位输出,即分辨率为3位,可以分辨
2
3
2^3
23个数
中间的是比较器,通过比较
V
X
V_{X}
VX与参考电压
V
R
E
F
V_{REF}
VREF是否相等,来决定哪个通道,8个通道同时检测
逐次逼近型
假设D2D1D0:0b100
通过D/A转换器,转换成
V
0
V_0
V0。再与
V
X
V_X
VX比较
若
V
0
V_0
V0 >
V
X
V_X
VX,则0b100太大了,D2应该为0,验证下一位D2D1D0:0b010
若
V
0
V_0
V0 <
V
X
V_X
VX,则0b100太小了,D2应该为1,验证下一位D2D1D0:0b110
再通过D/A转换器,转换成
V
0
V_0
V0。再与
V
X
V_X
VX比较,便可以得出D1位,以此类推。
STM32F1、STM32F4的芯片 都是 逐次逼近型。
2、特性参数
分辨率:表示ADC能辨别的最小模拟量,用二进制位数表示,比如:8、10、12、16位等
精度:最小刻度基础上叠加各种误差的参数,精度受ADC性能、温度和气压等影响
转换时间:表示完成一次A/D转换所需要的时间,转换时间越短,采样率就可以越高
量化误差:用数字量近似表示模拟量,采用四舍五入原则,此过程产生的误差为量化误差
主要特性 | F1 | F4 |
---|---|---|
ADC类型 | 逐次逼近型 | 逐次逼近型 |
分辨率 | 12位 | 6/8/10/12位 |
ADC时钟频率 | 14MHz(max) | 36MHz(max) |
采样时间 | 采样时间越长,转换结果相对越准确,但是转换速度就越慢 | 采样时间越长,转换结果相对越准确,但是转换速度就越慢 |
转换时间 | 与ADC时钟频率、分辨率和采样时间等有关 | 与ADC时钟频率、分辨率和采样时间等有关 |
供电电压 | VSSA:0V,VDDA: 2.4V~3.6V(全速运行) | VSSA:0V,VDDA: 2.4V~3.6V(全速运行) |
参考电压 | VREF-: 0V,VREF+一般为3.3V | VREF-:0V, VREF+一般为3.3V |
输入电压 | VRFF- <= VIN <= VRFF+ | VRFF- <= VIN <= VRFF+ |
3、框图
STM32F1
①参考电压/模拟部分电压 ②输入通道 ③转换序列
④触发源 ⑤转换时间 ⑥数据寄存器 ⑦中断
STM32F4
①参考电压/模拟部分电压 ②输入通道 ③转换序列
④触发源 ⑤转换时间 ⑥数据寄存器 ⑦中断
4、转换序列(规则通道 & 注入通道)
F1为例,规则组最多可以有16个转换,注入组最多有4个转换
如图优先级一目了然
5、触发源
触发转换的方法有两种:
(1)ADON位触发转换(仅限F1系列)
当ADC_CR2寄存器的ADON位为1时,再单独给ADON位写1,只能启动规则组转换
(2)外部事件触发转换
规则组外部触发和注入组外部触发
6、转换时间
时钟设置
转换时间设置
STN32F1的ADC转换时间: T C O N V T_CONV TCONV = 采样时间 + 12.5个周期
采样时间可通过SMPx[2:0]位设置,x=0~17
SMP = 000:1.5个ADC时钟周期
SMP = 001:7.5个ADC时钟周期
SMP = 010:13.5个ADC时钟周期
SMP = 011:28.5个ADC时钟周期
SMP = 100:41.5个ADC时钟周期
SMP = 101:55.5个ADC时钟周期
SMP = 110:71.5个ADC时钟周期
SMP = 111:239.5个ADC时钟周期
STN32F4的ADC转换时间(12位分辨率):
T
C
O
N
V
T_CONV
TCONV = 采样时间 + 12个周期
12位分辨率——>+ 12个周期
10位分辨率——>+ 10个周期
8位分辨率——>+ 8个周期
6位分辨率——>+ 6个周期
采样时间可通过SMPx[2:0]位设置,x=0~18
SMP = 000:3个ADC时钟周期
SMP = 001:15个ADC时钟周期
SMP = 010:28个ADC时钟周期
SMP = 011:56个ADC时钟周期
SMP = 100:84个ADC时钟周期
SMP = 101:112个ADC时钟周期
SMP = 110:144个ADC时钟周期
SMP = 111:480个ADC时钟周期
7、数据寄存器
8、中断
中断事件 | 事件标志 | 使能控制位 |
---|---|---|
规则通道转换结束 | EOC | EOCIE |
注入通道转换结束 | JEOC | JEOCIE |
设置了模拟看门狗状态位 | AWD | AWDIE |
溢出(F1没有) | OVR | OVRIE |
DMA请求(只适用于规则组)
规则组每个通道转换结束后,除了可以产生中断外,还可以产生DMA请求,我们利用DMA及时把转换好的数据传输到指定的内存里,防止数据被覆盖。
9、转换模式 & 扫描模式
转换模式
CONT位 | 0 | 1 |
---|---|---|
转换模式 | 单次转换模式 | 连续转换模式 |
转换组/转换模式 | 单次转换模式(只触发一次转换) | 连续转换模式(自动触发下一次转换)注意:只有规则组才能触发该模式 |
---|---|---|
规则组 | 转换结果被储存在ADC_DREOC(转换结束)标志位被置1如果设置了EOCI E位,则产生中断然后ADC停止 | 转换结果被储存在ADC_DREOC(转换结束)标志位被置1如果设置了EOCI E位,则产生中断 |
注入组 | 转换结果被储存在ADC_DRJxJEOC(转换结束)标志位被置1如果设置了JEOCI E位,则产生中断然后ADC停止 | 转换结果被储存在ADC_DRJxJEOC(转换结束)标志位被置1如果设置了JEOCI E位,则产生中断自动注入:将UAUTO位置1 |
扫描模式
SCAN位 | 0 | 1 |
---|---|---|
扫描模式 | 关闭扫描模式 | 使用扫描模式 |
关闭扫描模式 | 使用扫描模式 |
---|---|
ADC只转换ADC_SQRx或ADC_JSQR选中的第一个通道进行转换 | ADC会扫描所有被ADC_SQRx或ADC_JSQR选中的所有通道 |
组合
模式名称 | 转换要求 |
---|---|
单次转换模式(不扫描) | 只转换一个通道,而且是一次,需等待下一次触发 |
单次转换模式(扫描) | ADC_SQRX 和ADC_JSQR 选中的所有通道都转换一次 |
连续转换模式(不扫描) | 只会转换一个通道,转换完后会自动执行下一次转换 |
连续转换模式(扫描) | ADC_SQRX 和ADC_JSQR 选中的所有通道都转换一次,并自动进入下一轮转换 |
简单来说
模式名称 | 转换要求 |
---|---|
单次转换模式(不扫描) | 使用ADC单通道,并要求进行一次转换 |
单次转换模式(扫描) | 使用ADC多通道,并要求所有通道都转换一次就停止 |
连续转换模式(不扫描) | 使用ADC单通道,并要求对该通道连续转换 |
连续转换模式(扫描) | 使用ADC多通道,并要求所有通道都转换一次后,自动启动下一轮转换 |
10、HAL库函数
函数 | 主要寄存器 | 主要功能 |
---|---|---|
HAL_ADC_Init() | CR1、CR2 | 配置ADC工作参数 |
HAL_ADCEX_Calibration_Start() | CR2 | ADC校准 |
HAL_ADC_Msplinit() | 无 | 存放NVIC、CLOCK、GPIO初始化代码 |
HAL_RCCEx_PeriphCLKConfig() | RCC_CFGR | 设置扩展外设时钟,如:ADC、RTC等 |
HAL_ADC_ConfigChannel() | SQRx、SMPRx | 配置ADC相应通道的相关参数 |
HAL_ADC_Start() | CR2 | 启动A/D转换 |
HAL_ADC_PollForConversion() | SR | 等待规则通道转换完成 |
HAL_ADC_GetValue() | DR | 获取规则通道A/D转换结果 |
11、关键结构体
// ADC句柄结构体
typedef struct
{
ADC_TypeDef *Instance; /* ADC 寄存器基地址 */
ADC_InitTypeDef Init; /* ADC 参数初始化结构体变量 */
DMA_HandleTypeDef *DMA_Handle; /* DMA 配置结构体 */
……
} ADC_HandleTypeDef;
// ADC的结构定义和正则组初始化结构体
typedef struct
{
uint32_t DataAlign; /* 设置数据的对齐方式 */
uint32_t ScanConvMode; /* 扫描模式 */
FunctionalState ContinuousConvMode; /* 开启单次转换模式或者连续转换模式 */
uint32_t NbrOfConversion; /* 设置转换通道数目 */
FunctionalState DiscontinuousConvMode; /* 是否使用规则通道组间断模式 */
uint32_t NbrOfDiscConversion; /* 配置间断模式的规则通道个数 */
uint32_t ExternalTrigConv; /* ADC 外部触发源选择 */
} ADC_InitTypeDef;
// 普通组ADC通道的结构体定义
typedef struct
{
uint32_t Channel; /* ADC 转换通道*/
uint32_t Rank; /* ADC 转换顺序 */
uint32_t SamplingTime; /* ADC 采样周期 */
} ADC_ChannelConfTypeDef;
┈┈┈┈▕▔╲┈┈┈┈┈┈┈ ┈┈┈┈▕▔╲┈┈┈┈┈┈┈ ┈┈┈┈▕▔╲┈┈┈┈┈┈┈┈
┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈
┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈
▂▂▂▂╱┈┈▕▂▂▂▂▏┈ ▂▂▂▂╱┈┈▕▂▂▂▂▏┈ ▂▂▂▂╱┈┈▕▂▂▂▂▏┈┈
▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈
▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈
▔▔▔▔╲▂▂▕▂▂▂▂▏┈ ▔▔▔▔╲▂▂▕▂▂▂▂▏┈ ▔▔▔▔╲▂▂▕▂▂▂▂▏┈┈