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、小结:
初次使用,有不到之处还请各位大佬指正、海涵!