stm32之ADC(规则通道)

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)
CALA/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)
这些位由软件定义在规则通道转换序列中的通道数目。
00001个转换
00012个转换
……
111116个转换

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);

}

猜你喜欢

转载自www.cnblogs.com/juan-4-14/p/12733940.html