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