• Home
Name Date Size #Lines LOC

..--

BUILD.gnD12-May-2024838 2219

README.mdD12-May-20243.3 KiB9976

adc_example.cD12-May-20242.4 KiB9955

README.md

1# BearPi-HM_Nano开发板基础外设开发——ADC采样
2本示例将演示如何在BearPi-HM_Nano开发板上通过按下按键改变GPIO口的电压,并使用ADC读取GPIO的电压值。
3
4## ADC API分析
5本案例主要使用了以下API完成ADC采样的功能。
6### IoTAdcRead()
7```c
8unsigned int IoTAdcRead(unsigned int channel, unsigned short *data, IotAdcEquModelSel equModel, IotAdcCurBais curBais, unsigned short rstCnt);
9```
10 **描述:**
11
12根据输入参数从指定的ADC通道读取一段采样数据。
13
14
15**参数:**
16
17|参数名|描述|
18|:--|:------|
19| channel | 表示ADC通道。  |
20| data | 表示读取的ADC数据保存地址。 |
21| equModel | 表示平均算法模式。 |
22| curBais | 表示模拟电源控制。 |
23| rstCnt | 表示从配置采样到启动采样的延时时间计数,一次计数是334ns,其值需在0~0xFF0之间。|
24
25
26## 硬件设计
27本案例将使用板载用户按键F1来模拟GPIO口电压的变化。通过查看芯片手册可知GPIO_11对应的是 ADC Channel 5,所以需要编写软件去读取ADC Channel 5的电压,程序设计时先将GPIO_11上拉,使GPIO_11的电压一直处于高电平,当按键按下时GPIO_11接地,此时GPIO_11的电压变为 0 V。
28
29![buttoncircuit](../../docs/figures/B4_basic_adc/buttoncircuit.png "buttoncircuit")
30
31## 软件设计
32
33**主要代码分析**
34
35 ADC测试任务,主要的功能实现函数为GetVoltage(),
36该函数通过使用IoTAdcRead()函数来读取 ADC Channel 5 的数值并存储在data中, `IOT_ADC_EQU_MODEL_8` 表示8次平均算法模式,`IOT_ADC_CUR_BAIS_DEFAULT` 表示默认使用自动识别模式,最后通过算式 `data * 1.8 * 4 / 4096.0` 计算出实际的电压值。
37```c
38/**
39 * @brief get ADC sampling value and convert it to voltage
40 *
41 */
42static float GetVoltage(void)
43{
44    unsigned int ret;
45    unsigned short data;
46
47    ret = IoTAdcRead(ADC_CHANNEL, &data, IOT_ADC_EQU_MODEL_8, IOT_ADC_CUR_BAIS_DEFAULT, 0xff);
48    if (ret != IOT_SUCCESS) {
49        printf("ADC Read Fail\n");
50    }
51
52    return (float)data * ADC_VREF_VOL * ADC_COEFFICIENT / ADC_RATIO;
53}
54```
55
56
57## 编译调试
58
59### 修改 BUILD.gn 文件
60
61
62修改`device\board\bearpi\bearpi_hm_nano\app` 路径下 BUILD.gn 文件,指定 `adc_example` 参与编译。
63
64```r
65#"B1_basic_led_blink:led_example",
66#"B2_basic_button:button_example",
67# "B3_basic_pwm_led:pwm_example",
68"B4_basic_adc:adc_example",
69#"B5_basic_i2c_nfc:i2c_example",
70# "B6_basic_uart:uart_example",
71```
72
73
74### 运行结果
75
76示例代码编译烧录后,按下开发板的RESET按键,通过串口助手查看日志,当F1按键未按下时采集到的电压为3.3V左右,当按键按下时,电压变为0.2V左右。
77```c
78=======================================
79*************ADC_example***********
80=======================================
81vlt:3.371V
82=======================================
83*************ADC_example***********
84=======================================
85vlt:3.371V
86=======================================
87*************ADC_example***********
88=======================================
89vlt:3.373V
90=======================================
91*************ADC_example***********
92=======================================
93vlt:0.248V
94=======================================
95*************ADC_example***********
96=======================================
97vlt:0.244V
98```
99