• Home
Name Date Size #Lines LOC

..--

BUILD.gnD12-May-2024783 2117

README_zh.mdD12-May-20243.2 KiB149104

adc_example.cD12-May-20244.6 KiB15989

README_zh.md

1# 小凌派-RK2206开发板基础外设开发——ADC
2
3本示例将演示如何在小凌派-RK2206开发板上使用ADC做按键测试。
4
5![小凌派-RK2206](../../docs/figures/lockzhiner-rk2206.jpg)
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
2324
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
4142
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