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 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