zoukankan      html  css  js  c++  java
  • ADC模数转换(三)——双重ADC同步规则模式电压采集实验

     

    相比较于独立模式多通道电压采集实验,其实双重ADC同步模式实验就是多了另一个ADC同步而已,只是有些地方在配置和编程时需要注意而已,而且本文用的是单通道ADC。

    双重ADC相对于独立模式,同时采集一个或多个通道,可以提高采样率。

    可以直接配置ADC_CR1寄存器的 DUALMOD[3:0]位,用于启用双重ADC,这里我们配置为规则同步模式。

    简单来讲,规则同步模式即为ADC1和ADC2同时转换规则通道组,其中ADC1为主,ADC2为从。ADC1转换的结果放在ADC_DR的低16位,ADC2转换的结果放在ADC_DR的高16位。如图23-1为ADC_DR寄存器描述。

    图23-1

    GPIO配置

    我们选择ADC1的通道11和ADC2的通道14,这两个通道对应引脚为PC1和PC4,那么我们分别配置这两个引脚的GPIO。

    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    

    DMA配置

    我们知道,ADC1对应DMA1的通道1,ADC3对应DMA2的通道5,而ADC2则没有DMA功能。所以我们依然使用ADC模数转换(二)——独立模式多通道电压采集实验的DMA配置,所不同的是,这里只有单个通道传输,所以缓冲区DMA_BufferSize的值应为1,还有一点,因为这是ADC1和ADC2双重ADC,所以内存(DMA_MemoryDataSize)和外设(DMA_PeripheralDataSize)的数据宽度应为一个字,即4个字节大小。

    DMA_InitTypeDef DMA_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 1;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;    // 一个字,即4字节大小
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;            // 一个字,即4字节大小
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;	
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    DMA_Cmd(DMA1_Channel1, ENABLE);
    

    ADC配置

    需要将ADC模式配置为规则同步模式,并且需要分别初始化ADC1/2的校准寄存器,并校准ADC1/2,此外还需要使能ADC2外部触发转换。并且还要注意,ADC1/2的采样时间需要一致。

    ADC_InitTypeDef ADC_InitStruct;	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);
    
    ADC_InitStruct.ADC_Mode = ADC_Mode_RegSimult;           // 规则同步模式
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;       
    ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;	
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_NbrOfChannel = 1;	
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);	
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);
    
    ADC_DMACmd(ADC1, ENABLE);
    
    /**** ADC1 ****/
    ADC_Init(ADC1, &ADC_InitStruct);
    ADC_Cmd(ADC1, ENABLE);	
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));	
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
    
    /**** ADC2 ****/
    ADC_Init(ADC2, &ADC_InitStruct);
    ADC_Cmd(ADC2, ENABLE);	 
    ADC_ResetCalibration(ADC2);
    while(ADC_GetResetCalibrationStatus(ADC2));	
    ADC_StartCalibration(ADC2);
    while(ADC_GetCalibrationStatus(ADC2));
    
    ADC_ExternalTrigConvCmd(ADC2, ENABLE);                  // 使能ADC2外部触发转换 
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    

    接下来在main()函数里把ADC_DR寄存器的低16位和高16位的数据分别取出来进行公式转换即可。

    temp0 = (ADC_ConvertedValue[0] & 0xFFFF0000) >> 16;     // 高16位数据,这是ADC2的转换数据
    temp1 = (ADC_ConvertedValue[0] & 0xFFFF);               // 低16位数据,这是ADC1的转换数据	
    
    ADC_ConvertedValueLocal[0] =(float)temp0 / 4096 * 3.3;
    ADC_ConvertedValueLocal[1] =(float)temp1 / 4096 * 3.3;
    
    printf("
     ADC1 value = %f V 
    ", ADC_ConvertedValueLocal[1]);
    printf("
     ADC2 value = %f V 
    ", ADC_ConvertedValueLocal[0]);
    

     

  • 相关阅读:
    hdu 2019 数列有序!
    hdu 2023 求平均成绩
    HDU 5805 NanoApe Loves Sequence (思维题) BestCoder Round #86 1002
    51nod 1264 线段相交
    Gym 100801A Alex Origami Squares (求正方形边长)
    HDU 5512 Pagodas (gcd)
    HDU 5510 Bazinga (字符串匹配)
    UVALive 7269 Snake Carpet (构造)
    UVALive 7270 Osu! Master (阅读理解题)
    UVALive 7267 Mysterious Antiques in Sackler Museum (判断长方形)
  • 原文地址:https://www.cnblogs.com/fire909090/p/8882825.html
Copyright © 2011-2022 走看看