[STM32F1] STM32F103——ADC之再理解

[复制链接]
941|0
 楼主| orangebanana 发表于 2016-4-25 12:36 | 显示全部楼层 |阅读模式
先来一段正点mini板的ADC初始化例子
  1. Stm32_Clock_Init(9);
  2. void  Adc_Init(void)
  3. {   
  4.         //先初始化IO口
  5.          RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
  6.         GPIOA->CRL&=0XFFFF0000;//PA0 1 2 3 anolog输入
  7.         //通道10/11设置                        
  8.         RCC->APB2ENR|=1<<9;    //ADC1时钟使能         
  9.         RCC->APB2RSTR|=1<<9;   //ADC1复位
  10.         RCC->APB2RSTR&=~(1<<9);//复位结束            
  11.         RCC->CFGR&=~(3<<14);   //分频因子清零        
  12.         //SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
  13.         //否则将导致ADC准确度下降!
  14.         RCC->CFGR|=2<<14;               

  15.         ADC1->CR1&=0XF0FFFF;   //工作模式清零
  16.         ADC1->CR1|=0<<16;      //独立工作模式  
  17.         ADC1->CR1&=~(1<<8);    //非扫描模式         
  18.         ADC1->CR2&=~(1<<1);    //单次转换模式
  19.         ADC1->CR2&=~(7<<17);           
  20.         ADC1->CR2|=7<<17;           //软件控制转换  
  21.         ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!!        必须使用一个事件来触发
  22.         ADC1->CR2&=~(1<<11);   //右对齐         
  23.         ADC1->SQR1&=~(0XF<<20);
  24.         ADC1->SQR1&=0<<20;     //1个转换在规则序列中 也就是只转换规则序列1                           
  25.         //设置通道0~3的采样时间
  26.         ADC1->SMPR2&=0XFFFFF000;//通道0,1,2,3采样时间清空         
  27.         ADC1->SMPR2|=7<<9;      //通道3  239.5周期,提高采样时间可以提高精确度         
  28.         ADC1->SMPR2|=7<<6;      //通道2  239.5周期,提高采样时间可以提高精确度         
  29.         ADC1->SMPR2|=7<<3;      //通道1  239.5周期,提高采样时间可以提高精确度         
  30.         ADC1->SMPR2|=7<<0;      //通道0  239.5周期,提高采样时间可以提高精确度         

  31.         ADC1->CR2|=1<<0;            //开启AD转换器         
  32.         ADC1->CR2|=1<<3;        //使能复位校准  
  33.         while(ADC1->CR2&1<<3);  //等待校准结束                          
  34.     //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。                  
  35.         ADC1->CR2|=1<<2;        //开启AD校准           
  36.         while(ADC1->CR2&1<<2);  //等待校准结束
  37.         //该位由软件设置以开始校准,并在校准结束时由硬件清除  
  38. }
初始化中可以看到,SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!当ADC的时钟频率超过14MHz时,ADC的精度将会显著下降。
STM32F103xx系列称为增强型产品,增强型产品的最高时钟频率可以达到72MHz。
STM32F101xx系列称为基本型产品,基本型产品的最高时钟频率可以达到36MHz。
根据设计,当ADC模块的频率为14MHz时,可以达到ADC的最快采样转换速度。

要得到14MHz的ADC频率,就要求SYSCLK的频率是14MHz的倍数,即14MHz、28MHz、42MHz、56MHz、70MHz、 84MHz等;

对于基本型产品14MHz和28MHz处于它的最大允许频率范围内;
对于增强型产品,14MHz、28MHz、42MHz、56MHz和 70MHz几种频率都在它的最大允许频率范围内,但因为ADC预分频器的分频系数只有2、4、6、8这几个,使用70MHz不能得到最大的14MHz,所以要想得到最快的ADC转换速度,在本例(f103xx)增强型产品上能用的最快SYSCLK频率是56MHz。

ADC的速度由2个参数决定,它是采样时间和转换时间之和:
        TCONV = 采样时间 + 12.5个ADC时钟周期

在STM32中,ADC的采样时间是由用户程序在一组预定的数值中选择,按照ADC的时钟周期计算,共有8种选择:1.5、7.5、13.5、28.5、41.5、55.5、71.5和239.5。按最小的1.5个时钟周期的采样时间计算,最短的TCONV等于14个时钟周期,如果ADC的时钟频率是14MHz,则ADC的速度为每秒100万次。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

113

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部