ADC - poll

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

硬件连接

本 demo 使用到的 gpio 参考 board_adc_gpio_init

软件实现

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

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 需要选择性关闭其他通道。

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

  • 调用 bflb_adc_get_count(adc) 读取转换完成的个数

  • 调用 bflb_adc_read_raw(adc) 读取一次 adc 的转换值

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

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

编译和烧录

参考 环境搭建

实验现象

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