RT-Thread记录(十四、I/O 设备模型之ADC设备)

2023-10-27

RT-Thread ADC 设备学习使用

前言

我曾经考虑过把 RT-Thread 常用的设备都写完,其实通过前面的《全面认识 RT-Thread I/O 设备模型》文章学习,以及 UART 和 PIN设备的学习分析,对于 RT-Thread 其他的一些设备 自己看资料基本都可以用起来了,都是同样的思路,自己写写程序测试都可以用起来了。

再加上 RT-Thread 有很多软件包,正真的我们实际的普通应用中需要自己写的也不会太多(除非你使用的设备传感器是小众品牌或者新品,那根据前面文章也刻意自己尝试把驱动写好),所以我再简单的测试几个典型的设备,设备驱动篇也就算更新完了。

本文相对比较轻松,测试一下简单的 ADC 设备。

❤️
本 RT-Thread 专栏记录的开发环境:
RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)
RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)
❤️
RT-Thread 设备篇系列博文链接:
RT-Thread记录(十、全面认识 RT-Thread I/O 设备模型)
RT-Thread记录(十一、I/O 设备模型之UART设备 — 源码解析)
RT-Thread记录(十二、I/O 设备模型之UART设备 — 使用测试)
RT-Thread记录(十三、I/O 设备模型之PIN设备)

一、ADC 采样基础

ADC(Analog-to-Digital Converter) 模数转换器,把模拟信号转化为数字信号,比较简单。在我们测试之前简单的说明 ADC 使用的几个基本点:

1.1 ADC 通道

对于现在的 MCU 来说,一般都有 ADC 引脚,将需要检测的模拟量连接至对应的 IO 口,做好配置就能使用,对于我们测试使用的 STM32 来说,其 ADC 通道对应关系我在以前 STM32 笔记文章中有过记录,如下表格:

在这里插入图片描述

1.2 ADC 分辨率

分辨率以二进制(或十进制)数的位数来表示,一般有8位、10位、12位、16位等。

对于我们测试使用的 STM32F1xx 系列的芯片来说,他们的 ADC 最大支持12位,这个在 STM32 芯片手册中可以看到:

在这里插入图片描述

截图是为了说明很多资料其实都是官方文档中会说明,当然官方文档是英文版本的,再次声明一下,学习一个芯片最好的资料就是官方文档 。

很多常见的问题你或许可以网上搜索就能找到,但是如果一个新的芯片,网上参考资料少,你得想起来官方文档!

分辨率是什么概念?

比如一个ADC设置为 12 位的分辨率,2 的12 次方 = 4096,简单来说就是这个 ADC 设备把他的量程分为 4096 份:0 ~ 4095 最大值 4095 就等于他量程的最大值。
一般来说我们使用 STM32 VDDA引脚都是直接连接3.3V,所以STM32 ADC的量程为 0~ 3.3V 。如果读到 4095 的ADC 值,就表示读到的电压为 3.3V 。

至于12位分辨率是除 4095 还是 4096 ,这个其实网上各有说法,用 4095 的可能占大多数,实际上结果相差不大。

1.3 ADC 采样计算

我们 ADC 读取到的是数字量,数字量表示并不直观,所以一般我们最终还是要转化成模拟量,转化的公式在以前 STM32 使用记录文章中也有过,如下图:

在这里插入图片描述

根据上文说明,只要在电路设计的时候 STM32 的 VDDA 引脚是直接与3.3V 连接的,就可以用如下公式计算:

最终读出的电压值 = VDDA(一般来说是3.3V)* 读到的 ADC 的值(理解为实际读到了多少份)/ 4095 (12位分辨率)

二、ADC 设备操作函数

从本文开始我们就不分析设备的驱动实现原理了,前面的 UART 和 PIN 设备已经很透彻了,感兴趣大家都可以自己查看源码分析。

ADC设备操作函数,还是比较简单的,就4个:

函数 描述
rt_device_find() 根据 ADC 设备名称查找设备获取设备句柄
rt_adc_enable() 使能 ADC 设备
rt_adc_read() 读取 ADC 设备数据
rt_adc_disable() 关闭 ADC 设备

2.1 查找 ADC 设备

rt_device_find以前就见过的,I/O 设备模型通用的查找函数:

/*
参数 	描述
name 	ADC 设备名称
返回 	——
设备句柄 	查找到对应设备将返回相应的设备句柄
RT_NULL 	没有找到设备
*/
rt_device_t rt_device_find(const char* name);

但是这里需要额外说明的是,使用此函数查找 ADC 设备需要强制转换一下,我们定义用来接收的设备句柄不是使用rt_device_t ,而应该使用rt_adc_device_t
在这里插入图片描述

2.2 使能/关闭 ADC 通道

根据自己使用的 GPIO 引脚(对应上文 ADC 通道表格),对 ADC 通道进行使能和关闭。

使能 ADC 通道:

/*
参数 	描述
dev 		ADC 设备句柄
channel 	ADC 通道
返回 	——
RT_EOK 		成功
-RT_ENOSYS 	失败,设备操作方法为空
其他错误码 	失败
*/
rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel)

关闭 ADC 通道:

/*
参数 	描述
dev 		ADC 设备句柄
channel 	ADC 通道
返回 	——
RT_EOK 		成功
-RT_ENOSYS 	失败,设备操作方法为空
其他错误码 	失败
*/
rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel)

2.3 读取采样值

/*
参数 	描述
dev 	ADC 设备句柄
channel 	ADC 通道
返回 	——
读取的数值 	
*/
rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel)

三、ADC 设备示例

ADC的原理以及操作函数都比较简单,我们在 RT-Thread Studio 使用 ADC 设备,反倒是他的使用步骤需要稍微注意一下:

3.1 ADC 设备使用步骤

我们以前讲过,在 RT-Thread 工程中,所有的外设的配置都是在 board.h 文件中,我们可以查看其中关于 ADC 使用步骤的注释:

在这里插入图片描述
.

1、首先,在 RT-Thread Studio 工程中,打开 RT-Thread Settings,使能 ADC 驱动,如下图所示:

.
在这里插入图片描述

接着上图的操作,通过组件栏目打开 ADC 驱动,退出保存:

在这里插入图片描述
.

2、 宏定义 #define BSP_USING_ADC1(这里需要确定自己准备使用哪一个 ADC):
.

在这里插入图片描述
.

3、找一个 ADC 初始化的代码,通过STM32CubeMX 配置:

.

我们按照系列文章第一篇:RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手) 来使用STM32CubeMX 进行配置:

在这里插入图片描述

设置完成后记得看一下 ADC 时钟部分:

在这里插入图片描述

完成后直接生成代码(不要打开,回到 RT-Thread Studio 如果弹出界面点击确认)然后可以发现工程中已经更新了 adc.h

在这里插入图片描述

到这一步,我们已经能够找到我们需要的 HAL_ADC_MspInit 文件了,通过 adc.h 头文件找到 adc.c 文件中的这个函数:
在这里插入图片描述

.

4、 把HAL_ADC_MspInit 函数复制到 board.c 文件最后面,如下图:
.

在这里插入图片描述

.

5. 修改 stm32xxxx_hal_config.h 文件,使能 ADC 模块:
.

这里我们要注意下一下,我们使用过 STM32CubeMX ,所以这个文件的位置发生了变化,这个在以前讲过,具体看图:

在这里插入图片描述

其实我们使用 STM32CubeMX 设置过 ADC 以后,这最后一步我们不需要修改,因为在文件中 CubeMX已经修改好了:

在这里插入图片描述

到这里,ADC 的配置就算全部完成了,我们可以直接在应用程序中,使用 ADC 设备操作函数实现ADC 的读取。

3.2 测试

基于上面的步骤,我们直接在应用层调用接口,直接放一张图说明:

在这里插入图片描述

测试结果:

在这里插入图片描述

开发板的供电不是标准的3.3V,而是3.28V,所以最终结果计算出来有点误差= =!

结语

本文学习的 ADC 设备操作使用比较简单,反倒是他的使用配置相对来说复杂一点。

写完 ADC 设备,计划再测试一个 SPI 设备,就要做设备驱动小结了,I/O 设备模型部分其实前面几篇博文学会了,也就会了,其他的只不过是需要花时间看一看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread记录(十四、I/O 设备模型之ADC设备) 的相关文章

  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • 【Unreal】TArray与std::vector之间转换

    std vector data 返回一个指向内存数组的直接指针 该内存数组由vector内部用于存储其拥有的元素 TArray GetData 同理 FMemory Memcpy 则将指定位置和大小的数组的内存空间拷贝 覆盖 到另一处指定的
  • 第五周课程总结&试验报告(三)

    Java实验报告 班级 计科二班 学号 20188423 姓名 邹健 完成时间 2019 9 27 评分等级 实验三 String类的应用 一 实验目的 1 掌握类String类的使用 2 学会使用JDK帮助文档 二 实验内容 1 已知字符
  • Vcpkg介绍及使用

    Vcpkg用于在Windows Linux Mac上管理C和C 库 极大简化了第三方库的安装 它由微软开源 源码地址 https github com Microsoft vcpkg 最新发布版本为2023 04 15 Release 它的
  • 【译】Filed Play:简介

    引子 在尝试数学函数可视化的时候 发现了一个有趣的库 Field Play 对 README 中的说明进行部分翻译记录 做个初步了解 Origin My GitHub What 让我们为网格上的每个点指定一个向量 1 0 这意味着我们有一个
  • JavaScript Function、函数声明、函数表达式

    JavaScript Function 函数声明 函数表达式 Function 对象 Function 构造器会创建一个新的 Function 对象 在 JavaScript 中每个函数都是一个 Function 对象 使用 Functio
  • 智能指针之unique_ptr(删除器、尺寸)08

    一 unique ptr 1 unique ptr删除器 unique ptr和shared ptr一样 默认删除器都是使用delete 所以当我们创建的是一个数组或者文件这些时 显然delete是无法有效回收的 删除器是一个可调用对象 其
  • 深入分析移动构造函数及其原理

    移动构造函数是C 11中新增加的一种构造函数 其作用是提高程序性能 今天我们就细扒一下它的工作原理 看看它是怎么提高性能的 移动构造函数的由来 在讲解移动构造函数之间 我们先来了解一下在没有移动构造函数之前哪里有性能瓶颈吧 我们来举个例子
  • Node =>Express学习

    1 Express 能做什么 能快速构建web网站的服务器 或 Api接口的服务期 Web网站服务器 专门对外提供Web网页资源的服务器 Api接口服务器 专门对外提供API接口的服务器 2 安装 在项目所处的目录中 运行以下命令 简装到项
  • linux安装jenkins与配置

    简要介绍 jenkins是一个开源软件项目 是基于java开发的一种持续集成工具 用于监控持续重复的工作 旨在提供一个开放易用的软件平台 使软件的持续集成变成可能 语言 Java 一句话描述 持续集成工具 CentOS 7 6 1 安装Op
  • 6 个以假乱真的AI自动配音工具介绍

    6 个以假乱真的AI自动配音工具介绍 用 AI 重新配音 完美骗过各大视频平台的原创保护机制 但这个机器声音味儿太冲 而类似的声音已经快把全国人民包围了 家人们藏不住了 完了芭比Q了 这个男人叫小帅 这个男人叫小美 所以我们很想盘点一下 这
  • 进化优化算法--第二章:爬山法

    算法2 1 最快上升爬山法 x0 lt 随机生成的个体 while not 终止准则 计算x0的适应度f x0 For 每一个解的特征 q 1 2 n xq lt x0 用一个随机变异替换xq的第q个特征 计算xq的适应度f xq 获取下一
  • ChatGPT-4下周要来了

    昨天的一则新闻引起了轰动 微软德国首席技术官 Andreas Braun 在最近一次名为 AI in Focus Digital Kickoff 的活动中透露了这一消息 根据 Braun 的说法 我们将在下周推出 GPT 4 我们将拥有多模
  • npm ERR! code EINTEGRITY npm ERR! sha1-BO3IiUkrA6RF56xm6SJqcBdcqKA= integrity checksum failed when u

    npm ERR code EINTEGRITY npm ERR sha1 BO3IiUkrA6RF56xm6SJqcBdcqKA integrity checksum failed when using sha1 wanted sha1 B
  • 基于 MATLAB 的时间卷积神经网络(TCN)数据回归预测

    基于 MATLAB 的时间卷积神经网络 TCN 数据回归预测 时间卷积神经网络 Temporal Convolutional Network 简称 TCN 是一种基于卷积神经网络的模型 可以有效地处理时间序列数据 并具备较强的建模和预测能力
  • 变量键盘读取、数组与声明:read、array、declare

    变量键盘读取 数组与声明 read array declare 1 read root linux read pt variable 参数 p 后面可以接提示符 t 后面可以接等待的 秒数 范例一 让用户通过键盘输入内容 将该内容变成ate
  • Jdbc 连接MYSQL数据库代码模块

    获得数据库连接的四个步骤 Class for com mysql cj jdbc Driver 由于使用的是MYSQL 8 所以必须要使用相应的驱动 相比于mysql connector java 5 1 47 tar 在jar包中Driv
  • Grafana图表配置快速入门

    1 Grafana图表配置快速入门 前面我们使用 Prometheus Grafana 实现了一个简单的 CPU 使用率变化图 但是这个图还有许多缺陷 例如 左边栏的数值太小了无法调整 下面的图标信息无法定制化等等 其实 Grafana 的
  • ifconfig出现command not found解决办法

    问题 说下我linux配置情况 不一样的可以选择借鉴我的办法 在虚拟机中以最小化方式安装centos7 ifconfig命令无效 而且在sbin目录中没有ifconfig文件 原因 这是因为centos7已经不适用ifconfig命令了 已
  • vue监听一个对象的多个属性

    可以分开监听 但是不能深度监听 不能监听对象 只能 监听属性 如果监听对象 直接在handler外层加上对象名就可以了 下面加deep和immediate都为true watch lineType t console log t rowTy
  • RT-Thread记录(十四、I/O 设备模型之ADC设备)

    RT Thread ADC 设备学习使用 目录 前言 一 ADC 采样基础 1 1 ADC 通道 1 2 ADC 分辨率 1 3 ADC 采样计算 二 ADC 设备操作函数 2 1 查找 ADC 设备 2 2 使能 关闭 ADC 通道 2