APM32F0XX/STM32F0XX内部参考电压VREFINT反算ADC引脚电压

首先打开极海APM32F030x4x6x8xC 用户手册找到VREFINT。

APM32F0XX/STM32F0XX内部参考电压VREFINT反算ADC引脚电压_第1张图片

 找到内部参考电压 VREFINT为ADC1_IN17通道

APM32F0XX/STM32F0XX内部参考电压VREFINT反算ADC引脚电压_第2张图片

使用VREFINT必须使能VREFEN位

APM32F0XX/STM32F0XX内部参考电压VREFINT反算ADC引脚电压_第3张图片

初始化ADC代码

void ADC_Init(void)
{
    GPIO_Config_T           gpioConfig;
    ADC_Config_T            adcConfig;

    /* Enable GPIOA clock */
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);

    /* ADC channel 0 configuration */
    GPIO_ConfigStructInit(&gpioConfig);
    gpioConfig.mode    = GPIO_MODE_AN;
    gpioConfig.pupd    = GPIO_PUPD_NO;
    gpioConfig.pin     = GPIO_PIN_2;
    GPIO_Config(GPIOA, &gpioConfig);

    /* Enable ADC clock */
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);

    /* ADC configuration */
    ADC_Reset();

    ADC_ConfigStructInit(&adcConfig);
    /* Set resolution*/
    adcConfig.resolution            = ADC_RESOLUTION_12B;
    /* Set scanDir*/
    adcConfig.scanDir               = ADC_SCAN_DIR_UPWARD;
    /* Set convMode continous*/
    adcConfig.convMode              = ADC_CONVERSION_CONTINUOUS;
    /* Set dataAlign*/
    adcConfig.dataAlign             = ADC_DATA_ALIGN_RIGHT;
    /* Set extTrigEdge*/
    adcConfig.extTrigEdge           = ADC_EXT_TRIG_EDGE_NONE;
    /* Set extTrigConv*/
    adcConfig.extTrigConv           = ADC_EXT_TRIG_CONV_TRG0;
    ADC_Config(&adcConfig);

	ADC_EnableVrefint();
	ADC_DisableVbat();
    /* ADC channel Convert configuration */
    ADC_ConfigChannel(ADC_CHANNEL_2, ADC_SAMPLE_TIME_239_5);
    ADC_ConfigChannel(ADC_Channel_Vrefint, ADC_SAMPLE_TIME_239_5);

    /* Config DMA*/
    DMA_Init();

    /* Calibration */
    ADC_ReadCalibrationFactor();

    /* Enable ADC DMA*/
    ADC_EnableDMA();
    ADC_DMARequestMode(ADC_DMA_MODE_CIRCULAR);
    /* Enable ADC */
    ADC_Enable();
}

初始化DMA代码

void DMA_Init(void)
{
    /* DMA Configure */
    DMA_Config_T dmaConfig;

    /* Enable DMA clock */
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_DMA1);

    /* Set Peripheral Address */
    dmaConfig.peripheralAddress = ADC_DR_ADDR;
    /* Set memory Address */
    dmaConfig.memoryAddress = (uint32_t)&adcData;
    /* read from peripheral */
    dmaConfig.direction = DMA_DIR_PERIPHERAL;
    /* size of buffer*/
    dmaConfig.bufferSize = ADC_CH_SIZE;
    /* Disable Peripheral Address increase */
    dmaConfig.peripheralInc = DMA_PERIPHERAL_INC_DISABLE;
    /* Enable Memory Address increase */
    dmaConfig.memoryInc = DMA_MEMORY_INC_ENABLE;
    /* Set peripheral Data Size */
    dmaConfig.peripheralDataSize = DMA_PERIPHERAL_DATASIZE_HALFWORD;
    /* set memory Data Size */
    dmaConfig.memoryDataSize = DMA_MEMORY_DATASIZE_HALFWORD;
    /* Reset Circular Mode */
    dmaConfig.circular = DMA_CIRCULAR_ENABLE;
    /* Disable M2M */
    dmaConfig.memoryTomemory = DMA_M2M_DISABLE;
    /* set priority */
    dmaConfig.priority = DMA_PRIORITY_LEVEL_HIGHT;

    DMA_Config(DMA1_CHANNEL_1, &dmaConfig);

    DMA_Enable(DMA1_CHANNEL_1);
}

debug调试 

void ADC_MultiChannelPolling(void)
{
    float voltage;
    uint8_t index;

 
	voltage = (float)((float)adcData[0] / (float)adcData[1]) * 1.2;
	printf("ADC CH[2] = %d, voltage = %.3f V\r\n", adcData[0], voltage);
	printf("ADC CH[17] = %d, voltage = 1.2f V\r\n", adcData[1]);

    printf("\r\n");
}

主函数

int main(void)
{
    /* COM1 init*/
    APM_MINI_COMInit(COM1);

    /* ADC1 initialization */
    ADC_Init();
    ADC_StartConversion();
	printf("code start\r\n");
    while (1)
    {
        Delay(0x3FFFFF);
        ADC_MultiChannelPolling();
    }
}

串口打印如下

APM32F0XX/STM32F0XX内部参考电压VREFINT反算ADC引脚电压_第4张图片 3.3V的VDD供电,反算出电压3.291V.

你可能感兴趣的:(ST单片机开发,stm32,嵌入式硬件,单片机)