天天看点

【GD32】GD32读取ADC数据

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);
    }
    
    
}
           

**