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.3 读取采样值 三、adc 设备示例
3.1 adc 设备使用步骤 3.2 测试 结语
前言 我曾经考虑过把 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个:
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 设备模型部分其实前面几篇博文学会了,也就会了,其他的只不过是需要花时间看一看。


车规MCU的安全启动固件
燃料气质量流量计的选型、安装及调零方法
你知道什么是晶体管微缩吗?它又是个什么情况呢?
运算放大器为什么要采用差分放大?
电力监控器的制作教程
RT-Thread记录(十四、I/O 设备模型之ADC设备)
LiClO4-PVDF导锂型粘结剂和电极浆料工艺助推硫化物全固态电池规模化制造
微软 Mojang 官宣《Minecraft Earth》将于 6 月 30 日关闭
需求技术双驱动 中国安防监控市场规模高速增长
西部数据推出WD_BLACK P10 CFHD 限量版游戏硬盘, 开启硬派畅玩游戏体验
镁空气电池的工作原理_镁空气电池的使用寿命
华为Nova3怎么样 续航和游戏方面可圈可点
东芝闪存子公司拟发优先股融资27亿美元 拯救母公司
目前应用较普遍的再流焊方式FC组装工艺的介绍
DshanMCU-R128s2硬件设计指南
阿里研发全球首个实时翻译直播
阿克希龙电能管理系统
深度测评Jeep自由侠1.4T
一个超实用的EDA工具,免费的EDA工具
基于AD608芯片的对数中频低功耗接收机设计