模数转换器
ADC电路类型 |
优点 |
缺点 |
并联比较型 |
转换速度最快 |
成本高、功耗高,分辨率低 |
逐次逼近型 |
结构简单,功耗低 |
转换速度较慢 |
分压部分+比较部分+编码部分
控制电路+数码寄存器+D/A转换器+电压比较
特点:分辨率和采样速度相互矛盾,
分辨率越高,采样速率越低
表示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+ |
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 |
规则序列寄存器控制关系汇总 |
|||
寄存器 |
寄存器位 |
功能 |
取值 |
SQR3 |
SQ1 [ 4 : 0 ] |
设置第1个转换的通道 |
通道0~17 |
SQ2 [ 4 : 0 ] |
设置第2个转换的通道 |
通道0~17 |
|
SQ3 [ 4 : 0 ] |
设置第3个转换的通道 |
通道0~17 |
|
SQ4 [ 4 : 0 ] |
设置第4个转换的通道 |
通道0~17 |
|
SQ5 [ 4 : 0 ] |
设置第5个转换的通道 |
通道0~17 |
|
SQ6 [ 4 : 0 ] |
设置第6个转换的通道 |
通道0~17 |
|
SQR2 |
SQ7 [ 4 : 0 ] |
设置第7个转换的通道 |
通道0~17 |
SQ8 [ 4 : 0 ] |
设置第8个转换的通道 |
通道0~17 |
|
SQ9 [ 4 : 0 ] |
设置第9个转换的通道 |
通道0~17 |
|
SQ10 [ 4 : 0 ] |
设置第10个转换的通道 |
通道0~17 |
|
SQ11 [ 4 : 0 ] |
设置第11个转换的通道 |
通道0~17 |
|
SQ12 [ 4 : 0 ] |
设置第12个转换的通道 |
通道0~17 |
|
SQR1 |
SQ13 [ 4 : 0 ] |
设置第13个转换的通道 |
通道0~17 |
SQ14 [ 4 : 0 ] |
设置第14个转换的通道 |
通道0~17 |
|
SQ15 [ 4 : 0 ] |
设置第15个转换的通道 |
通道0~17 |
|
SQ16 [ 4 : 0 ] |
设置第16个转换的通道 |
通道0~17 |
|
SQL [ 3 : 0 ] |
设置规则序列要转换的通道数 |
0~15 |
注入序列寄存器控制关系汇总 |
|||
寄存器 |
寄存器位 |
功能 |
取值 |
JSQR |
JSQ1 [ 4 : 0 ] |
设置第1个转换的通道 |
通道0~17 |
JSQ2 [ 4 : 0 ] |
设置第2个转换的通道 |
通道0~17 |
|
JSQ3 [ 4 : 0 ] |
设置第3个转换的通道 |
通道0~17 |
|
JSQ4 [ 4 : 0 ] |
设置第4个转换的通道 |
通道0~17 |
|
JL [ 1 : 0 ] |
设置注入序列要转换的通道数 |
0~3 |
注入序列的转换顺序是从JSQx[ 4 : 0 ](x=4-JL[1:0])开始
当ADC_CR2寄存器的ADON位为1时,再单独给ADON位写1,只能启动规则组转换
CONT位 |
0 |
1 |
转换模式 |
单次转换模式 |
连续转换模式 |
转换组/转换模式 |
单次转换模式(只触发一次转换) |
连续转换模式(自动触发下一次转换) 注意:只有规则组才能触发该模式 |
规则组 |
转换结果被储存在ADC_DR EOC(转换结束)标志位被置1 如果设置了EOCIE位,则产生中断 然后ADC停止 |
转换结果被储存在ADC_DR EOC(转换结束)标志位被置1 如果设置了EOCIE位,则产生中断 |
注入组 |
转换结果被储存在ADC_DRJx JEOC(转换结束)标志位被置1 如果设置了JEOCIE位,则产生中断 然后ADC停止 |
转换结果被储存在ADC_DRJx JEOC(转换结束)标志位被置1 如果设置了JEOCIE位,则产生中断 自动注入:将JAUTO位置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多通道,并要求所有通道都转换一次后,自动启动下一轮转换 |
HAL库函数介绍
函数 |
主要寄存器 |
主要功能 |
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转换结果 |
//相关结构体
typedef struct
{
ADC_TypeDef *Instance; /* ADC 寄存器基地址 */
ADC_InitTypeDef Init; /* ADC 参数初始化结构体变量 */
DMA_HandleTypeDef *DMA_Handle; /* DMA 配置结构体 */
……
} ADC_HandleTypeDef;
typedef struct
{
uint32_t DataAlign; /* 设置数据的对齐方式 */
uint32_t ScanConvMode; /* 扫描模式 */
FunctionalState ContinuousConvMode; /* 开启单次转换模式或者连续转换模式 */
uint32_t NbrOfConversion; /* 设置转换通道数目 */
FunctionalState DiscontinuousConvMode; /* 是否使用规则通道组间断模式 */
uint32_t NbrOfDiscConversion; /* 配置间断模式的规则通道个数 */
uint32_t ExternalTrigConv; /* ADC 外部触发源选择 */
} ADC_InitTypeDef;
typedef struct
{
uint32_t Channel; /* ADC 转换通道 */
uint32_t Rank; /* ADC 转换顺序 */
uint32_t SamplingTime; /* ADC 采样周期 */
} ADC_ChannelConfTypeDef;
HAL库函数介绍
函数 |
主要寄存器 |
主要功能 |
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_DMA_Start_IT() |
CCRx |
启动DMA、开启传输完成中断 |
HAL_ADC_Start_DMA() |
CR2 |
触发ADC转换、使用DMA传输数据 |
//相关结构体
typedef struct
{
uint32_t Direction; /* 传输方向 */
uint32_t PeriphInc; /* 外设(非)增量模式 */
uint32_t MemInc; /* 存储器(非)增量模式 */
uint32_t PeriphDataAlignment; /* 外设数据宽度 */
uint32_t MemDataAlignment; /* 存储器数据宽度 */
uint32_t Mode; /* 操作模式 */
uint32_t Priority; /* DMA通道优先级 */
}DMA_InitTypeDef;