449|4

116

帖子

2

资源

一粒金砂(中级)

平头哥RVB2601测评:ADC轮询单通道与DMA多通道采集 [复制链接]


前阵子因为住院还有养伤耽误了测评太久了,拖更了一个多月。实在不好意思。。。

想想当时是在测评ADC的,然后因为ADCDMA采样有了疑问就去阿里云提交工单 ,然后就没有然后了。。

 

    由于ADC没有文档介绍也没有历程所以就只能靠着他所给的API来用,对照着PWM一步一步的来,

最后还是调通了。也总结了不少技巧,比如他所提供的API前面有static的就是他文件内部是函数,

给自己调用的,到最后就剩下了几个。比如初始化的,adc通道配置的,adc开始停止的,

adc模式的函数,还有给DMA用的缓冲区还有他相应的配置函数等等。

 

1.内部盗用的API,可以不用管他,刚开始还研究了好久。

static void wj_adc_channel_conv_end_irq(csi_adc_t *adc)

static void wj_adc_irqhandler(void *args)

static csi_error_t wj_adc_start_intr(csi_adc_t *adc)

static csi_error_t wj_adc_start_dma(csi_adc_t *adc)

static csi_error_t wj_adc_stop_intr(csi_adc_t *adc)

static csi_error_t wj_adc_stop_dma(csi_adc_t *adc)

static int adc_channel_delete(uint8_t *channels, uint8_t nums, uint8_t channel)

 

2.ADC初始化,开始停止,通道配置,采样频率、时间,回调函数,ADC读取值等等

 

csi_error_t csi_adc_init(csi_adc_t *adc, uint32_t idx)

void csi_adc_uninit(csi_adc_t *adc)

csi_error_t csi_adc_start(csi_adc_t *adc)

csi_error_t csi_adc_stop(csi_adc_t *adc)

csi_error_t csi_adc_channel_enable(csi_adc_t *adc, uint8_t ch_id, bool is_enable)

csi_error_t csi_adc_channel_sampling_time(csi_adc_t *adc, uint8_t ch_id, uint16_t clock_num)

csi_error_t csi_adc_sampling_time(csi_adc_t *adc, uint16_t clock_num)

uint32_t csi_adc_freq_div(csi_adc_t *adc, uint32_t div)

int32_t csi_adc_read(csi_adc_t *adc)

csi_error_t csi_adc_get_state(csi_adc_t *adc, csi_state_t *state)

uint32_t csi_adc_get_freq(csi_adc_t *adc)

csi_error_t csi_adc_attach_callback(csi_adc_t *adc, void *callback, void *arg)

void csi_adc_detach_callback(csi_adc_t *adc)

csi_error_t csi_adc_start_async(csi_adc_t *adc)

csi_error_t csi_adc_stop_async(csi_adc_t *adc)

csi_error_t csi_adc_continue_mode(csi_adc_t *adc, bool is_enable)

 

3.ADC DMA相关配置函数:

void wj_adc_dma_event_cb(csi_dma_ch_t *dma, csi_dma_event_t event, void *arg)

csi_error_t csi_adc_set_buffer(csi_adc_t *adc, uint32_t *data, uint32_t num)

csi_error_t csi_adc_link_dma(csi_adc_t *adc, csi_dma_ch_t *dma)

 

一、先来说说用查询的方法对adc单通道采样的:

创建一个ADC任务

static void adc_task(void *arg)
{
    csi_pin_set_mux(EXAMPLE_ADC_CH0, PA3_ADC_A1);
    csi_adc_init(&adc1, 0);
    uint32_t freq_value = csi_adc_freq_div(&adc1, 128);
    printf("get freq_value: %d\n", freq_value);
    csi_adc_sampling_time(&adc1, 2);
    csi_adc_continue_mode(&adc1, 1);//这句是连续采样,不使能只能采样一次
   csi_adc_channel_enable(&adc1, 0, true);

    /*******************/
    while(1)
{
    lv_task_handler();
    aos_msleep(400);
    lv_tick_inc(1);
    i = csi_adc_read(&adc1);
    printf("adc1:%d   ", i);
}
}

image-20210831221047-1.png

 

    二、那怎么用查询的方法对多通道采样呢?这个问题开始也是想了很久,因为读取adc函数就只有一个adc的句柄,这个句柄是初始化函数过来得到的,没有包含通道的相关操作,这我就联想到了atm32sac的几种模式,就是扫描模式,多通道读取完一个自动对下一个进行读取,然后我就按照这个

image-20210831221047-2.png

 

   csi_adc_channel_enable(&adc1, 0, true);
   csi_adc_channel_enable(&adc1, 1, true);
   csi_adc_channel_enable(&adc1, 2, true);

  //  注册了几个端口,连续读取三次果然是三个端口的值:

i = csi_adc_read(&adc1);
printf("adc1:%d  ", i);

i = csi_adc_read(&adc1);
printf("adc1:%d  ", i);

i = csi_adc_read(&adc1);
 printf("adc1:%d  ", i);

 

    结果就是依次读取那个PA3-5adc值。

image-20210831221047-3.png

 

    三、实际上我们比较多用DMA采样多通道的adc值,这样可以释放cpu也可以很好的随时读取:

我们加上DMA的配置代码

csi_adc_set_buffer(&adc1,  buff0,  3);
csi_adc_link_dma( &adc1, &dma1);  
csi_adc_channel_enable(&adc1, 0, true);
csi_adc_channel_enable(&adc1, 1, true);
csi_adc_channel_enable(&adc1, 2, true);
csi_adc_start_async(&adc1);
while(1)
{
    lv_task_handler();
    aos_msleep(400);
    lv_tick_inc(1);
    i=buff0[0];
    printf("adc1:%d   ", i);
    printf("adc1:%d mv\r\n", i * 3300 / 4095);
    i=buff0[1];
    printf("adc1:%d   ", i);
    printf("adc1:%d mv\r\n", i * 3300 / 4095);
    i=buff0[2];
    printf("adc1:%d   ", i);
    printf("adc1:%d mv\r\n", i * 3300 / 4095);

}

image-20210831221047-4.png

 

还可以用摇杆配合舵机来操控哈哈

image.png  

 

 

 

 


回复

8686

帖子

20

资源

版主

不错,[大母指]

平头哥的问题,正常阿里云会受理吗?

点评

会的,周末不上班,应该两天的样子,还可以,就是没有群交流谈论方便  详情 回复 发表于 2021-8-31 23:35
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复

116

帖子

2

资源

一粒金砂(中级)

littleshrimp 发表于 2021-8-31 22:32 不错,[大母指] 平头哥的问题,正常阿里云会受理吗?

会的,周末不上班,应该两天的样子,还可以,就是没有群交流谈论方便


回复

116

帖子

2

资源

一粒金砂(中级)

stm32 adc有一处写错了


回复

2万

帖子

71

资源

管理员

辛苦,注意休息注意身体。

个人签名

不管是哪年,都要加油!继续为中国电子行业做出小小的贡献吧! 扣扣 1206973913


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表