2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
|
void adcGPIOConfig(void)
{ GPIO_InitTypeDef gpioInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能Port A 时钟 gpioInitStruct.GPIO_Speed = GPIO_Speed_2MHz; gpioInitStruct.GPIO_Pin = GPIO_Pin_4; gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &gpioInitStruct); //GPIO口别弄错 } void adcModeConfig(void) { ADC_InitTypeDef adcInitStruct; adcInitStruct.ADC_Mode = ADC_Mode_Independent; adcInitStruct.ADC_ScanConvMode = DISABLE; adcInitStruct.ADC_ContinuousConvMode = DISABLE;// adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right; adcInitStruct.ADC_NbrOfChannel = 1; ADC_Init(ADC1,&adcInitStruct); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟 /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /*复位校准寄存器 */ ADC_ResetCalibration(ADC1); /*等待校准寄存器复位完成 */ while(ADC_GetResetCalibrationStatus(ADC1)); /* ADC校准 */ ADC_StartCalibration(ADC1); /* 等待校准完成 */ while(ADC_GetCalibrationStatus(ADC1)); ADC_TempSensorVrefintCmd(ENABLE); /* 由于没有采用外部触发,所以使用软件触发ADC转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); } void adcInit(void) { adcGPIOConfig(); adcModeConfig(); } float getPowerAD(void) { uint16_t ADC_ConvertedValue; float ADC_ConvertedValueLocal; ADC_Cmd(ADC1, ENABLE); ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 ADC_ConvertedValue = ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果 ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD值 ADC_ClearFlag(ADC1, ADC_FLAG_EOC); //清除转化结束标志位 return ADC_ConvertedValueLocal; } |
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』