day06 ADC之stm32


一、ADC基本参数:

1、输入电压范围:取决于参数与外接电路;如果超过ADC的参考电压,需要外接电路配合;

2、stm32具有3个ADC控制器,每个控制器外接16路通道(GPIO),3个控制器一共有24个通道,因此有一部分通道,3个控制器之间存在复用;

3、输入通道分类:16路规则通道和4路注入通道;规则通道在转换的时候,某一路通道需要着急转换完成,因此插入到正在转换通道的序列中,插入的通道是注入通道;那么规则通道的转换顺序如何安排?什么时候注入到通道插入进来?

  3.1 规则通道的转换顺序可以在规则序列寄存器中配置;4路注入通道的转换顺序可以在注入通道的转换顺序寄存器中配置;那么ADC转换什么时候开始?

  3.2 软件触发和硬件触发:软件触发使用相应的控制位;硬件触发使用响应的外设;规则通道与注入通道一样;

  3.3 ADC转换时间:Tconv=采样时间+12个周期;采样周期可以在对应的寄存器中配置,最低采样周期3个周期;ADC的时钟根据手册可以看出来36MHz;

4、转换方式:单次转换和连续转换、扫描转换;扫描单词模式和扫描连续模式;转换完成后数据存放在哪里?

5、数据寄存器:ADC根据不同的组,将数据放在对应的数据寄存器,规则组放在ADC_CR。注入组放在JDRx;ADC_DR所有通道的采集的数据都放在这里,因此需要及时取走数据,使用中断或者DMA方式;比较常用DMA;注入通道每个通道都有对应的数据寄存器,因此不需要着急取走数据;

6、ADC通道输入电压保护:外部输入信号超过ADC信号范围,可以使用模拟看门狗保护多个通道;

7、ADC工作模式:单独模式、双重模式、三重模式;(三个ADC控制器工作的个数)

  7.1 单独模式:只有一个ADC控制器工作,可以使任意一个;也可以是单通道也可以使多个通道,转换的数据存放在ADC_DR中,存取数据可以用中断或者DMA;

  7.2 双重规则同步模式:用于规则通道,使用两个及以上的控制器同时采集;

  7.3 多重交替模式:交替模式只能用在规则组,通常只有一个通道,在一个ADC采集的时候,另一个ADC开始转换,这样可以提高ADC的采样率;可以达到6M,数据传输使用DMA2模式,有两个数据传输数据;

二、ADC初始化

  1、原理图:PA5--->ADC12_IN5,使用外部的管脚座STM_ADC,这里的ADC12是指控制器ADC控制器1或者控制器2;

  2.1 时钟初始化

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹÄÜGPIOAʱÖÓ
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ʹÄÜADC1ʱÖÓ

  2.2  配置GPIO属性

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;// 配置复用功能
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;// 不需要上下拉电阻
  GPIO_Init(GPIOA, &GPIO_InitStructure);// 

  2.3 复位ADC1控制器

    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);      //ADC1使能复位
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);    // 停止复位

  2.4  ADC控制器通用功能初始化

  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;// 设置独立工作模式
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;// 设置两个采样之间周期间隔,为5个周期,最小3个周期
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA访问失能
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;// 配置ADC时钟分频ADC CLK=PCLK2/4=84/4=21Mhz,ADC时钟最大为36Mhz 
  ADC_CommonInit(&ADC_CommonInitStructure);// 通用初始化

  2.5 ADC控制器初始化

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//设置ADC分辨率
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;// 关闭ADC1控制器扫描模式
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;// 关闭ADC连续转换模式
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;// 没有外部触发源
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;// 设置数据对齐方式
  ADC_InitStructure.ADC_NbrOfConversion = 1;//设置转换通道大小 
  ADC_Init(ADC1, &ADC_InitStructure);//ADC1控制器初始化

  2.6 开启ADC转换

ADC_Cmd(ADC1, ENABLE);// 开启转换

  2.7 设置ADC规则通道,通道个数,采样时间(与精度有关),这里ch固定为5

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );// 规则通道组,规则序列、采样时间        
ADC_SoftwareStartConv(ADC1);        //启动ADC1软件转启动功能

配置完成上面就可以实时获取ADC的数据,通过判断转换完成的中断标志;

  2.8 判断转换完成的中断标志位、获取数据寄存器中的数据

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));// 获取中断标志位EOC

return ADC_GetConversionValue(ADC1);    // 获取ADC转换完成结果

  2.9 获取采集数据的平均值,提高准确率

u16 Get_Adc_Average(u8 ch,u8 times)
{
    u32 temp_val=0;
    u8 t;
    for(t=0;t<times;t++)
    {
        temp_val+=Get_Adc(ch);
        delay_ms(5);
    }
    return temp_val/times;
}

  2.10 获取转换结果

adcx=Get_Adc_Average(ADC_Channel_5,20); // 获取20次求平均值,指定通道5

   2.11 初始化步骤:

  1、开启GPIO时钟和ADC时钟,设置GPIO口为复用功能;

  2、复用ADC1同时设置ADC的分频因子;

  3、初始化ADC_CCR寄存器,通用功能;

  4、配置规则通道参数;

  5、开启软件转换;

  6、等待转换完成,读取ADC值;

三、多通道DMA读取ADC数据---独立模式-多通道--使用DMA

  1、PB0和PB1,ADC1

  2、配置步骤:

    2.1、初始化ADC对应的GPIO(多通道配置多个GPIO)

    2.2、配置ADC初始化结构体,DMA初始化结构体

    2.3、配置通道的转换顺序,使能DMA请求,使能DMA、打开ADC、触发ADC开始转换;

    2.4、编写main

 

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM