RT-Thread(RTT) ADC设备多通道采集

前言

实现ADC设备多通道采集功能


1、创建项目,串口跟调试器根据个人选择使用

在这里插入图片描述

2、在board.h中打开ADC1设备注释

在这里插入图片描述

3、在RT-Thread Settings中打开ADC设备驱动程序

在这里插入图片描述


4、在hal_config.h中使能ADC模块

在这里插入图片描述

5、打开CubeMX配置时钟源为外部时钟

在这里插入图片描述

6、根据你的板子设置时钟频率,这里我直接拉满

在这里插入图片描述

7、新建工程的时候,我使用到了串口2,所以这里把串口2也给打开

在这里插入图片描述

8、配置ADC1,选择所使用到的采集通道,这里通道2跟通道3是PA2跟PA3,我拿去做串口2的送收发引脚了,故不使用

在这里插入图片描述

9、ADC1的配置如下,

Clock Prescaler是ADC时钟预分频器系数,

Resolution是ADC分辨率设置,

Scan Conv Mode = ENABLE; 开启扫描模式,可以连续转换多个通道

Continuous Conversion Mode = ENABLE; 开启连续转换模式

Discontinuous Conversion Mode = DISABLE; 关闭不连续转换模式

DMA Continuous Requests; 这个是配置是否开启DMA连续请求

End Of Conversion Selection; 配置 ADC转换完成后触发中断

在这里插入图片描述

10、生成代码

在这里插入图片描述

11、在主函数写入如下代码

/*
 * Copyright (c) 2006-2023, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-12-03     RT-Thread    first version
 */

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>

#define ADC_DEV_NAME        "adc1"  /* ADC 设备名称 */
rt_adc_device_t adc_dev;            /* ADC 设备句柄 */

rt_uint8_t adc_val[4]={0};            //adc采样值


#define ADC_DEV_CHANNEL0      0       /* ADC 通道 */
#define ADC_DEV_CHANNEL1      1       /* ADC 通道 */
#define ADC_DEV_CHANNEL4      4       /* ADC 通道 */
#define ADC_DEV_CHANNEL5      5       /* ADC 通道 */



int main(void)
{
    //查找ADC设备
    adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
    if(adc_dev == RT_NULL)
    {
        rt_kprintf("rt_devide_find(adc1)failed...");
        return  -EINVAL;
    }


//    //使能ADC通道
    rt_adc_enable(adc_dev,ADC_DEV_CHANNEL0);
    rt_adc_enable(adc_dev,ADC_DEV_CHANNEL1);
    rt_adc_enable(adc_dev,ADC_DEV_CHANNEL4);
    rt_adc_enable(adc_dev,ADC_DEV_CHANNEL5);
    while(1)
    {
        //读通道
        adc_val[0] = rt_adc_read(adc_dev, ADC_DEV_CHANNEL0);
        adc_val[1] = rt_adc_read(adc_dev, ADC_DEV_CHANNEL1);
        adc_val[2] = rt_adc_read(adc_dev, ADC_DEV_CHANNEL4);
        adc_val[3] = rt_adc_read(adc_dev, ADC_DEV_CHANNEL5);

        //用串口打印数据查看
        rt_kprintf("%d,%d,%d,%d\n", adc_val[0], adc_val[1], adc_val[2],adc_val[3]);
        //rt_kprintf("Hello RT-Thread!\n");

        rt_thread_mdelay(400);
    }


    return RT_EOK;
}

12、编译报错

在这里插入图片描述

13、进行跳转,把这段代码注释掉

在这里插入图片描述

14、编译通过

在这里插入图片描述

15、四个通道都有数据,可以自己编写数据转换去测测电压

在这里插入图片描述

16、最后,这是采用的RTT的ADC设备轮询采样的方式去采集通道数据,但我发现这样采样的数据不是很稳定,会跳变,RTT官方好像也没有提供有关ADC采样DMA的有关接口函数,后面我尝试了不使用RTT的设备框架去驱动ADC,使用HAL去配置ADC的多通道采样才解决了数据跳变问题,后续会更新在RTT中使用HAL库配置ADC+DMA多通道采样的过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

先睡个好觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值