logo资料库

通过内部通道ADC_IN17获取到ADC转换值.docx

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
因为内部参考电压 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]
分享到:
收藏