×
嵌入式 > 技术百科 > 详情

STM32F0两路AD配置参考

发布时间:2020-12-17 发布时间:
|

使用两路PA.1 (ADC Channel 1) 和 PA.4 (ADC Channel 4),配置方式如代码所示。使用的芯片是STM32F030C8。


需定义两个变量

static __IO uint16_t RegularConvertedAdcValue[ADC_CHANNEL_NUM];     // ADC1转换的电压值通过MDA方式传到flash

static float AdcValueConvertToVoltage;             // 局部变量,用于存从flash读到的电压值


然后上电初始化时调用

void ADCD_Init(void)

{

    GPIO_Config();

    DMA_Config();

    ADC_Config();

}


通过以下方式可以打印看到AD值和电压转换值。


    printf("ADC Value[0] = %d rn", RegularConvertedAdcValue[0]);

    AdcValueConvertToVoltage = (((float)RegularConvertedAdcValue[0] / 4096) * 3.3);  /* 2^12 = 4096, Vref = 3.3V */

    printf("  Voltage[0] = %2.2f Vrn", AdcValueConvertToVoltage);


    printf("ADC Value[1] = %d rn", RegularConvertedAdcValue[1]);

    AdcValueConvertToVoltage = (((float)RegularConvertedAdcValue[1] / 4096) * 3.3);  /* 2^12 = 4096, Vref = 3.3V */

    printf("  Voltage[1] = %2.2f Vrn", AdcValueConvertToVoltage);


    printf("ADC Value[2] = %d rn", RegularConvertedAdcValue[2]);

    AdcValueConvertToVoltage = (((float)RegularConvertedAdcValue[2] / 4096) * 3.3);  /* 2^12 = 4096, Vref = 3.3V */

    printf("  Voltage[2] = %2.2f Vrn", AdcValueConvertToVoltage);


以下是初始化代码,供参考。

static void GPIO_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;


    /* Enable the GPIOA Clock */

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);


    /* Configure PA.1 (ADC Channel1) & PA.4 (ADC Channel4) in analog mode */

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1 | GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

}


static void DMA_Config(void)

{

    DMA_InitTypeDef DMA_InitStructure;


    /* Enable DMA1 clock */

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    //DMA1通道1配置

    DMA_DeInit(DMA1_Channel1);

    //外设地址

    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;

    //内存地址

    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&RegularConvertedAdcValue;

    //DMA传输方向单向

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

    //设置DMA在传输时缓冲区的长度

    DMA_InitStructure.DMA_BufferSize = 2;

    //设置DMA的外设递增模式,一个外设

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    //设置DMA的内存递增模式

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

    //外设数据字长

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

    //内存数据字长

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

    //设置DMA的传输模式:连续不断的循环模式

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

    //设置DMA的优先级别

    DMA_InitStructure.DMA_Priority = DMA_Priority_High;

    //设置DMA的2个memory中的变量互相访问

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;


    DMA_Init(DMA1_Channel1, &DMA_InitStructure);


    /* Enable DMA1 Channel1 */

    DMA_Cmd(DMA1_Channel1, ENABLE);

}


static void ADC_Config(void)

{

    ADC_InitTypeDef  ADC_InitStructure;


    /* ADC1 DeInit */

    ADC_DeInit(ADC1);


    /* Load ADC default value */

    ADC_StructInit(&ADC_InitStructure);


    /* Enable ADC1 clock */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);


    //转换分辨率

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

    //连续转换

    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

    //外部触发禁止

    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

    //ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO;

    //数据右对齐

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

    //扫描方向

    ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;


    ADC_Init(ADC1, &ADC_InitStructure);


    /* ADC1 regular channel1 configuration */

    ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_55_5Cycles);

    ADC_ChannelConfig(ADC1, ADC_Channel_4, ADC_SampleTime_55_5Cycles);


    /* ADC Calibration */

    ADC_GetCalibrationFactor(ADC1);


    /* ADC DMA request in Circular mode */

    ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);


    /* Enable ADC DMA request */

    ADC_DMACmd(ADC1, ENABLE);


    /* Enable ADC1 */

    ADC_Cmd(ADC1, ENABLE);


    /* Wait until the ADC enable falg is set to start conversion */

    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));


    /* Start ADC1 Software Conversion */

    ADC_StartOfConversion(ADC1);

}

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Semtech的LoRa技术携手Chipsafer将牧场连接至云端