因为内部参考电压 1.2V 比较稳定,不断通过内部通道 ADC_IN17 获取到 ADC 转换
值,
然后根据公式:(1.2/ADC 转换值) * 4096(12 位精度)
就可以得到 VDDA 的电压
值,从而检测电源,另外如果是想测试其他通道的电压值,直接读取对应通道的 ADC
转换值以后进行相乘就好了:(1.2/ADC 转换值) * 其他通道 ADC 转换值
代码:
[mw_shl_code=c,true]/**
* @brief ADC Configuration
* @param None
* @retval None
*/
static void ADC_Config(void)
{
ADC_InitTypeDef
ADC_InitStructure;
GPIO_InitTypeDef
GPIO_InitStructure;
/* GPIOC Periph clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* ADC1 Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* Configure ADC Channel 0 as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* ADCs DeInit */
ADC_DeInit(ADC1);
/* Initialize ADC structure */
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_Init(ADC1, &ADC_InitStructure);
/* Convert the ADC1 Channel 0 with 239.5 Cycles as sampling time */
ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_239_5Cycles);
ADC_VrefintCmd(ENABLE);
/* 得到基准电压校准值 */
VREFINT_CAL = *(__IO uint16_t *)(0X1FFFF7BA);
/* ADC Calibration */
ADC_GetCalibrationFactor(ADC1);
/* Enable the ADC peripheral */
ADC_Cmd(ADC1, ENABLE);
/* Wait the ADRDY flag */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
/* ADC1 regular Software Start Conv */
ADC_StartOfConversion(ADC1);
}
// 主函数
int main(void)
{
delay_ms(200);
ADC_Config();
UART1_Init();
while(1)
VREFINT_DATA =ADC_GetConversionValue(ADC1);
VDDA_VAL = (3.3*VREFINT_CAL)/VREFINT_DATA;
printf("\n\rVDDA:%.3fV\n\r",VDDA_VAL);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
delay_ms(1000);
{
}
}[/mw_shl_code]