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,通道号以及通道对应的电压值。