前言
实现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;
}