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、小结:

初次使用,有不到之处还请各位大佬指正、海涵!
相关文章
|
7月前
|
弹性计算 运维 关系型数据库
阿里云服务器2核2G、2核4G、4核8G最低价格及实例区别和选购策略参考
2026年阿里云服务器2核2G配置中,轻量应用服务器抢购价38元/年,经济型e实例99元/年;u1实例2核4G配置199元/年;u2a实例4核8G配置898.20元/年。本文为大家介绍他们之间的区别及选购策略,以供参考。
|
6月前
|
人工智能 前端开发 安全
从部署到落地:AI编程辅助工具全流程实操指南
在AI编程工具同质化日益明显的当下,一款开源可扩展、安全可控的AI编程辅助工具,成为适配个人开发者与中小团队的实用选择。它并非单纯的代码生成器,而是覆盖需求拆解、编码开发、代码Review全流程的AI研发基础设施,能够有效降低重复编码成本,提升开发效率。本文结合笔者两个多月的实操经验,分享其核心使用场景、可复现实战案例及客观使用心得
656 11
|
7月前
|
人工智能 算法 搜索推荐
马斯克2026采访详解:中国AI算力将远超世界,世界变化的奇点即将到来!
2026年1月,马斯克在德州工厂预言:AGI将于2025-2026年实现,Optimus机器人3年内超越外科医生,中国发电量将达美国3倍,AI算力将领先全球。他称“奇点已来”,电力决定AI未来,太阳能是关键。
|
8月前
|
存储 人工智能 自然语言处理
企业如何选择合适的智能客服系统?关键考量因素全解析
2025年智能客服选型需聚焦企业实际需求,从技术能力、场景适配、数据安全与成本控制四大维度综合评估。大模型驱动下,系统已实现类真人交互与主动服务,企业应根据规模与行业特性选择:电商可选探域、瓴羊;跨国企业关注Salesforce、华为云;中小企业优选Freshdesk等轻量化方案,实现降本增效。
企业如何选择合适的智能客服系统?关键考量因素全解析
|
7月前
|
人工智能 自然语言处理 安全
2026年企业如何应用智能客服,核心技术与产品选型指南
2026年,AI大模型与智能体推动智能客服从“降本工具”升级为“增长引擎”。企业通过“全渠道接入-多模态交互-人机协同-数据驱动”闭环,实现降本、提效、获客与体验升级。分阶段落地策略助力业务规模化增长。
2026年企业如何应用智能客服,核心技术与产品选型指南
|
存储 编译器 C语言
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
736 2
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
|
监控 关系型数据库 MySQL
守护进程到底是什么?如何创建?(图文并茂,你不得不看的一篇文章)
**守护进程(Daemon Process)详解**:守护进程是后台运行的无终端关联的系统进程,常在启动时启动,提供持续服务,如网络服务、日志记录和定时任务。其特点包括脱离终端、后台运行、持久服务、资源管理和错误处理。创建守护进程涉及重定向文件描述符、创建新会话、改变工作目录等步骤。`ps` 和 `top` 命令用于查看守护进程,前者提供进程快照,后者显示实时资源使用情况。
2003 0
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
1020 0
|
Kubernetes Cloud Native Devops
【阿里云云原生专栏】DevOps与云原生的融合:阿里云CI/CD流水线最佳实践
【5月更文挑战第23天】阿里云融合DevOps与云原生技术,提供高效CI/CD解决方案,助力企业提升研发效能。通过云效平台,集成代码管理、构建服务、容器服务、持续部署及监控日志组件,实现自动化研发流程。案例中,应用从GitHub构建到Kubernetes部署,全程无缝衔接。借助阿里云,企业能快速构建适应云原生的DevOps体系,以应对复杂需求和提升市场竞争力。
867 1
|
敏捷开发 测试技术 持续交付
极限编程(XP)原理与技巧:深入解析与实践
【5月更文挑战第8天】极限编程(XP)是一种敏捷开发方法,注重快速反馈、迭代开发和简单设计,以提高软件质量和项目灵活性。关键原则包括客户合作、集体代码所有权、持续集成等。实践中,使用故事卡片描述需求,遵循编程约定,实行TDD,持续重构,结对编程,并定期举行迭代会议。通过理解和应用XP,团队能提升效率,应对变化。

热门文章

最新文章