灵动微MM32F003硬件最小系统 --- 单路ADC DMA中断读取芯片内部参考电压例程解析【8】

MM32F003内部有一个1.2V的参考电压,可以通过ADC通道读取。但是可能这个参考电压并不准确。因为使用1.2折算出的系统电压为5.2V,使用1.15V折算的系统电压才是准确的。
下面的例程通过读取芯片内部参考电压,折算出系统供电电压。

1 配置ADC通道

int main(void)
{
    u16 chan, averagenumber = 0;
      Uart_ConfigInit(9600);
    //  SystemInit();
    //  InitSystick();
    //Initialize DMA
    DMAInit();
    ADCSingleChannelInit(ADCchVref);

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);                                      //Start Conversion

    while(1) {
        if(ADCFilterflag) {                                                 //Determine whether the second-order filter is over
            ADCFilterflag = 0;                                              //Clear the filter end flag
            Get_VDDA_Volatge();                                                  //Convert the filtered value to voltage
            ADC_SoftwareStartConvCmd(ADC1, ENABLE);                          //Start Conversion
        }
    }
}

2 通过读取内部参考电压的ADC值折算出供电电压

void Get_VDDA_Volatge(void)
{
    if((ADCFilterValue == 0) || (ADCFilterValue > 4095))
        ADCFilterValue = 948;
    VDDA_Volatge = (4095 / ((float)ADCFilterValue )) * 1.15;
UartSendGroup((u8*)printBuf, sprintf(printBuf, "adc value = 0x%4X \r\n",ADCFilterValue));           
        UartSendGroup((u8*)printBuf, sprintf(printBuf, "powef supply Voltage = %f \r\n",VDDA_Volatge));

}

3 计算内部参考电压

void Get_ADCVolatge(void)
{
    ADCVolatge = ((float)ADCFilterValue / 4095) * REFVOLATGE;
UartSendGroup((u8*)printBuf, sprintf(printBuf, "adc value = 0x%4X \r\n",ADCFilterValue));           
        UartSendGroup((u8*)printBuf, sprintf(printBuf, "ref Voltage = %f \r\n",ADCVolatge));    
}
···

你可能感兴趣的:(灵动微MM32F003硬件最小系统 --- 单路ADC DMA中断读取芯片内部参考电压例程解析【8】)