ADC - int

本 demo 主要演示 adc 中断模式下读取电压值。默认扫描通道 0 ~ 通道10。 需要注意,有些芯片不一定支持全部通道

硬件连接

本 demo 使用到的 gpio 参考 board_adc_gpio_init

软件实现

更详细的代码请参考 examples/peripherals/adc/adc_int

1board_init();
  • board_init 中会开启 ADC IP 时钟,并选择 ADC 时钟源和分频(ADC 时钟必须小于等于 500K)。

1board_adc_gpio_init();
  • 配置相关引脚为 ADC 功能

 1adc = bflb_device_get_by_name("adc");
 2
 3/* adc clock = XCLK / 2 / 32 */
 4struct bflb_adc_config_s cfg;
 5cfg.clk_div = ADC_CLK_DIV_32;
 6cfg.scan_conv_mode = true;
 7cfg.continuous_conv_mode = false;
 8cfg.differential_mode = false;
 9cfg.resolution = ADC_RESOLUTION_16B;
10cfg.vref = ADC_VREF_3P2V;
11
12bflb_adc_init(adc, &cfg);
  • 获取 adc 句柄,并初始化 adc 配置,设置 adc 采样频率为 500K

1bflb_adc_channel_config(adc, chan, TEST_ADC_CHANNELS);
  • 配置 adc 通道信息,使用的对数根据 TEST_ADC_CHANNELS 可配,默认开启通道 0 ~ 10,根据 board_adc_gpio_init 需要选择性关闭其他通道。

1bflb_adc_rxint_mask(adc, false);
2bflb_irq_attach(adc->irq_num, adc_isr, NULL);
3bflb_irq_enable(adc->irq_num);
  • 调用 bflb_adc_rxint_mask 打开 adc 转换完成中断

  • 调用 bflb_irq_attach 连接中断处理函数

  • 调用 bflb_irq_enable 使能中断

 1for (size_t i = 0; i < TEST_COUNT; i++) {
 2    read_count = 0;
 3    bflb_adc_start_conversion(adc);
 4
 5    while (read_count < TEST_ADC_CHANNELS) {
 6        bflb_mtimer_delay_ms(1);
 7    }
 8    for (size_t j = 0; j < TEST_ADC_CHANNELS; j++) {
 9        struct bflb_adc_result_s result;
10        printf("raw data:%08x\r\n", raw_data[j]);
11        bflb_adc_parse_result(adc, (uint32_t *)&raw_data[j], &result, 1);
12        printf("pos chan %d,%d mv \r\n", result.pos_chan, result.millivolt);
13    }
14    bflb_adc_stop_conversion(adc);
15    bflb_mtimer_delay_ms(100);
16}
  • 调用 bflb_adc_start_conversion(adc) 启用 adc 的转换

  • 调用 bflb_adc_parse_result(adc, (uint32_t *)&raw_data[j], &result, 1) 对 adc 的转换结果进行解析,解析的值保存到 result 结构体中

  • 调用 bflb_adc_stop_conversion(adc) 停止 adc 转换

编译和烧录

参考 环境搭建

实验现象

打印 raw data,通道号以及通道对应的电压值。