sky 发表于 2021-5-5 10:32:22

RVB2601开发板ADC读取实验

本帖最后由 sky 于 2021-5-5 10:32 编辑

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端口,还是按照芯片管脚定义来,导致数据一致不对:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <aos/aos.h>
#include "app_config.h"
#include "app_init.h"
#include "csi_config.h"
#include "hw_config.h"
#include "board_config.h"
#include <drv/pin.h>
#include <drv/adc.h>
#include <drv/common.h>
static csi_adc_tadc;
void adc_init()
{
    csi_error_t ret;
    csi_pin_set_mux(EXAMPLE_ADC_CH1, PA4_ADC_A2);
      
    ret = csi_adc_init(&adc, 0);
      
    if (ret != CSI_OK)
    {
      printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
      
   }
      
      
    /* Configure frequency divsion, this value can be one of(4 8 16 32 64 128) */
    uint32_tfreq_value = csi_adc_freq_div(&adc, 128);
    printf("get freq_value: %d\n", freq_value);
    /* Configure sampling time */
    ret = csi_adc_sampling_time(&adc, 2);
    if (ret != CSI_OK)
    {
      printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
      
    }
    /* Enable channel */
    ret = csi_adc_channel_enable(&adc, 1, true);
    if (ret != CSI_OK)
    {
      printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
      
    }
    /* Trigger new conversion */
    ret = csi_adc_start(&adc);
    if (ret != CSI_OK)
    {
      printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
      
    }
    /* Read result */
    int32_t data = csi_adc_read(&adc);
    printf("get adc result: %d\n", data);
      
    printf("the voltage is: %d mV\n", data*3300/4096);
    /* Uninit adc */
    csi_adc_uninit(&adc);
      
}

4.3、修改初始化文件

app_init.h添加void adc_init();

4.4、更改main.c文件:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <aos/aos.h>
#include "aos/cli.h"
#include "app_init.h"
#include "lvgl.h"
#include "lv_label.h"
#include "oled.h"
#include "board_config.h"
#include "drv/gpio_pin.h"
#include <drv/pin.h>
#include <drv/adc.h>
/*********************
*      DEFINES
*********************/
#define TAG "app"
/**********************
*      TYPEDEFS
**********************/
/**********************
*STATIC PROTOTYPES
**********************/
// adc
static void adc_lvgl_task(void *arg);
/**********************
*   GLOBAL FUNCTIONS
**********************/
static void adc_lvgl_task(void *arg);
#include "csi_core.h"
/**
* main
*/
int main(void)
{
    board_yoc_init();
    aos_task_new("adc", adc_lvgl_task, NULL, 10 * 1024);
    return 0;
}
static void gui_label_create(void)
{
    lv_obj_t *p = lv_label_create(lv_scr_act(), NULL);
    lv_label_set_long_mode(p, LV_LABEL_LONG_BREAK);
    lv_label_set_align(p, LV_LABEL_ALIGN_CENTER);
    lv_obj_set_pos(p, 0, 4);
    lv_obj_set_size(p, 128, 60);
    lv_label_set_text(p, "THEAD RISC-V\nADC \nDEMO");
}
static void adc_lvgl_task(void *arg)
{
    lv_init();
    /*Initialize for LittlevGL*/
    oled_init();
    adc_init();
    /*Select display 1*/
    // demo_create();
    gui_label_create();
    while (1)
    {
      /* Periodically call the lv_task handler.
         * It could be done in a timer interrupt or an OS task too.*/
      lv_task_handler();
      aos_msleep(5);
      lv_tick_inc(1);
    }
}
4.5、编译,下载、运行:

5、小结:

初次使用,有不到之处还请各位大佬指正、海涵!



郑同学 发表于 2022-6-22 19:09:21

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <aos/aos.h>
#include "aos/cli.h"
#include "app_init.h"
#include "lvgl.h"
#include "lv_label.h"
#include "oled.h"
#include "board_config.h"
#include "drv/gpio_pin.h"
#include <drv/pin.h>
#include <drv/adc.h>
#include "csi_core.h"

//include "app_config.h"
//#include "csi_config.h"
//#include "hw_config.h"
//#include <drv/common.h>


#define TAG "app"

static csi_adc_t adc;

uint32_t i=1;

static csi_adc_t adc;

void adc_init()
{
    csi_error_t ret;
       
    csi_pin_set_mux(EXAMPLE_ADC_CH1, PA4_ADC_A2);
      
    ret = csi_adc_init(&adc, 0);
      
    if (ret != CSI_OK)
    {
      printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
      
   }
    uint32_tfreq_value = csi_adc_freq_div(&adc, 128);
       
    printf("get freq_value: %d\n", freq_value);
       
    /* Configure sampling time */
    ret = csi_adc_sampling_time(&adc, 2);
    if (ret != CSI_OK)
    {
      printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
      
    }
    /* Enable channel */
    ret = csi_adc_channel_enable(&adc, 1, true);
    if (ret != CSI_OK)
    {
      printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
      
    }
    /* Trigger new conversion */
       
    ret = csi_adc_start(&adc);
       
    if (ret != CSI_OK)
    {
      printf("===%s, %d %d \n", __FUNCTION__, __LINE__,ret);
      
    }
       
    /* Read result */
       
    int32_t data = csi_adc_read(&adc);
       
    printf("get adc result: %d\n", data);
      
    printf("the voltage is: %d mV\n", data*3300/4096);
       
    /* Uninit adc */
       
    //csi_adc_uninit(&adc);
      
}
static void gui_label_create(void)
{
    lv_obj_t *p = lv_label_create(lv_scr_act(), NULL);
    lv_label_set_long_mode(p, LV_LABEL_LONG_BREAK);
    lv_label_set_align(p, LV_LABEL_ALIGN_CENTER);
    lv_obj_set_pos(p, 0, 4);
    lv_obj_set_size(p, 128, 60);
    lv_label_set_text(p, "THEAD RISC-V\nADC \nDEMO");
}

static void adc_lvgl_task(void *arg)
{
    lv_init();
    /*Initialize for LittlevGL*/
    oled_init();
    adc_init();
    /*Select display 1*/
    // demo_create();
    gui_label_create();
    while (1)
    {
      /* Periodically call the lv_task handler.
         * It could be done in a timer interrupt or an OS task too.*/
      lv_task_handler();
      aos_msleep(5);
      lv_tick_inc(1);
                int32_t data = csi_adc_read(&adc);
           printf("get adc result: %d\n", data);
       printf("the voltage is: %d mV\n", data*3300/4096);
               
    }
}

static void adc_lvgl_task(void *arg);

int main(void)
{
    board_yoc_init();
        aos_task_new("adc", adc_lvgl_task, NULL, 10 * 1024);
       
    return 0;
}


郑同学 发表于 2022-6-22 19:11:36

郑同学 发表于 2022-6-22 19:09
#include
#include
#include


这个代码只能打印一次?帮忙看看问题?

51MCU 发表于 2022-6-24 15:04:01

采集ADC正确吗?
页: [1]
查看完整版本: RVB2601开发板ADC读取实验