STM32学习笔记之ADC

STM32F10X

1、ADC介绍
12
ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源各通道的信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。

2、ADC主要特征
12位分辨率
● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道
0到通道n的自动扫描模式
● 自校准
● 带内嵌数据一致性的数据对齐
● 采样间隔可以按通道分别编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式
(2个或以上ADC的器件)
ADC转换时间:
STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz1.17μs)
STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz1.55μs)
STM32F102xxUSB型产品:时钟为48MHz时为1.2μs
STM32F105xxSTM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz1.17μs)
ADC供电要求: 2.4V3.6V
ADC输入范围: VREF- VIN VREF+
● 规则通道转换期间有DMA请求产生 

3、ADC开关控制
通过设置ADC_CR2寄存器的ADON位可给ADC上电。当第一次设置ADON位时,它将ADC从断电状态下唤醒。
ADC上电延迟一段时间后(tSTAB),再次设置ADON位时开始进行转换。
通过清除
ADON位可以停止转换,并将ADC置于断电模式。在这个模式中, ADC几乎不耗电(仅几个μA)
4、 ADC时钟
由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。 RCC控制器为ADC时钟提供一个专用的可编程预分频器,详见小容量、中容量和大容量产品的复位和时钟控制(RCC)章节。
5、通道选择
16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15
● 规则组由多达
16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中。
● 注入组由多达
4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。
如果
ADC_SQRxADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到ADC以转换新选择的组。
温度传感器/ VREFINT内部通道
温度传感器和通道ADC1_IN16相连接,内部参照电压VREFINTADC1_IN17相连接。可以按注入或规则通道对这两个内部通道进行转换。
注意: 温度传感器和
VREFINT只能出现在主ADC1中。
6、单次转换模式
单次转换模式下, ADC只执行一次转换。该模式既可通过设置ADC_CR2寄存器的ADON(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0
一旦选择通道的转换完成:
● 如果一个规则通道被转换:
转换数据被储存在16ADC_DR寄存器中
EOC(转换结束)标志被设置
如果设置了EOCIE,则产生中断。
● 如果一个注入通道被转换:
转换数据被储存在16位的ADC_DRJ1寄存器中
JEOC(注入转换结束)标志被设置
如果设置了JEOCIE位,则产生中断。
然后
ADC停止。
7、连续转换模式
在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT位是1
每个转换后:
● 如果一个规则通道被转换:
转换数据被储存在16位的ADC_DR寄存器中
EOC(转换结束)标志被设置
如果设置了EOCIE,则产生中断。
● 如果一个注入通道被转换:
转换数据被储存在16位的ADC_DRJ1寄存器中
JEOC(注入转换结束)标志被设置
如果设置了JEOCIE位,则产生中断。 

8、扫描模式
此模式用来扫描一组模拟通道。
扫描模式可通过设置
ADC_CR1寄存器的SCAN位来选择。一旦这个位被设置, ADC扫描所有被ADC_SQRX寄存器(对规则通道)ADC_JSQR(对注入通道)选中的所有通道。在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了CONT位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。
如果设置了
DMA位,在每次EOC后, DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储在ADC_JDRx寄存器中。
9、注入通道管理
触发注入
清除ADC_CR1寄存器的JAUTO位,并且设置SCAN位,即可使用触发注入功能。
1. 利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。
2. 如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。
3. 然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。 图27是其定时图。
注: 当使用触发的注入转换时,必须保证触发事件的间隔长于注入序列。例如:序列长度为
28
ADC时钟周期(2个具有1.5个时钟间隔采样时间的转换),触发之间最小的间隔必须是29
ADC时钟周期。
自动注入
如果设置了JAUTO位,在规则组通道之后,注入组通道被自动转换。这可以用来转换在
ADC_SQRxADC_JSQR寄存器中设置的多至20个转换序列。
在此模式里,必须禁止注入通道的外部触发。
如果除
JAUTO位外还设置了CONT位,规则通道至注入通道的转换序列被连续执行。
对于
ADC时钟预分频系数为48时,当从规则转换切换到注入序列或从注入转换切换到规则序
列时,会自动插入
1ADC时钟间隔;当ADC时钟预分频系数为2时,则有2ADC时钟间隔的
延迟。
注意: 不可能同时使用自动注入和间断模式

10、间断模式
规则组
此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换
(n<=8),此转换是ADC_SQRx寄存器所选择的转换序列的一部分。数值nADC_CR1寄存器的
DISCNUM[2:0]位给出。
一个外部触发信号可以启动
ADC_SQRx寄存器中描述的下一轮n次转换,直到此序列所有的转
换完成为止。总的序列长度由
ADC_SQR1寄存器的L[3:0]定义。
举例:
n=3,被转换的通道 = 012367910
第一次触发:转换的序列为 012
第二次触发:转换的序列为 367
第三次触发:转换的序列为 910,并产生EOC事件
第四次触发:转换的序列
0 12
注意: 当以间断模式转换一个规则组时,转换序列结束后不自动从头开始。
当所有子组被转换完成,下一次触发启动第一个子组的转换。在上面的例子中,第四次触发重
新转换第一子组的通道
0 12
注入组
此模式通过设置ADC_CR1寄存器的JDISCEN位激活。在一个外部触发事件后,该模式按通道
顺序逐个转换
ADC_JSQR寄存器中选择的序列。
一个外部触发信号可以启动
ADC_JSQR寄存器选择的下一个通道序列的转换,直到序列中所有
的转换完成为止。总的序列长度由
ADC_JSQR寄存器的JL[1:0]位定义。
例子:
n=1,被转换的通道 = 123
第一次触发:通道1被转换
第二次触发:通道
2被转换
第三次触发:通道
3被转换,并且产生EOCJEOC事件
第四次触发:通道
1被转换
注意:
1 当完成所有注入通道转换,下个触发启动第1个注入通道的转换。在上述例子中,第四个
触发重新转换第
1个注入通道1、2 不能同时使用自动注入和间断模式 。
11、数据对齐

12、程序示例
void  Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure; 
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );  //使能ADC1通道时钟
 
RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PA1 作为模拟通道输入引脚                         
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_DeInit(ADC1);  //复位ADC1 

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1

ADC_ResetCalibration(ADC1); //使能复位校准  
 
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束

ADC_StartCalibration(ADC1); //开启AD校准
 
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
 
        ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}   

void TASK1(void *param)
{
  uint16_t adc_value= 0;
  uint8_t i = 0; 
  for(;;)
  {
    adc_value= 0;
       for(i=0;i<4;i++)
  {
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);    
  while(ADC_GetSoftwareStartConvStatus(ADC1));
adc_value += ADC_GetConversionValue(ADC1);
  }
  ADC_Speed = adc_value/4;
  CoTickDelay(10);
  }
}



你可能感兴趣的:(STM32)