代码如下
void ADC_init(void) { // 1. 使能时钟 rcu_periph_clock_enable(RCU_GPIOF); rcu_periph_clock_enable(RCU_ADC2); adc_clock_config(ADC_ADCCK_PCLK2_DIV8); // 2. 配置 为模拟输入 gpio_mode_set(GPIOF, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_6); // 3. 配置 ADC 基本参数 adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT); // 独立模式 /* ADC contineous function disable */ adc_special_function_config(ADC2, ADC_CONTINUOUS_MODE, DISABLE); // 单次转换 /* ADC scan mode disable */ adc_special_function_config(ADC2, ADC_SCAN_MODE, DISABLE); // 不扫描 adc_resolution_config(ADC2, ADC_RESOLUTION_12B); // 12位分辨率 adc_data_alignment_config(ADC2, ADC_DATAALIGN_RIGHT); // 数据右对齐 adc_channel_length_config(ADC2, ADC_ROUTINE_CHANNEL, 1); // 单次转换通道数 adc_external_trigger_config(ADC2, ADC_ROUTINE_CHANNEL, EXTERNAL_TRIGGER_DISABLE); // 外部触发禁止 // 4. 设置采样时间和通道 adc_routine_channel_config(ADC2, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_15); //// 配置ADC规则通道 // 5. 启用 ADC 并校准 adc_enable(ADC2); delay_2us(1000); adc_calibration_enable(ADC2); }
uint16_t adc_channel_sample(void) { /* ADC software trigger enable */ adc_software_trigger_enable(ADC2, ADC_ROUTINE_CHANNEL); /* wait the end of conversion flag */ while (!adc_flag_get(ADC2, ADC_FLAG_EOC)); /* clear the end of conversion flag */ adc_flag_clear(ADC2, ADC_FLAG_EOC); /* return regular channel sample value */ return (adc_routine_data_read(ADC2)); } uint16_t adc_channel_value(void) { uint32_t adc_value = 0; uint32_t i = 0; for (i = 0; i < 5; i++) { adc_value += adc_channel_sample(); } return (adc_value / 5); } 转换 ADC_value = adc_channel_value();
adc=((double)(ADC_value*3.3)/4096);
printf("adc:%.2lfV VINSampledvalues:%d\r\n",adc,ADC_value);
|