GD32F30x ADC单通道采样例程

需求:获取PC0引脚的电压值,PC0对应ADC0_channel10

1.初始化引脚的adc功能

//adc初始化
void myadc_init(void){
  rcu_periph_clock_enable(RCU_GPIOC);
  rcu_periph_clock_enable(RCU_ADC0);
  rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
  gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
  
  //adc设置独立模式
  adc_mode_config(ADC_MODE_FREE);
  
  //adc数据右对齐
  adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
  
  //adc通道长度
  adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1U);
  
  //adc软件触发源
  adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE); 
  
  //adc外部触发
  adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);

  //adc使能
  adc_enable(ADC0);
  delay_1ms(1U);

  //adc校准
  adc_calibration_enable(ADC0);
}

2.获取指定ADC通道电压值

//adc通道采样
float adc_channel_sample(uint8_t channel)
{
    /* ADC regular channel config */
    adc_regular_channel_config(ADC0, 0U, channel, ADC_SAMPLETIME_7POINT5);
    /* ADC software trigger enable */
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);

    /* wait the end of conversion flag */
    while(!adc_flag_get(ADC0, ADC_FLAG_EOC));
    /* clear the end of conversion flag */
    adc_flag_clear(ADC0, ADC_FLAG_EOC);
    /* return regular channel sample value */
    return (adc_regular_data_read(ADC0)*3.3/4096);
}

3.主函数运行

int main(void)
{
  systick_config();
  myadc_init();
  while(1)
  {
    delay_1ms(5000);
    printf("verf=%.2f\r\n",adc_channel_sample(ADC_CHANNEL_10));
  }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值