RTT(RT-Thread)ADC设备(RTT保姆级介绍)

目录

ADC设备

前言

ADC相关参数说明

访问ADC设备

配置ADC设备

ADC实例

硬件设计 

软件设计


ADC设备

前言

ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。

对于ADC的详细介绍和在STM32中的裸机应用可参考以下博客

ADC电压采集(基于STM32hal库)(详细介绍)_竹烟淮雨的博客-CSDN博客

ADC电压采集(基于STM32hal库)(保姆级应用)_竹烟淮雨的博客-CSDN博客

ADC相关参数说明

  • 分辨率:

分辨率以二进制(或十进制)数的位数来表示,一般有 8 位、10 位、12 位、16 位等,它说明模数转换器对输入信号的分辨能力,位数越多,表示分辨率越高,恢复模拟信号时会更精确。

比如电压访问在0-3.3V,如果使用12Bit的分辨率的话,最大表示的数字量为2^11-1=4095(范围为0-4095),也就是把3.3V分为4096份,实际电压值=模拟电压值/4095*3.3V

  • 精度:

精度表示 ADC 器件在所有的数值点上对应的模拟值和真实值之间的最大误差值,也就是输出数值偏离线性最大的距离。

  • 转换速率:

转换速率是指 A/D 转换器完成一次从模拟到数字的 AD 转换所需时间的倒数。例如,某 A/D 转换器的转换速率为 1MHz,则表示完成一次 AD 转换时间为 1 微秒。

访问ADC设备

应用程序通过 RT-Thread 提供的 ADC 设备管理接口来访问 ADC 硬件,相关接口如下所示:

  • 查找 ADC 设备

rt_device_t rt_device_find(const char* name);

  • 使能 ADC 通道

rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel)

@dev ADC 设备句柄

@channel ADC 通道

  • 读取 ADC 通道采样值(读取到的是模拟量转成数字量后的值)

rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel);

@dev ADC 设备句柄

@channel ADC 通道

  • 关闭 ADC 通道

rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel);

仅仅有这些函数接口,并不能够实现ADC设备的功能,我们还需要进行相应的配置。

配置ADC设备

打开我们的工程源码中的board.h,关于芯片的一些外设的配置基本上都在board.h中去配置,关于我们之前的时钟、串口配置,以及IIC、SPI、PWM等等的配置。

打开board.h找到ADC的相关配置步骤描述

/** if you want to use adc you can use the following instructions.** STEP 1, open adc driver framework support in the RT-Thread Settings file** STEP 2, define macro related to the adc*                 such as     #define BSP_USING_ADC1** STEP 3, copy your adc init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file*                 such as     void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)** STEP 4, modify your stm32xxxx_hal_config.h file to support adc peripherals. define macro related to the peripherals*                 such as     #define HAL_ADC_MODULE_ENABLED**/
  • 步骤一:开启ADC驱动框架的支持

  • 步骤二:定义一个ADC设备相关的宏

共有三种选择

根据我们的STM32开发板公有三个ADC外设,这里选择使用ADC1

  • 步骤三:拷贝ADC初始化函数,通过CubeMX生成stm32xxxx_hal_msp.c后,将相应的初始化函数拷贝到board.c中
  • 步骤四:修改hal层配置文件,使其支持ADC外设

ADC实例

我们在这里以ADC的独立模式单通道采集模式为例,来使用我们RTT的ADC设备。

硬件设计 

我们的霸道开发板板载了一个贴片滑动变阻器,滑动变阻器的滑片端连接到了 STM32 的 PC1 引脚。

贴片滑动变阻器的动触点通过连接至 STM32 芯片的 ADC 通道引脚。当我们旋转滑动变阻器调 节旋钮时,其动触点电压也会随之改变,电压变化范围为 0~3.3V,亦是开发板默认的 ADC 电压 采集范围。

软件设计

我们接着前面配置ADC设备的步骤进行。

1.首先寻找ADC1设备句柄

2.接着如果查找到ADC,则打开我们的ADC设备,这里使用专属的使能函数,注意我们需要对dev进行类型转换为rt_adc_device_t

3.使能完成之后,我们就可以继续数据读取了。这里我们开启一个线程来读取ADC1的通道11。

(1)动态创建线程

(2)设置入口函数

(3)开启线程

4.在线程处理函数中,通过rt_adc_read函数进行ADC通道数据的读取

5.此外要注意在线程处理中加上延时,这样可以让线程主动释放CPU资源,让CPU去调度其它线程

6.完善打印结果

7.将我们的CubeMX生成的代码复制到board.c中

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(adcHandle->Instance==ADC1){/* USER CODE BEGIN ADC1_MspInit 0 *//* USER CODE END ADC1_MspInit 0 *//* ADC1 clock enable */__HAL_RCC_ADC1_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();/**ADC1 GPIO ConfigurationPC1     ------> ADC1_IN11*/GPIO_InitStruct.Pin = GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);/* ADC1 interrupt Init */HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(ADC1_2_IRQn);/* USER CODE BEGIN ADC1_MspInit 1 *//* USER CODE END ADC1_MspInit 1 */}
}

 8.编译下载,注意要加上adc.h头文件

运行结果,调节电压旋钮,模拟量正常输出,但数字量输出是%f???

(这个问题琢磨半天尚未解决,rt_kprintf("Analog val:%.3f\n\r\n",(float)val/4096.0*3.3);输出的结果是%f???,同样我将%.3f换成%d或%u输出的结果却是很大的随机数,希望有大佬可以帮忙解决!!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas数据分析38——数据框表格拓展以及缩回对齐

案例背景 需求是这个样的: 把这个表格进行拓展。 代码实现: df pd.DataFrame(np.array([[1, 2, 3,4], [a,b, c,d], [小明,小红, 小马,小天]])) df 方法一:自定义函数: def expand_dataframe(df):m, n df.shapenew_df pd.Dat…

linux系统中设置服务开机自启动

1:背景描述 最近根据工作需要,需要服务实现开机自启动的效果,因为平时只使用过nohup的后台挂起操作,很少接触开机,镜像装机服务自启动的功能,因此,这里简单记录一下。 注意,开机自…

解锁数据潜力:信息抽取、数据增强与UIE的完美融合

解锁数据潜力:信息抽取、数据增强与UIE的完美融合 1.信息抽取(Information Extraction) 1.1 IE简介 信息抽取是 NLP 任务中非常常见的一种任务,其目的在于从一段自然文本中提取出我们想要的关键信息结构。 举例来讲&#xff0…

从NLP到聊天机器人

一、说明 今天,当打电话给银行或其他公司时,听到电话另一端的机器人向你打招呼是很常见的:“你好,我是你的数字助理。请问你的问题。是的,机器人现在不仅可以说人类语言,还可以用人类语言与用户互动。这是由…

windows权限维持—黄金白银票据隐藏用户远控RustDeskGotoHttp

windows权限维持—黄金白银票据&隐藏用户&远控&RustDesk&GotoHttp 1. 前置1.1. 初始问题1.1.1. 解决办法 2. 隐藏用户2.1. 工具原理2.2. 案例操作2.2.1. 单机添加用户2.2.1.1. 工具添加用户2.2.1.2. 工具查看隐藏用户2.2.1.3. 本地查看隐藏用户 2.2.2. 域内添加…

NeuralNLP-NeuralClassifier的使用记录(二),训练预测自己的【中文文本多分类】

NeuralNLP-NeuralClassifier的使用记录,训练预测自己的【中文文本多分类】 数据准备: ​ 与英文的训练预测一致,都使用相同的数据格式,将数据通过代码处理为JSON格式,以下是我使用的一种,不同的原数据情况…

java+springboot+mysql理发会员管理系统

项目介绍: 使用javaspringbootmysql开发的理发会员管理系统,系统包含超级管理员,系统管理员、客户、发型师角色,功能如下: 超级管理员:管理员管理;会员管理;发型师管理&#xff1b…

如何保证数据库的数据和Redis的数据一致性

实际项目中有可能会使用Redis缓存数据,那么在更新数据的时候如何保证数据库中的数据和Redis缓存的数据一致,缓存同步策略的选择是一个很重要的问题。网上有各种说法,大概总结有以下几种,看看每种方案是否可行以及存在的问题和适用…

安装软件包

安装软件包 创建一个名为 /home/curtis/ansible/packages.yml 的 playbook : 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上 将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上 将 dev 主机组中主机上的所有软件包更新为最新版本 vim packa…

关于Firmae缺失binwalk模块

问题 david707:~/FirmAE$ sudo ./run.sh -c weyow ./WAM_9900-20.06.03V.trx [*] ./WAM_9900-20.06.03V.trx emulation start!!! Traceback (most recent call last):File "./sources/extractor/extractor.py", line 19, in <module>import binwalk ModuleNot…

Docker容器:docker基础概述、安装、网络及资源控制

文章目录 一.docker容器概述1.什么是容器2. docker与虚拟机的区别2.1 docker虚拟化产品有哪些及其对比2.2 Docker与虚拟机的区别 3.Docker容器的使用场景4.Docker容器的优点5.Docker 的底层运行原理6.namespace的六项隔离7.Docker核心概念 二.Docker安装 及管理1.安装 Docker1.…

【k8s】基于Prometheus监控Kubernetes集群安装部署

目录 基于Prometheus监控Kubernetes集群安装部署 一、环境准备 二、部署kubernetes集群 三、部署Prometheus监控平台 四、部署Grafana服务 五、grafana web操作 基于Prometheus监控Kubernetes集群安装部署 一、环境准备 IP地址 主机名 组件 192.168.100.131 k8s-ma…

时序预测 | MATLAB实现WOA-CNN-GRU鲸鱼算法优化卷积门控循环单元时间序列预测

时序预测 | MATLAB实现WOA-CNN-GRU鲸鱼算法优化卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-GRU鲸鱼算法优化卷积门控循环单元时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现WOA-CNN-GRU鲸鱼算法优化卷积…

基于LVQ神经网络的人脸朝向识别

1案例背景 1.1人脸识别概述 人脸识别作为一个复杂的模式识别问题,近年来受到了广泛的关注,识别领域的各种方法在这个问题上各显所长,而且发展出了许多新方法,大大丰富和拓宽了模式识别的方向。人脸识别、检测,跟踪、特征定位等技术近年来一直是研究的热点。人脸识别是人脸应用…

【制作npm包1】申请npm账号、认识个人包和组织包

概述 在开发当中经常有一种现象&#xff0c;重复代码写了N多遍&#xff0c;再次写同样的逻辑就再次翻查以前的代码逻辑。效率低下且容易出错&#xff0c;封装一个npm包的价值也不仅仅是给别人用&#xff0c;封装一套属于自己或者本部门的npm包也是相当有必要。 也许经常看到一…

RabbitMQ的5种消息队列

RabbitMQ的5种消息队列 1、七种模式介绍与应用场景 1.1 简单模式(Hello World) 一个生产者对应一个消费者&#xff0c;RabbitMQ 相当于一个消息代理&#xff0c;负责将 A 的消息转发给 B。 应用场景&#xff1a;将发送的电子邮件放到消息队列&#xff0c;然后邮件服务在队列…

【git】初次使用git上传代码到github远程仓库

目录 0.前言1.新建代码库2.添加SSH公钥2.1 前置准备2.2 Git 基本信息设置2.3 添加SSH Key 3.本地仓库上传到github3.1 建立本地仓库并初始化3.2 初始化仓库3.3 建立本地与github上新建项目链接3.4 同步github新建项目到本地3.5 添加本地文件到缓存区3.6 为上传文件添加注释3.7 …

注册中心Eureka和Nacos,以及负载均衡Ribbon

1.初识微服务 1.1.什么是微服务 微服务&#xff0c;就是把服务拆分成为若干个服务&#xff0c;降低服务之间的耦合度&#xff0c;提供服务的独立性和灵活性。做到高内聚&#xff0c;低耦合。 1.2.单体架构和微服务架构的区别&#xff1a; 单体架构&#xff1a;简单方便&#…

DevExpress WinForms数据编辑器组件,提供丰富的数据输入样式!(一)

DevExpress WinForms超过80个高影响力的WinForms编辑器和多用途控件&#xff0c;从屏蔽数据输入和内置数据验证到HTML格式化&#xff0c;DevExpress数据编辑库提供了无与伦比的数据编辑选项&#xff0c;包括用于独立数据编辑或用于容器控件(如Grid, TreeList和Ribbon)的单元格。…

云原生 envoy xDS 动态配置 java控制平面开发 支持restful grpc实现 EDS 动态endpoint配置

envoy xDS 动态配置 java控制平面开发 支持restful grpc 动态endpoint配置 大纲 基础概念Envoy 动态配置API配置方式动静结合的配置方式纯动态配置方式实战 基础概念 Envoy 的强大功能之一是支持动态配置&#xff0c;当使用动态配置时&#xff0c;我们不需要重新启动 Envoy…