1.ADC是12位的一种逐次型模拟数字转换器,所以进行存储时只能存储在16位数据寄存器中,不能低于12位。其中有16个外部信号源(ADCx_IN0--ADCx_IN15)和2个内部信号源(温度传感器、)
2.ADC时钟--由时钟控制器提供的ADCCLK时钟(RCC_CFGR寄存器设置ADC时钟分频)和PCLK2(APB2时钟)同步 。
3.每个通道可以分别用不同的时间采样。
总转换时间如下计算:
TCONV = 采样时间+ 12.5个周期
当ADCCLK=14MHz,采样时间为1.5周期 TCONV = 1.5 + 12.5 = 14周期 = 1μs
4.转换可以由外部事件触发(例如定时器捕获, EXTI线)。 如果设置了EXTTRIG控制位, 则外部事件就能够触发转换。
5.ADC寄存器
(1)ADC_CR2 控制寄存器
位23 位22 位20 |
TSVREFE: 温度传感器和VREFINT使能 SWSTART: 开始转换规则通道 EXTTRIG: 规则通道的外部触发转换模式 |
位19:17 EXTSEL[2:0]: 选择启动规则通道组转换的外部事件 | |
位11 位3 位2 位1 位0 |
ALIGN: 数据对齐 RSTCAL: 复位校准 (Reset calibration) CAL: A/D校准 (A/D Calibration) CONT: 连续转换 ADON: 开/关A/D转换器 |
(2)采样时间寄存器 ADC_SMPRx --1,2分别是通道1和通道2的。
(3)ADC规则序列寄存器ADC_SQRx--查找数据手册:进行设置通道转换数目:ADC_SQR1的位23:20位,进行设置进行转换顺序即第几个转换:ADC_SQR1-ADC_SQR3。
L[3:0]:规则通道序列长度 (Regular channel sequence length) 这些位由软件定义在规则通道转换序列中的通道数目。 0000: 1个转换 0001: 2个转换 …… 1111: 16个转换 |
6.ADC的一般配置过程:
1) 开启 PA 口时钟, 设置 PA3为模拟输入。
STM32F103R8T6 的 ADC1 通道 3 在 PA3 上, 所以, 我们先要使能 PORTA 的时钟, 然
后设置 PA3 为模拟输入。
2) 使能 ADC1 时钟, 并设置分频因子。
通过 RCC 的 CFGR 寄存器设置 ADC1 的分频因子。 分频因子要确保 ADC1 的时钟(
ADCCLK) 不要超过 14Mhz。
(1)RCC->APB2ENR (2)RCC->CFGR
3) 设置 ADC1 的工作模式。
设置独立模式、 关闭扫描( 使用扫描) 、 单次( 连续) 转换模式、 数据对齐方式
( 左对齐) 、 触发方式选择( 外部触发-软件触发) 等都在这一步实现。
ADCx->CR1和ADCx->CR2
4) 设置 ADC1 规则序列的相关信息。
我们这里只有一个通道, 所以设置规则序列中通道数为 1:ADC1->SQR1 设置规则序列转换顺序:ADCx->SQRx
//*******-3个通道,转换3个
ADC1->SQR1 |=(2<<20);
//*******IN3通道3放在规则组中第一个转换,2--2,1--3
ADC1->SQR3 |=(3<<0);//3--通道编号
ADC1->SQR3 |=(2<<5);//2--通道编号
ADC1->SQR3 |=(1<<10);//1--通道编号
然后设置 ADC1 通道 3的采样周期:ADCx->SMPRx
5) 开启 AD 转换器, 校准。
开启 AD 转换器, 复位校准, 等待复位结束, 开启校准, 等待校准结束( 通过
ADC_CR2 寄存器控制) 。:ADCx->CR2
//复位校准
ADC1->CR2 |=(1<<3);
//等待校准寄存器被初始化
while(ADC1->CR2 &(1<<3));//初始化校准完成,自动为0,退出whiile
//A/D校准
ADC1->CR2 |=(1<<2);
//等待校准完成
while(ADC1->CR2&(1<<2));
6) 读取 ADC 值。
启动ADC 转换:ADC1->CR2 |=(1<<22) 在转换结束后, 读取 ADC1_DR 里面的值就是了
void GZ_ADCValue(void)
{
#if reg_progream
u16 gz_value;//光照的值
//启动规则通道转换
ADC1->CR2 |=(1<<22);
//等待转换完成
while((ADC1->SR &(1<<1))==0);
gz_value=ADC1->DR;
printf("gz_value=%d\r\n",gz_value);
}