RVB2601开发板ADC读取实验 - 清风飘雪

简介: RVB2601开发板ADC读取实验,串口打印输出,输出电压值单位:mV

1. 前言

利用RVB2601板实现模拟量读取并串口打印,输出电压值单位:mV。

2. 硬件配置

ADC_VREFP与3.3V连接,ADC_VREFN与GND连接,将原开发板CH2601_PA4端子帽拔掉,断开与LED_BULE连接,模拟量(可调电阻分压值)与CH2601_PA4端子连接。

备注:旁边引脚开发板丝印PA6,实际PA25,同时“RVB2601应用开发实战系列二: 跑马灯”一文原理图引用也错误。

3. 剑池CDK下载ch2601_gui_demo例程

3.1、新建工程:

打开CDK,点击HOME图标,点击右上角新建工程。

3.2、搜索工程

搜索ch2601_gui_demo,然后点击创建工程,如下图所示:

3.3、输入工程名:

输入“ch2601_adc”,然后点击下载方案:

3.4、激活工程:

由于我下载了多个工程,需要在ch2601_adc上右击,选择“Set As Active”,激活。

4、修改工程

4.1、创建adc.c文件到工程:

4.2、添加代码:

在此感谢郭昊天,刚接触这个CDK,没注意到配置文件“board_config.h”改了AD端口,还是按照芯片管脚定义来,导致数据一致不对:

1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <unistd.h>
4. #include <time.h>
5. #include <aos/aos.h>
6. #include "app_config.h"
7. #include "app_init.h"
8. #include "csi_config.h"
9. #include "hw_config.h"
10. 
11. #include "board_config.h"
12. #include <drv/pin.h>
13. #include <drv/adc.h>
14. #include <drv/common.h>
15. 
16. static csi_adc_t  adc;
17. void adc_init()
18. {
19. 
20.     csi_error_t ret;
21.     csi_pin_set_mux(EXAMPLE_ADC_CH1, PA4_ADC_A2);
22. 
23.     ret = csi_adc_init(&adc, 0);
24. 
25.     if (ret != CSI_OK) 
26.     {
27.       printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
28. 
29.      }
30. 
31. 
32.     /* Configure frequency divsion, this value can be one of(4 8 16 32 64 128) */
33.     uint32_t  freq_value = csi_adc_freq_div(&adc, 128);
34. 
35.     printf("get freq_value: %d\n", freq_value);
36. 
37. 
38.     /* Configure sampling time */
39.     ret = csi_adc_sampling_time(&adc, 2);
40.     if (ret != CSI_OK) 
41.     {
42.       printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
43. 
44.     }
45. 
46.     /* Enable channel */
47.     ret = csi_adc_channel_enable(&adc, 1, true);
48.     if (ret != CSI_OK) 
49.     {
50.       printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
51. 
52.     }
53. 
54.     /* Trigger new conversion */
55.     ret = csi_adc_start(&adc);
56.     if (ret != CSI_OK) 
57.     {
58.       printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
59. 
60.     }
61. 
62.     /* Read result */
63.     int32_t data = csi_adc_read(&adc);
64. 
65.     printf("get adc result: %d\n", data);
66. 
67.     printf("the voltage is: %d mV\n", data*3300/4096);
68. 
69.     /* Uninit adc */
70.     csi_adc_uninit(&adc);
71. 
72. }
73.

4.3、修改初始化文件

app_init.h添加void adc_init();

4.4、更改main.c文件:

1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <unistd.h>
4. #include <time.h>
5. #include <aos/aos.h>
6. #include "aos/cli.h"
7. 
8. #include "app_init.h"
9. #include "lvgl.h"
10. #include "lv_label.h"
11. #include "oled.h"
12. 
13. #include "board_config.h"
14. #include "drv/gpio_pin.h"
15. #include <drv/pin.h>
16. #include <drv/adc.h>
17. 
18. /*********************
19.  *      DEFINES
20.  *********************/
21. #define TAG "app"
22. 
23. /**********************
24.  *      TYPEDEFS
25.  **********************/
26. 
27. /**********************
28.  *  STATIC PROTOTYPES
29.  **********************/
30. // adc
31. static void adc_lvgl_task(void *arg);
32. 
33. 
34. /**********************
35.  *   GLOBAL FUNCTIONS
36.  **********************/
37. 
38. 
39. static void adc_lvgl_task(void *arg);
40. 
41. #include "csi_core.h"
42. /**
43.  * main
44.  */
45. int main(void)
46. {
47.     board_yoc_init();
48. 
49.     aos_task_new("adc", adc_lvgl_task, NULL, 10 * 1024);
50.     return 0;
51. }
52. 
53. static void gui_label_create(void)
54. {
55.     lv_obj_t *p = lv_label_create(lv_scr_act(), NULL);
56.     lv_label_set_long_mode(p, LV_LABEL_LONG_BREAK);
57.     lv_label_set_align(p, LV_LABEL_ALIGN_CENTER);
58.     lv_obj_set_pos(p, 0, 4);
59.     lv_obj_set_size(p, 128, 60);
60.     lv_label_set_text(p, "THEAD RISC-V\nADC \nDEMO");
61. }
62. 
63. static void adc_lvgl_task(void *arg)
64. {
65.     lv_init();
66.     /*Initialize for LittlevGL*/
67.     oled_init();
68.     adc_init();
69. 
70.     /*Select display 1*/
71.     // demo_create();
72.     gui_label_create();
73. 
74.     while (1) 
75.     {
76.         /* Periodically call the lv_task handler.
77.          * It could be done in a timer interrupt or an OS task too.*/
78.         lv_task_handler();
79. 
80.         aos_msleep(5);
81.         lv_tick_inc(1);
82.     }
83. }

4.5、编译,下载、运行:

5、小结:

初次使用,有不到之处还请各位大佬指正、海涵!
相关文章
|
机器学习/深度学习 人工智能 自然语言处理
提升软件测试效率与质量:AI驱动的自动化测试策略
【2月更文挑战第19天】 在快速迭代的软件发展环境中,传统的手动测试方法已无法满足高效率和高质量的要求。本文探讨了人工智能(AI)技术如何革新现有的软件测试流程,通过引入AI驱动的自动化测试策略,旨在提高测试覆盖率,减少人为错误,优化资源分配,并缩短产品上市时间。我们将分析AI在识别潜在缺陷、生成测试用例、执行测试以及结果分析中的应用,并讨论实施这些策略时可能遇到的挑战和限制。
1181 3
|
9月前
|
存储 编解码 搜索推荐
课时10:阿里云视频服务
阿里云视频服务Apsara Video为企业提供一站式视频解决方案,涵盖开发、上传、转码、存储、分发和播放全流程。平台支持点播、直播等业务,零编码搭建快速高效,具备窄带高清、画质重生等先进技术,确保高质量视频传输。同时,丰富的安全防护工具保障内容安全,按需付费模式降低成本,助力企业轻松构建个性化视频应用。
233 0
|
10月前
|
存储 XML 图形学
Unity保存数据
在Unity中保存场景数据涉及数据收集、序列化和存储。数据收集包括游戏对象的基本信息(如位置、旋转、缩放、名称和标签)及组件数据(如渲染、物理和自定义脚本组件)。接着,通过序列化将数据转换为可存储格式。示例代码展示了如何使用XML保存场景中的游戏对象及其属性。
|
监控 关系型数据库 MySQL
守护进程到底是什么?如何创建?(图文并茂,你不得不看的一篇文章)
**守护进程(Daemon Process)详解**:守护进程是后台运行的无终端关联的系统进程,常在启动时启动,提供持续服务,如网络服务、日志记录和定时任务。其特点包括脱离终端、后台运行、持久服务、资源管理和错误处理。创建守护进程涉及重定向文件描述符、创建新会话、改变工作目录等步骤。`ps` 和 `top` 命令用于查看守护进程,前者提供进程快照,后者显示实时资源使用情况。
1453 0
|
域名解析 缓存 安全
2024最新Cloudways主机注册和使用教程
Cloudways 是一家提供基于云的托管服务的公司,专注于简化网站管理和运行,尤其适合WordPress。Cloudways界面直观,无需复杂设置即可快速搭建WordPress站点,包括高级缓存、Breeze插件和Cloudflare CDN集成。服务包括7*24小时客服支持,3天免费试用,按小时计费,无隐藏费用,支持多种云平台选择,以及一键安装多种应用程序和SSL证书。在注册和使用过程中,用户需要准备Visa/Mastercard信用卡,并可能需要通过外贸上网工具访问。Cloudways 提供自动备份和灵活的服务器配置,适合不同技术水平的用户。
602 0
2024最新Cloudways主机注册和使用教程
|
图形学
【制作100个unity游戏之26】unity2d横版卷轴动作类游戏7(附带项目源码)
【制作100个unity游戏之26】unity2d横版卷轴动作类游戏7(附带项目源码)
441 1
|
监控 Java 中间件
FGC频繁导致CPU 飙升定位及JVM配置优化总结
FGC频繁导致CPU 飙升定位及JVM配置优化总结
478 0
|
消息中间件 运维 监控
阿里云中间件、aPaaS 产品与解决方案介绍|学习笔记
快速学习阿里云中间件、aPaaS 产品与解决方案介绍
1224 88
阿里云中间件、aPaaS 产品与解决方案介绍|学习笔记
pycharm使用Anaconda中的虚拟环境【我的入门困惑二】
pycharm使用Anaconda中的虚拟环境【我的入门困惑二】
|
设计模式 Kubernetes Cloud Native
Kubernetes 中 4 种容器设计模式
Kubernetes 中 4 种容器设计模式
Kubernetes 中 4 种容器设计模式