1# 小凌派-RK2206开发板基础外设开发——ADC 2 3本示例将演示如何在小凌派-RK2206开发板上使用ADC做按键测试。 4 5 6 7## 程序设计 8 9### API分析 10 11#### adc_dev_init() 12 13```c 14static unsigned int adc_dev_init(); 15``` 16 17**描述:** 18 19初始化ADC端口和引脚。 20 21**参数:** 22 23无 24 25**返回值:** 26 270为成功,反之为失败。 28 29#### adc_get_voltage() 30 31```c 32static float adc_get_voltage() 33``` 34 35**描述:** 36 37获取当前ADC采集的电压数值。 38 39**参数:** 40 41无 42 43**返回值:** 44 45实际电压数值,单位为V。 46 47### 软件设计 48 49#### adc初始化源代码分析 50 51这部分代码为adc初始化的代码。首先用 `DevIoInit()` 函数将 `GPIO0_PC5`复用为 `SRADC5`。然后调用 `LzSaradcInit()`函数初始化ADC5端口。最后设置寄存器 `GRF_SOC_CON29`的 `bit[4] = 0`,即ADC的基准电压以AVDD(芯片外接地)为准。 52 53```c 54/*************************************************************** 55* 函数名称: adc_dev_init 56* 说 明: 初始化ADC 57* 参 数: 无 58* 返 回 值: 0为成功,反之为失败 59***************************************************************/ 60static unsigned int adc_dev_init() 61{ 62 unsigned int ret = 0; 63 uint32_t *pGrfSocCon29 = (uint32_t *)(0x41050000U + 0x274U); 64 uint32_t ulValue; 65 66 ret = DevIoInit(m_adcKey); 67 if (ret != LZ_HARDWARE_SUCCESS) 68 { 69 printf("%s, %s, %d: ADC Key IO Init fail\n", __FILE__, __func__, __LINE__); 70 return __LINE__; 71 } 72 ret = LzSaradcInit(); 73 if (ret != LZ_HARDWARE_SUCCESS) { 74 printf("%s, %s, %d: ADC Init fail\n", __FILE__, __func__, __LINE__); 75 return __LINE__; 76 } 77 78 /* 设置saradc的电压信号,选择AVDD */ 79 ulValue = *pGrfSocCon29; 80 ulValue &= ~(0x1 << 4); 81 ulValue |= ((0x1 << 4) << 16); 82 *pGrfSocCon29 = ulValue; 83 84 return 0; 85} 86``` 87 88#### ADC读数据操作 89 90ADC模块提供 `LzSaradcReadValue()`读取ADC数据。具体ADC读数据数据的操作如下: 91 92```c 93ret = LzSaradcReadValue(ADC_CHANNEL, &data); 94if (ret != LZ_HARDWARE_SUCCESS) 95{ 96 printf("%s, %s, %d: ADC Read Fail\n", __FILE__, __func__, __LINE__); 97 return 0.0; 98} 99``` 100 101#### ADC数据计算成实际电压操作 102 103ADC模块采用10位的ADC采集寄存器,可测试电压范围为0~3.3V,所以ADC采集数值换算为实际电压计算公司为: 104 105```r 106实际电压 = (ADC采集数值 / 1024) * 3.3V 107``` 108 109注意:实际电压是 `float`类型,源代码计算要规范。具体源代码如下所示: 110 111```c 112return (float)(data * 3.3 / 1024.0) 113``` 114 115## 编译调试 116 117### 修改 BUILD.gn 文件 118 119修改 `vendor/lockzhiner/lingpi/sample` 路径下 BUILD.gn 文件,指定 b1_adc 参与编译。 120 121```r 122"b1_adc", 123``` 124 125在主目录下输入编译命令。 126 127```shell 128hb build -f 129``` 130 131### 运行结果 132 133示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,显示如下: 134 135```r 136***************Adc Example************* 137vlt:3.297V 138***************Adc Example************* 139vlt:3.297V 140***************Adc Example************* 141vlt:3.297V 142***************Adc Example************* 143vlt:3.297V 144***************Adc Example************* 145vlt:3.297V 146***************Adc Example************* 147vlt:3.297V 148``` 149