STM32_ADC
一.ADC介绍
ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器
![](https://img-blog.csdnimg.cn/img_convert/db501567b63a5eae29e56f1c45fe9f52.png)
常见类型:
ADC****电路类型 | 优点 | 缺点 |
并联比较型 | 转换速度最快 | 成本高、功耗高,分辨率低 |
逐次逼近型 | 结构简单,功耗低 | 转换速度较慢 |
1.1 并联比较型
![](https://img-blog.csdnimg.cn/img_convert/3d2293e148af329837feee66f9fe60a0.png)
分压部分 + 比较部分 + 编码部分
优点:转换速度快
缺点:成本高、功耗高、分辨率低
1.2逐次逼近型
![](https://img-blog.csdnimg.cn/img_convert/c1be7661bf11354df1d0b192fb0b0918.png)
优点:结构简单、低功耗
缺点:转换速度较慢
特点:分辨率和采样速度相互矛盾,分辨率越高,采样速率越低
1.3ADC特性参数
分辨率:表示ADC能辨别的最小模拟量,用二进制位数表示,比如:8、10、12、16位等
转换时间:表示完成一次A/D转换所需要的时间,转换时间越短,采样率就可以越高
精度:最小刻度基础上叠加各种误差的参数,精度受ADC性能、温度和气压等影响
量化误差:用数字量近似表示模拟量,采用四舍五入原则,此过程产生的误差为量化误差
主要特性 | F1 | F4 | F7 | H7 |
ADC类型 | 逐次逼近型 | |||
分辨率 | 12位 | 6/8/10/12位 | 6/8/10/12位 | 8/10/12/14/16位 |
ADC时钟频率 | 14MHz(max) | 36MHz(max) | ||
采样时间 | 采样时间越长, 转换结果相对越准确, 但是转换速度就越慢 | |||
转换时间 | 与ADC时钟频率、分辨率和采样时间等有关 | |||
供电电压 | VSSA :0V,VDDA :2.4V~3.6V(全速运行) | |||
参考电压 | VREF– :0V,VREF+一般为3.3V | |||
输入电压 | VREF–≤VIN≤VREF+ |
二.ADC转换原理
2.1 ADC框图
F1:
![](https://img-blog.csdnimg.cn/img_convert/3986e70c9fd873072253239645ce07ca.png)
①参考电压/模拟部分电压
②输入通道
③转换序列
④触发源
⑤转换时间
⑥数据寄存器
⑦中断
F4:
![](https://img-blog.csdnimg.cn/img_convert/5f379c1ce13aee39f5ac70a79c9c1521.png)
①参考电压/模拟部分电压
②输入通道
③转换序列
④触发源
⑤转换时间
⑥数据寄存器
⑦中断
2.2 ADC通道
ADC1 | IO | ADC2 | IO | ADC3 | IO |
通道0 | PA0 | 通道0 | PA0 | 通道0 | PA0 |
通道1 | PA1 | 通道1 | PA1 | 通道1 | PA1 |
通道2 | PA2 | 通道2 | PA2 | 通道2 | PA2 |
通道3 | PA3 | 通道3 | PA3 | 通道3 | PA3 |
通道4 | PA4 | 通道4 | PA4 | 通道4 | PF6 |
通道5 | PA5 | 通道5 | PA5 | 通道5 | PF7 |
通道6 | PA6 | 通道6 | PA6 | 通道6 | PF8 |
通道7 | PA7 | 通道7 | PA7 | 通道7 | PF9 |
通道8 | PB0 | 通道8 | PB0 | 通道8 | PF10 |
通道9 | PB1 | 通道9 | PB1 | 通道9 | 连接内部VSS |
通道10 | PC0 | 通道10 | PC0 | 通道10 | PC0 |
通道11 | PC1 | 通道11 | PC1 | 通道11 | PC1 |
通道12 | PC2 | 通道12 | PC2 | 通道12 | PC2 |
通道13 | PC3 | 通道13 | PC3 | 通道13 | PC3 |
通道14 | PC4 | 通道14 | PC4 | 通道14 | 连接内部VSS |
通道15 | PC5 | 通道15 | PC5 | 通道15 | 连接内部VSS |
通道16 | 连接内部温度传感器 | 通道16 | 连接内部VSS | 通道16 | 连接内部VSS |
通道17 | 连接内部Vrefint | 通道17 | 连接内部VSS | 通道17 | 连接内部VSS |
2.3 转换序列
A/D转换被组织为两组:规则组(常规转换组)和注入组(注入转换组)规则组最多可以有16个转换,注入组最多有4个转换
![](https://img-blog.csdnimg.cn/img_convert/48b7b50d515640f173abe11d219139c9.png)
注入组的级别高于规则组
2.4 触发源
(1)ADON位触发转换(仅限F1系列)
当ADC_CR2寄存器的ADON位为1时,再单独给ADON位写1,只能启动规则组转换
(2)外部事件触发转换
外部事件触发转换分为:规则组外部触发和注入组外部触发
F1:
![](https://img-blog.csdnimg.cn/img_convert/5da4d72e9ec5d563ad4aaffaa4f9b3dd.png)
F4/F7:
![](https://img-blog.csdnimg.cn/img_convert/5d1d8fca9f4e7a6308ca513625ee2494.png)
2.5 转换时间
![](https://img-blog.csdnimg.cn/img_convert/e5c68922d9d6a8b4cb4be16f5f21761a.png)
![](https://img-blog.csdnimg.cn/img_convert/a9b85385d995d61fcc91d1e644bc8d47.png)
2.6 中断
中断事件 | 事件标志 | 使能控制位 |
规则通道转换结束 | EOC | EOCIE |
注入通道转换结束 | JEOC | JEOCIE |
设置了模拟看门狗状态位 | AWD | AWDIE |
溢出(F1没有) | OVR | OVRIE |
DMA请求(只适用于规则组)
规则组每个通道转换结束后,除了可以产生中断外,还可以产生DMA请求,我们利用DMA及时把转换好的数据传输到指定的内存里,防止数据被覆盖。
2.7 单次转换模式和连续转换模式
CONT位 | 0 | 1 |
转换模式 | 单次转换模式 | 连续转换模式 |
转换组/转换模式 | 单次转换模式(只触发一次转换) | 连续转换模式(自动触发下一次转换)注意:只有规则组才能触发该模式 |
规则组 | 转换结果被储存在ADC_DR EOC(转换结束)标志位被置1如果设置了EOCIE位,则产生中断然后ADC停止 | 转换结果被储存在ADC_DR EOC(转换结束)标志位被置1如果设置了EOCIE位,则产生中断 |
注入组 | 转换结果被储存在ADC_DRJxJEOC(转换结束)标志位被置1如果设置了JEOCIE位,则产生中断然后ADC停止 | 转换结果被储存在ADC_DRJxJEOC(转换结束)标志位被置1如果设置了JEOCIE位,则产生中断自动注入:将JAUTO位置1 |
2.8 扫描模式
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多通道,并要求所有通道都转换一次后,自动启动下一轮转换 |
三.ADC配置
步骤 | 操作 | 函数 |
1 | 配置ADC工作参数、ADC校准 | HAL_ADC_Init()、HAL_ADCEx_Calibration_Start() |
2 | ADC MSP初始化 | HAL_ADC_MspInit() 配置NVIC、CLOCK、GPIO等 |
3 | 配置ADC相应通道相关参数 | HAL_ADC_ConfigChannel() |
4 | 启动A/D转换 | HAL_ADC_Start() |
5 | 等待规则通道转换完成 | HAL_ADC_PollForConversion() |
6 | 获取规则通道A/D转换结果 | HAL_ADC_GetValue() |
函数 | 主要寄存器 | 主要功能 |
HAL_ADC_Init() | CR1、CR2 | 配置ADC工作参数 |
HAL_ADCEx_Calibration_Start() | CR2 | ADC校准 |
HAL_ADC_MspInit() | 无 | 存放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转换结果 |