打印
[STM32F1]

STM32F103——ADC之再理解

[复制链接]
692|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
orangebanana|  楼主 | 2016-4-25 12:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先来一段正点mini板的ADC初始化例子
Stm32_Clock_Init(9);
void  Adc_Init(void)
{   
        //先初始化IO口
         RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
        GPIOA->CRL&=0XFFFF0000;//PA0 1 2 3 anolog输入
        //通道10/11设置                        
        RCC->APB2ENR|=1<<9;    //ADC1时钟使能         
        RCC->APB2RSTR|=1<<9;   //ADC1复位
        RCC->APB2RSTR&=~(1<<9);//复位结束            
        RCC->CFGR&=~(3<<14);   //分频因子清零        
        //SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
        //否则将导致ADC准确度下降!
        RCC->CFGR|=2<<14;               

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

        ADC1->CR2|=1<<0;            //开启AD转换器         
        ADC1->CR2|=1<<3;        //使能复位校准  
        while(ADC1->CR2&1<<3);  //等待校准结束                          
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。                  
        ADC1->CR2|=1<<2;        //开启AD校准           
        while(ADC1->CR2&1<<2);  //等待校准结束
        //该位由软件设置以开始校准,并在校准结束时由硬件清除  
}
初始化中可以看到,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

粉丝