RT-Thread 记录(十四、I/O 设备模型之 ADC 设备)
前言
我曾经考虑过把 RT-Thread 常用的设备都写完,其实通过前面的《全面认识 RT-Thread I/O 设备模型》文章学习,以及 UART 和 PIN 设备的学习分析,对于 RT-Thread 其他的一些设备 自己看资料基本都可以用起来了,都是同样的思路,自己写写程序测试都可以用起来了。
再加上 RT-Thread 有很多软件包,正真的我们实际的普通应用中需要自己写的也不会太多(除非你使用的设备传感器是小众品牌或者新品,那根据前面文章也刻意自己尝试把驱动写好),所以我再简单的测试几个典型的设备,设备驱动篇也就算更新完了。
本文相对比较轻松,测试一下简单的 ADC 设备。
本 RT-Thread 专栏记录的开发环境:
RT-Thread 记录(一、RT-Thread 版本、RT-Thread Studio 开发环境 及 配合 CubeMX 开发快速上手)
https://xie.infoq.cn/article/44be1057caace7a6a2c4c4b59
RT-Thread 记录(二、RT-Thread 内核启动流程 — 启动文件和源码分析)
https://xie.infoq.cn/article/44be1057caace7a6a2c4c4b59
RT-Thread 内核篇系列博文链接:
RT-Thread 记录(三、RT-Thread 线程操作函数及线程管理与 FreeRTOS 的比较)
https://xie.infoq.cn/article/1d2e8e030ae689d6b8ee44b05
RT-Thread 记录(四、RT-Thread 时钟节拍和软件定时器)
https://xie.infoq.cn/article/3198c9b741782036bfd6e54e9
RT-Thread 记录(五、RT-Thread 临界区保护
https://xie.infoq.cn/article/7a41020e03184950664df7391
RT-Thread 记录(六、IPC 机制之信号量、互斥量和事件集)
https://xie.infoq.cn/article/1f49bfd6c69377deb9eee838f
RT-Thread 记录(七、IPC 机制之邮箱、消息队列)
https://xie.infoq.cn/article/360b04e7bc6024917afecef1d
RT-Thread 记录(八、理解 RT-Thread 内存管理)
https://xie.infoq.cn/article/bd5d8f8a19fa11ea9feacf34d
RT-Thread 记录(九、RT-Thread 中断处理与阶段小结)
https://xie.infoq.cn/article/3da9530cfac06feece3523a0c
RT-Thread 设备篇系列博文链接:
RT-Thread 记录(十、全面认识 RT-Thread I/O 设备模型)
https://xie.infoq.cn/article/40536d29988d683c78b4ba5ff
RT-Thread 记录(十一、I/O 设备模型之 UART 设备 — 源码解析)
https://xie.infoq.cn/article/38bb4bf15cb81f1fdb060b29e
RT-Thread 记录(十二、I/O 设备模型之 UART 设备 — 使用测试)
https://xie.infoq.cn/article/1df47f3ae5174dfcb418b07b6
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 设备模型通用的查找函数:
但是这里需要额外说明的是,使用此函数查找 ADC 设备需要强制转换一下,我们定义用来接收的设备句柄不是使用rt_device_t
,而应该使用rt_adc_device_t
:
2.2 使能/关闭 ADC 通道
根据自己使用的 GPIO 引脚(对应上文 ADC 通道表格),对 ADC 通道进行使能和关闭。
使能 ADC 通道:
关闭 ADC 通道:
2.3 读取采样值
三、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 设备模型部分其实前面几篇博文学会了,也就会了,其他的只不过是需要花时间看一看。
版权声明: 本文为 InfoQ 作者【矜辰所致】的原创文章。
原文链接:【http://xie.infoq.cn/article/2eda5e23a77db3a60d2595d97】。文章转载请联系作者。
评论