ADC - vbat
本 demo 主要演示 adc 测量芯片 VDD33 的电压值。
软件实现
更详细的代码请参考 examples/peripherals/adc/adc_vbat
1board_init();
board_init
中会开启 ADC IP 时钟,并选择 ADC 时钟源和分频(ADC 时钟必须小于等于 500K)。
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 = false;
7cfg.continuous_conv_mode = false;
8cfg.differential_mode = false;
9cfg.resolution = ADC_RESOLUTION_16B;
10cfg.vref = ADC_VREF_3P2V;
11
12struct bflb_adc_channel_s chan;
13
14chan.pos_chan = ADC_CHANNEL_VABT_HALF;
15chan.neg_chan = ADC_CHANNEL_GND;
16
17bflb_adc_init(adc, &cfg);
获取 adc 句柄,并初始化 adc 配置,设置 adc 采样频率为 500K。
1bflb_adc_channel_config(adc, chan, 1);
配置 adc 通道信息。
1bflb_adc_vbat_enable(adc);
开启 vbat 功能。
1struct bflb_adc_result_s result;
2for (uint16_t i = 0; i < 10; i++) {
3 bflb_adc_start_conversion(adc);
4 while (bflb_adc_get_count(adc) == 0) {
5 bflb_mtimer_delay_ms(1);
6 }
7 uint32_t raw_data = bflb_adc_read_raw(adc);
8
9 bflb_adc_parse_result(adc, &raw_data, &result, 1);
10 printf("vBat = %d mV\r\n", (uint32_t)(result.millivolt * 2));
11 bflb_adc_stop_conversion(adc);
12
13 bflb_mtimer_delay_ms(500);
14}
调用
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 转换
编译和烧录
参考 环境搭建
实验现象
打印芯片 VDD33 的电压值。