关于ADC采样这部分,分为两讲,这一篇讲简单版的采样。
下一篇讲复杂版(精度更高)的采样
简单版的采样比较简单:
大概分为四个部分。
1、ADC初始化
2、获取ADC通道数据
3、获取外部输入电压值
4、转换
1、ADC初始化
void ADC0_Init_Concig(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_ADC0);
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_1);
adc_mode_config(ADC_MODE_FREE); //独立模式
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); //右对齐
adc_resolution_config(ADC0,ADC_RESOLUTION_12B); //12位分辨率
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1U); //通道长度
adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL,
ADC0_1_2_EXTTRIG_REGULAR_NONE); //软件触发
adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); //启用软件触发
adc_enable(ADC0);
adc_calibration_enable(ADC0); //复位校准
}
2、获取ADC通道信息
u16 ADC0_Channel_Sample(u8 channel)
{
adc_regular_channel_config(ADC0, 0U, channel, ADC_SAMPLETIME_7POINT5); // 配置DAC通道和转换时间
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); //启用软件触发
while(!adc_flag_get(ADC0, ADC_FLAG_EOC)); // 等待ADC转换完成
adc_flag_clear(ADC0, ADC_FLAG_EOC); //清除转换完成标志位
return (adc_regular_data_read(ADC0)); //返回ADC值
}
3、获取转换值
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=ADC0_Channel_Sample(ch);
}
return temp_val/times;
}
4、获取电压值
u16 Get_Voltage(u8 ch)
{
u32 adc_bat=0;
u16 vbat =0;
switch(ch)
{
case CH_VLA1: //
adc_bat = Get_Adc_Average(VLA1,4);
vbat = adc_bat*363/4096;
break;
case CH_VoutA1: //
adc_bat = Get_Adc_Average(VoutA1,4);
vbat = adc_bat*363/4096;
break;
default:
break;
}
return vbat;
}