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、小结:
初次使用,有不到之处还请各位大佬指正、海涵!
完
#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:09
#include
#include
#include
这个代码只能打印一次?帮忙看看问题?
采集ADC正确吗?
页:
[1]