RT-Thread系列05——ADC设备

文章目录

====>>> 文章汇总(有代码汇总) <<<====

目标:通过串口打印ADC的值。

  • RT-Thread studio,版本: 2.2.6,不一样其实区别也不大
  • RT-Thread:标准版,4.0.3版本
  • 芯片包版本:0.1.9

1. ADC测试

第一步:在 RT-Thread Settings 中 -> 组件 -> 设备驱动程序 -> 使用ADC设备驱动程序,勾选上。ctrl + s保存。

在这里插入图片描述
第二步:在board.h中打开#define BSP_USING_ADC1宏定义。
在这里插入图片描述

这里测试使用的引脚为PA1(ADC1的通道1)。根据自己使用的ADC选择打开ADC几。

第三步:从左侧窗口打开cubemx,勾选上ADC1的CH1,确认一下引脚是不是对的,参数配置可以不用管。ADC打开了,时钟树配置界面ADC的时钟也要配置一下,不能超过14Mhz(ADC的需求)。然后关闭cubemx界面,生成代码后刷新左侧目录界面。即可在cubemx文件夹中的stm32f1xx_hal_msp.c文件中看到ADC的引脚初始化代码。

此时如果直接编译,然后在Shell窗口输入list_device命令,就已经能看到adc1设备了。

第四步:编写测试代码,程序运行后,在Shell窗口输入adc_vol_test命令,即可以在Shell窗口看到连续发送50次的ADC采样值和电压值。在此过程中改变PA1接触的地方,可以看到电压值的改变。

/*
 * 程序清单: ADC 设备使用例程
 * 例程导出了 adc_vol_test 命令到控制终端
 * 命令调用格式:adc_vol_test
 * 程序功能:通过 ADC 设备采样电压值并转换为数值。
 *           示例代码参考电压为3.3V,转换位数为12位。
*/

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


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


static int adc_vol_test(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 test run failed! can't find %s device!\n", ADC_DEV_NAME);
        return RT_ERROR;
    }

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

    // 连续采集并发送50次
    for(rt_uint16_t times = 0; times <= 50; times++)
    {
        /* 读取采样值 */
        value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
        /* 转换为对应电压值 */
        vol = value * REFER_VOLTAGE / CONVERT_BITS;
        // 输出
        rt_kprintf("the value is :%d, the voltage is :%d.%02d \n", value, vol / 100, vol % 100);
        // 等待一下下再开启下一轮
        rt_thread_mdelay(500);
    }

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

    return ret;
}

/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(adc_vol_test, adc voltage convert test);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用ADC DMA,您需要执行以下步骤: 1. 在RT-Thread Studio中创建一个新的RT-Thread项目,并在末尾添加ADC和DMA设备驱动程序。 2. 初始化ADC和DMA设备并设置其参数。 3. 在DMA传输完成后,将数据从DMA缓冲区传输到用户缓冲区。 4. 启动DMA传输并等待传输完成。 以下是一个使用ADC DMA的示例代码: ```c #include <rtthread.h> #include <rtdevice.h> #define ADC_DEV_NAME "adc1" #define DMA_DEV_NAME "dma1" #define SAMPLE_NUM 1024 static rt_uint16_t adc_buffer[SAMPLE_NUM]; static void adc_dma_callback(struct rt_completion *comp) { rt_completion_done(comp); } void adc_dma_test(void) { rt_device_t adc_dev, dma_dev; struct rt_completion adc_dma_complete; rt_err_t result; adc_dev = rt_device_find(ADC_DEV_NAME); if (adc_dev == RT_NULL) { rt_kprintf("Failed to find ADC device!\n"); return; } dma_dev = rt_device_find(DMA_DEV_NAME); if (dma_dev == RT_NULL) { rt_kprintf("Failed to find DMA device!\n"); return; } result = rt_device_open(adc_dev, RT_DEVICE_OFLAG_RDWR); if (result != RT_EOK) { rt_kprintf("Failed to open ADC device!\n"); return; } result = rt_device_open(dma_dev, RT_DEVICE_OFLAG_RDWR); if (result != RT_EOK) { rt_kprintf("Failed to open DMA device!\n"); rt_device_close(adc_dev); return; } /* Configure ADC */ rt_adc_enable(adc_dev, RT_TRUE); rt_adc_set_sample_rate(adc_dev, 100000); rt_adc_set_resolution(adc_dev, 12); /* Configure DMA */ rt_dma_set_callback(dma_dev, adc_dma_callback, &adc_dma_complete); rt_dma_set_source(dma_dev, RT_NULL); rt_dma_set_destination(dma_dev, adc_buffer); rt_dma_set_data_size(dma_dev, SAMPLE_NUM * sizeof(rt_uint16_t)); rt_dma_set_direction(dma_dev, RT_DMA_PERIPH_TO_MEMORY); rt_dma_set_peripheral_request(dma_dev, rt_device_get_irq(adc_dev)); /* Start DMA transfer */ rt_completion_init(&adc_dma_complete); rt_dma_start(dma_dev); rt_adc_start(adc_dev); /* Wait for DMA transfer to complete */ rt_completion_wait(&adc_dma_complete, RT_WAITING_FOREVER); /* Copy data from DMA buffer to user buffer */ // ... /* Cleanup */ rt_device_close(dma_dev); rt_device_close(adc_dev); } ``` 在此示例代码中,我们使用RT-Thread的`rt_adc_enable()`函数启用ADC,并使用`rt_adc_set_sample_rate()`和`rt_adc_set_resolution()`函数设置参数。然后,我们使用`rt_dma_set_callback()`函数设置DMA传输完成时的回调函数,并使用`rt_dma_set_source()`、`rt_dma_set_destination()`、`rt_dma_set_data_size()`和`rt_dma_set_direction()`函数设置DMA参数。最后,我们使用`rt_completion_init()`函数初始化一个RT-Thread完成对象,并使用`rt_dma_start()`和`rt_adc_start()`函数启动DMA和ADC传输。在DMA传输完成后,我们使用`rt_completion_wait()`函数等待DMA传输完成,并使用`rt_device_close()`函数关闭ADC和DMA设备
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值