3.RTT-ADC采集

        前面一期内容讲述了GPIO的控制编程和配置,今天来学习一下ADC采集,能够学习到RTT的同学自然也都是玩单片机的老手了,至于ADC是什么东西也不用我来解释说明了,如果有不懂的可以去百度或者去官方标准手册里面查看。在学习ADC采集之前我们需要引入一下Kconfig语法,目的是让大家知道为何要在Settings中进行选择,为何选择后就能够驱动起来ADC。注意:记得提前安装CubeMX否则无法进行配置开发1e83244c9ee7de3ba8d6ec5040f0be89.png

1.Kconfig的引入

Kconfig在RT-Thread中的工作机制:

        C语言项目的裁剪配置本质上通过条件编译和宏的展开来实现的,RT-Thread借助Kconfig这套机制更方便的实现了这一功能。当前以Windows下Env工具中的使用为例,简述Kconfig在RT-Thread的工作机制。

        Kconfig机制包括了Kconfig文件和配置UI界面(如menuconfig,pyconfig等)。Kconfig机制有如下特点:

  • Kconfig文件中的配置项会映射至rtconfig.h中
  • Kconfig文件可以随源码分散至各级子目录,便于灵活修改。

由于内容太多并且复杂,具体的内容到官方网站上的手册中查看,路径如下:

2.对照Kconfig查看Settings

        在对Kconfig有一定了解后可以参考Settings来验证手册中讲述的Kconfig语法作用。这个可视化界面Settings和Kconfig语法编写的Kconfig文件是一一对应的所以在制作自己的bsp包的时候可以利用Kconfig语法来丰富自己的bsp包从而达到在以后的开发中更加高效轻松的目的。c9a301e554ed8670f05d974ad7780ea8.png

3.开始ADC的配置

        打开Settings点击红框里面的按钮,进入到硬件配置。

        Ctrl+S保存一下配置然后编译一下,这时候会发现报错了,爆了一大堆,不要慌!报错的原因是虽然在应用层使能了ADC框架但是在驱动层上没有进行配置,这时候打开工程文件的CubeMX开始配置ADC驱动引脚。e149c2f57e3eb207be11e67cdf88a2b8.png

        在工程列表下找到board文件夹打开找到下图文件

26339e8bad1fc1edbd8de358c9acab57.png

        进入这个文件,然后就能看到CubeMX的工程文件了(注意:记得提前安装CubeMX否则无法进行配置开发

        点击进去,然后界面如下:

这是打开开发板原理图寻找一个ADC通道。这里我们就随便选一个PC0吧,去到CubeMX进行配置。

d87f008987e2bf7e807985176dfb16d0.png

可以看到有多组ADC,我们随便选择就行,我们选择ADC1的通道10,这时候生成代码便可。95bb61f83ece5242e99a4ad1cd039693.png

        重新编译一下,没有报错了

        这时候下载程序,然后进入串口助手进行调试。

4.FinSH命令调试

系统运行后桉tab键即可弹出可以使用的命令,这时adc也出现了然后根据图片命令顺序进行调试即可。(注意:这里只是调试,代码应用在下一小节

c80a26b7d81a308bb84a0cff7873c4dd.png

5.ADC读取电平代码应用

在文件夹里面创建一个adc.c文件(注意:创建文件的方法和位置不固定,按照个人爱好来操作即可)cebd0aa686f71c7cf4b29f0268a88de5.png

创建完后开始编写adc采集代码(代码官方手册中有示例可以参考,如果编译报错很多的话就到Settings中关闭ADC编译一下然后再打开ADC编译就没有问题了,这个因该是软件的bug,还有一种办法就是在工程列表空白处右键然后点击“同步scons配置至项目”1ecef77d57012471a65358ad63b17d44.png

/*adc.c

 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-11-05     ZXY       the first version
 */
/*
 * 程序清单: ADC 设备使用例程
 * 例程导出了 adc_sample 命令到控制终端
 * 命令调用格式:adc_sample
 * 程序功能:通过 ADC 设备采样电压值并转换为数值。
 *           示例代码参考电压为3.3V,转换位数为12位。
*/

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

#define ADC_DEV_NAME        "adc1"      /* ADC 设备名称 */
#define ADC_DEV_CHANNEL     10           /* ADC 通道 */
#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 */

static int adc_vol_sample(int argc, char *argv[])
{
    rt_adc_device_t adc_dev;
    rt_uint32_t value, vol;
    rt_err_t ret = RT_EOK;

    /* 查找设备 */
    adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
    if (adc_dev == RT_NULL)
    {
        rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
        return RT_ERROR;
    }

    /* 使能设备 */
    ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);

    /* 读取采样值 */
    value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
    rt_kprintf("the value is :%d \n", value);

    /* 转换为对应电压值 */
    vol = value * REFER_VOLTAGE / CONVERT_BITS;
    rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);

    /* 关闭通道 */
    ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);

    return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);

        代码里面都有注释,每个API在手册里面都有非常详细的使用说明,这也是应用层需要掌握的知识,本系列教程重在应用所以不会讲到太深入的地方(底层驱动就不会详细讲述)。对于代码最后的msh导出命令也就是在串口助手中调试的时候输出的命令,这些命令都是由msh导出的,这样使用一次命令就运行一次定义msh命令的代码,这和裸机的运行不一样,所以我们需要让代码一直循环运行的话就需要改变他的初始化顺序,让这adc采集自动初始化开机就能运行。修改后代码如下:

/*adc.c

 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-11-05     ZXY       the first version
 */
/*
 * 程序清单: ADC 设备使用例程
 * 例程导出了 adc_sample 命令到控制终端
 * 命令调用格式:adc_sample
 * 程序功能:通过 ADC 设备采样电压值并转换为数值。
 *           示例代码参考电压为3.3V,转换位数为12位。
*/

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

#define ADC_DEV_NAME        "adc1"      /* ADC 设备名称 */
#define ADC_DEV_CHANNEL     10           /* ADC 通道 */
#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 */

static int adc_vol_sample(int argc, char *argv[])
{
    rt_adc_device_t adc_dev;
    rt_uint32_t value, vol;
    rt_err_t ret = RT_EOK;

    /* 查找设备 */
    adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
    if (adc_dev == RT_NULL)
    {
        rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
        return RT_ERROR;
    }

    /* 使能设备 */
    ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
while(1)
{
     /* 读取采样值 */
    value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
    rt_kprintf("the value is :%d \n", value);
    /* 转换为对应电压值 */
    vol = value * REFER_VOLTAGE / CONVERT_BITS;
    rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
    rt_thread_mdelay(500);
}




    return ret;
}

INIT_APP_EXPORT(adc_vol_sample);

2039674d9ff1860e1144282ac53a3355.png

 9d65190ee9937b6745a2c855a642cce7.png

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式路上的流浪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值