GD32的ADC有很多模式,这里教大家使用最简单的软件触发读取ADC,我使用的芯片是 GD32F350K8U6
使用步骤
1.初始化IO引脚设置为模拟输入模式
2.初始ADC时钟和配置ADC
3.软件触发读取ADC值
4.将ADC值转换成电压值
我这里采用PA5进行ADC的channel_5通道
1.初始IO引脚
/*初始化时钟*/
rcu_periph_clock_enable(RCU_GPIOA);
/* 配置读取ADC引脚 */
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, ADC_GPIO_PIN);
2.配置ADC相关
void ADC_Init(void)
{
/* 使能ADC时钟 */
rcu_periph_clock_enable(RCU_ADC);
/* 配置ADC时钟来源 这里使用APB2时钟的六分频*/
rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);
/* 数据对齐方式 右对齐*/
adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
/* 配置使用ADC规则通道,使用1个 */
adc_channel_length_config( ADC_REGULAR_CHANNEL, 1U);
/* 配置ADC触发方式:这里使用软件触发 */
adc_external_trigger_source_config( ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);
/*使能ADC软件触发 */
adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
/* ADC分辨率 12B */
adc_resolution_config(ADC_RESOLUTION_12B);
/* ADC外部触发配置 */
adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);
/* 使能ADC */
adc_enable();
/* 这个延时是为了让ADC稳定*/
delay_1ms(1U);
/* 进行ADC自校准 */
adc_calibration_enable();
}
3.设置软件触发
//channel参数为ADC通道:ADC_CHANNEL_x x = 0...15
uint16_t ADC_Get_Channel(uint8_t channel)
{
/* 配置DAC通道和转换时间 */
adc_regular_channel_config(0U, channel, ADC_SAMPLETIME_239POINT5);
/* 等待ADC转换完成 */
while(!adc_flag_get(ADC_FLAG_EOC));
/* 清除转换完成标志位 */
adc_flag_clear(ADC_FLAG_EOC);
/* 返回ADC的值 */
return (adc_regular_data_read() & 0xfff);
}
除了单次获取之外,还可以采用多次读取然后取平均值
//channel参数为ADC通道:ADC_CHANNEL_x x = 0...15
uint16_t adc_Channel_Sample_Average(uint8_t channel)
{
uint32_t adc_raw = 0;
uint8_t degree = 3; //读的次数的幂 2^3
for(int i = 0;i < (1 << degree);i++)
{
//读取ADC次数
adc_raw += ADC_Get_Channel(channel);
delay_1ms(2);
}
//这里循环8次读取,因此 >>3位就是除以8
adc_raw >>= degree;
return adc_raw;
}
4.将ADC值转换成电压值
芯片使用的是3.3V供电,根据上面的配置ADC,精度为12位可以得到
电压值 = ADC数值 * 3.3 / 4096
Vin = adc_value * 3.3 /4096
void main(void)
{
ADC_Init();
float Vin = 0,tmp_adc_value;
uint16_t adc_value = 0;
while(1)
{
//读取ADC数值并取平均值
adc_value = adc_Channel_Sample_Average(ADC_CHANNEL_5);
//将值转换成float计算
tmp_adc_value = (float)adc_value;
//根据公式进行转换
Vin = tmp_adc_value * 3.3f / 4096.0f;
//打印
printf("voltage :%.3f",Vin);
}
}
**