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

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 设备模型部分其实前面几篇博文学会了,也就会了,其他的只不过是需要花时间看一看。

  • 2
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 0
    评论
RT-Thread作品秀】基于嵌入式操作系统的机器人欠驱动控制模型算法设计与实现作者:yijuanzhi 概述机器人运动系统式一套高复杂性、高耦合性、驱动力小于机体物理自由度的非线性系统,为了实现机器人在空间中稳定的运动姿态控制,本设计把机器人运动系统在空间中的运动形式等效成了旋转倒立摆模型,基于该模型的运动特点,分别设计了速度闭环控制算法和角度闭环控制算法,通过双闭环控制算法来实现对空间中旋转倒立摆的稳定控制。 开发环境硬件:该设计硬件依托于ART-PI开发平台,主控芯片采用STM32H750高性能单片机,同时采用TB6612芯片作为旋转倒立摆的核心动力驱动,采用霍尔传感器作为速度采集,采用高精度电位器作为摆臂角度采集传感器,采用OLED屏幕来进行参数的显示,与实时调整。 RT-Thread版本:RT-Thread版本采用4.0.2 开发工具及版本:mdk5.32版本 RT-Thread使用情况概述本设计采用rt-thread 4.0.2 master版本,用到了该操作系统的全内核、FinSH控制台交互,SPI驱动、ADC驱动、编码器驱动、PWM驱动等相关系统驱动,并且编写了双闭环PID控制算法。 硬件框架软件框架说明本设计硬件平台基于ART-PI,核心部分已经固定,针对旋转倒立摆机械部分,其结构如下图所示: 软件模块说明 本设计最关键的部分是PID算法的实现,针对倒立摆的运动特点,进行了优化与调整,PID算法的实现基于经典控制理论中线性控制的理论基础: 在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节[6]。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定, 在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例加积分(PI)控制器,可以使系统在进入稳态后无稳态误差。 微分(D)控制 在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入“比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例微分(PD)控制器能改善系统在调节过程中的动态特性。 演示效果示意链接: 代码地址在附件。比赛感悟本次比赛基本是利用业余时间一点一点完成,中间遇到了一些困难,主要问题出现在对芯片的底层配置上,不过通过对比手册介绍与仿真,都能初步解决。得益于RT-Thread操作系统完善的内核管理,调试交互,驱动设计、使得在设计中少走了很多弯路,加快了开发速度,推荐大家都来尝试使用该系统,真的很好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页
评论

打赏作者

矜辰所致

您们的鼓励是我奋斗的动力!

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值