1、计算
V = Vout * Vref / 2^n;
V:检测电压(外部电路输入到MCU引脚的电压)
Vout:ADC检测值(目标值)
Vref :参考电压
n:ADC位数
举例:
检测BAT_DET的电压,VBAT为电路输入电压,BAT_DET = VBAT*(200k)/(200k+1m);
以参考电压5v为例,该电路能测量最大电压为30v。
2、配置代码
void AdcInit(void)
{
//启用外设时钟功能
rcu_periph_clock_enable(RCU_ADC);
rcu_periph_clock_enable(RCU_GPIOA);
rcu_adc_clock_config(RCU_ADCCK_APB2_DIV4);
//设置GPIO模式
gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_5);
//配置通道数
adc_channel_length_config(ADC_REGULAR_CHANNEL,1);
//选择通道
adc_regular_channel_config(0,ADC_CHANNEL_5,ADC_SAMPLETIME_55POINT5);
//ADC对齐设置为右对齐
adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
//配置 ADC 为连续模式(扫描模式只在 DMA 模式下使用)
adc_special_function_config(ADC_CONTINUOUS_MODE,ENABLE);
//ADC使能
adc_enable();
Delay_us(20000);
//校准和复位校准 ADC
adc_calibration_enable();
}
uint16_t Adc_ReadValue(void)
{
uint16_t Value=0;
adc_software_trigger_enable(ADC_REGULAR_CHANNEL);//软件触发 ADC 转换开始
if(SET == adc_flag_get(ADC_FLAG_STRC))
{
//Delay_us(100000);
if(SET == adc_flag_get(ADC_FLAG_EOC))
{
//AD值
Value = adc_regular_data_read();
}
adc_flag_clear(ADC_FLAG_STRC|ADC_FLAG_EOC);
}
return Value;
}