嵌入式——模拟/数字转换器(ADC)补充

目录

一、ADC简介

二、ADC功能

1.电压输入范围

2.输入通道

3. 转换顺序

(1)规则序列

(2) 注入序列

4.触发源

5. 转换时间

(1) ADC时钟

(2) 采样时间

6. 数据寄存器

(1) 规则数据寄存器

(2)注入数据寄存器

7. 中断

(1)转换结束中断

(2) 模拟看门狗中断

(3)DMA请求

8. 电压转换

三、ADC配置步骤(单通道ADC采集,DMA读取)


一、ADC简介

        STM32F103系列有3个ADC,精度为12位,每个ADC最多有16个外部通道。其中ADC1和ADC2都有16个外部通道,ADC3根据CPU引脚的不同通道数也不同,一般都有8个外部通道。ADC的模式非常多,功能非常强大。

二、ADC功能

1.电压输入范围

        ADC输入范围为:VREF- ≤ VIN ≤ VREF+,具体电压由VREF-、VREF+、VDDA、VssA这4个外部引脚决定。

        在设计原理图的时候,一般把VssA和VREF-接地,把VREF+和VDDA接3V3,得到ADC的输入电压范围为0~3.3V。

        如果想让 输入的电压范围变宽,达到可以测试负电压或者更高的正电压,则可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到 0~3.3V,这样ADC就可以测量。

2.输入通道

        确定好ADC的输入电压之后,电压通过通道输入到ADC。STM32的ADC有18个通道,其中外部的16个通道就是框图中的ADCx_IN0~ADCx_IN15,这16个通道对应着不同的 lO口。ADC1/2/3还有内部通道:ADC1的通道16连接到了芯片内部的温度传感器,Vrefint连接到了通道17;ADC2的模拟通道16和17连接到了内部的VSS;ADC3的模拟通道9、14、15、16和17连接到了内部的VSS。

        外部的16个通道在转换的时候又分为规则通道和注入通道,其中规则通道最多有16路,注入通道最多有4路

    (1) 规则通道:我们用到的都是这个通道。

    (2) 注入通道:是一种在规则通道转换的时候强行插入要转换的一种通道。如果在规则通道转换过程中有注入通道插队,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程。所以,注入通道只有在规则通道存在时才会出现

3. 转换顺序

(1)规则序列

        规则序列寄存器有3个(SQR3、SQR2、 SQR1)。SQR3控制着规则序列中的第1~6个转换,对应的位为:SQ1[4:0] ~ SQ6[4:0],第一次转换的是位4:0 SQ1[4:0]。SQR2控制着规则序列中的第7~12个转换,对应的位为:SQ7[4:0] ~ SQ12[4:0]。SQR1控制着规则序列中的第13~16个转换,对应位为:SQ13[4:0] ~ SQ16[4:0]

        具体使用多少个通道,由SQR1的位L[3:0]决定,最多16个通道。

(2) 注入序列

        注入序列寄存器JSQR只有一个,最多支持4个通道,具体多少个由JSQR的JL[2:0]决定。如果JL的值小于4,则JSQR与SQR决定转换顺序的设置不一样,第一次转换的不是JSQR1[4:0],而是JCQRx[4:0],x=(4-JL)与SQR相反。如果JL=00(1个转换),那么转换的顺序从JSQR4[4:0]开始,而不是从JSQR1[4:0]开始。当JL等于4时,与SQR一样

4.触发源

        通道选好了,转换的顺序也设置好了,接下来开始转换。ADC可以由ADC控制寄存器2 (ADC_CR2) 的ADON位来控制,写1的时候开始转换,写0的时候停止转换( 开启ADC转换最简单的控制方式 )。

        除此之外,ADC还支持触发转换,这个触发包括内部定时器触发和外部IO触发。触发源有很多,具体选择哪一种触发源,由ADC控制寄存器2 (ADC_CR2) 的EXTSEL[2:0]和JEXTSEL[2:0]位控制。EXTSEL[2:0]用于选择规则通道的触发源,JEXTSEL[2:0]用于选择注入通道的触发源。选定好触发源之后,触发源是否要激活,则由ADC控制寄存器2 (ADC_CR2)的EXTTRIG和JEXTTRIG位来激活。

5. 转换时间

(1) ADC时钟

        ADC输入时钟ADC_CLK由PCLK2经过分频产生,最大是14MHz。分频因子由RCC时钟配置寄存器RCC_CFGR的位15:14 ADCPRE[1:0]设置,可以是2、4、6、8分频。

注:没有1分频。一般设置 PCLK2=HCLK=72MHz

(2) 采样时间

        ADC使用若干个ADC_CLK周期对输入的电压进行采样,采样的周期数可通过ADC采样时间寄存器ADC_SMPR1和ADC_SMPR2中的SMP[2:0]位设置,ADC_SMPR2控制的是通道0~9,ADC_SMPR1控制的是通道10~17。每个通道可以分别用不同的时间采样。其中采样周期最小是1.5个(如果要达到最快的采样可以设置采样周期为1.5周期)。

这里说的 周期就是 1 / ADC_CLK

        ADC的转换时间与ADC的输入时钟和采样时间有关,公式为:Tconv = 采样时间 + 12.5个周期

        ADCLK=14MHz(最高),采样时间设置为1.5周期(最快),那么总的转换时间 (最短Tconv = 1.5周期 + 12.5周期 = 14周期 = 1𝛍s。

        一般设置 PCLK2=72MHz,经过ADC预分频器能分频到的最大时钟只能是12MHz,采样周期设置为 1.5周期,算出 最短的转换时间为 1.17𝛍s,这个才是最常用的。

6. 数据寄存器

        ADC转换后的数据根据转换组的不同,规则组的数据放在ADC_DR寄存器中,注入组的数据放在JDRx中。

(1) 规则数据寄存器

        ADC规则组数据寄存器ADC_DR只有一个,是一个32位的寄存器,低16位在单ADC时使用,高16位用于在ADC1的双模式下保存ADC2转换的规则数据(双模式就是ADC1和ADC2同时使用)。

        在单模式下,ADC1/2/3都不使用高16位。因为ADC的精度是12位,无论ADC_DR的高16或者低16位都放不满,只能左对齐或者右对齐,具体以哪一种方式存放,由ADC_CR2的第11位ALIGN设置。

        规则通道可以有 16个之多,可规则数据寄存器只有一个,如果使用多通道转换,那转换的数据就全部都挤在了 DR里面,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通道转换的数据覆盖掉。所以当通道转换完成后就应该把 数据取走,或者开启DMA模式,把数据传输到内存里面,不然就会造成数据的覆盖。最常用的做法就是开启DMA传输。

(2)注入数据寄存器

        ADC注入组最多有4个通道,注入数据寄存器也有4个,每个通道对应着自己的寄存器,不会像规则寄存器那样产生 数据覆盖的问题。

        ADC_JDRx是32位的,低16位有效,高16位保留,数据同样分为左对齐和右对齐,具体以哪一种方式存放,由ADC_CR2的第11位ALIGN设置。

7. 中断

        数据转换结束后,可以产生中断。中断分为3种:则通道转换结束中断、注入转换通道转换结束中断、模拟看门狗中断

(1)转换结束中断

        与平时的中断一样,有相应的中断标志位和中断使能位,还可以根据中断类型写相应配套的中断服务程序

(2) 模拟看门狗中断

        当被ADC转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是开启了模拟看门狗中断,其中低阈值和高阈值由ADC_LTR和ADC_HTR设置。

        e.g. 如果设置高阈值是2.5V,那么当模拟电压超过2.5V的时候,就会产生模拟看门狗中断,反之低阈值也一样。

(3)DMA请求

        规则和注入通道转换结束后,除了产生中断外,还可以产生DMA请求把转换好的数据直接存储在内存里面一般在使用ADC的时候都会开启DMA传输

注:只有 ADC1 和 ADC3可以产生 DMA请求。 

8. 电压转换

        模拟电压经过ADC转换后,变成一个12位的数字值,如果通过串口以十六进制数输出,可读性比较差,因此有时候就需要把数字电压转换成模拟电压

        一般在设计原理图的时候会把ADC的输入电压范围设定在 0~3.3V,因为ADC是12位的,那么12位满量程对应的就是3.3V,12位满量程对应的数字值是:2^12。数值0对应的就是0V。如果转换后的数值为X,X对应的模拟电压为Y,那么会有以下等式成立:

        2^12 / 3.3=X / Y  ⇨  Y=(3.3X) / 2^12

三、ADC配置步骤(单通道ADC采集,DMA读取)

1. 初始化DMA:HAL_DMA_Init()

2. 将DMA和ADC句柄联系起来:__HALLINKDMA()

3. 配置ADC工作参数、ADC校准:HAL_ADC_Init()、 HAL_ADCEx_Calibration_Start()

4. ADC MSP初始化:HAL_ADC_Msplnit() ( 配置NVIC、CLOCK、GPIO等)

5. 配置ADC相应通道相关参数:HAL_ADC_ConfigChannel()

6. 使能DMA数据流传输完成中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnablelRQ()

7. 编写DMA数据流中断服务函数:DMAx_Channely_IRQHandler()

8. 启动DMA,开启传输完成中断:HAL_DMA_Start_IT()

9. 触发ADC转换,DMA传输数据:HAL_ADC_Start_DMA()


可以参考这篇文章:

     嵌入式——模拟/数字转换器(ADC)

http://t.csdnimg.cn/ytKsUicon-default.png?t=N7T8http://t.csdnimg.cn/ytKsU

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ETL怎么实现文件处理

在现代企业及各类组织的日常运作中,数据作为一种关键的信息资源,其管理和分析能力直接影响到决策效率与准确性。文件作为数据的主要载体,承载着从运营报告、客户记录、交易明细等各种类型的数据信息。这些海量且多样的文件数据在未经处理的情…

母排设计时没有柜体3D数据?来试试SuperPanel的钣金功能!

CAD版SuperPanel软件能够助力用户快速、准确地设计和修改母排,同时快速输出加工图纸和数控加工代码。在壳体外购,没有柜体3D数据的情况下,如何轻松进行母排设计?一起来学习利驰数字母排的钣金功能吧! SuperPanel的钣金…

通过实测,让你从书客、明基、好视力中选出最优质的护眼台灯

眼睛是我们与世界接触的最重要媒介之一,让我们能够观察到世间万物的美好。然而,由于种种原因,很多人都戴上了眼镜,这无疑在我们与世界的接触中增加了一层隔阂,给生活带来了诸多不便。为了缓解或避免近视的发生&#xf…

【前端-VUE+TS】Vue3组件化-下(五)

一. 插槽的使用 1.1. 认识插槽slot 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示;但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的d…

STM32F407ZGT6——实验9-4 通用定时器脉冲计数实验

一、配置路线 二、问题及反思 配置的时候误以为需要先把【输入捕获配置】了再去配置【从模式】,后面验证了这样配置没办法产生预期的效果。 代码如下:void gtim_timx_cnt_chy_init(uint16_t psc, uint16_t arr) void gtim_timx_cnt_chy_init(uint16_t…

MyBatis 源码系列:MyBatis 解析配置文件、二级缓存、SQL

文章目录 解析全局配置文件二级缓存解析解析二级缓存缓存中的调用过程缓存中使用的设计模式 解析SQL 解析全局配置文件 启动流程分析 String resource "mybatis-config.xml"; //将XML配置文件构建为Configuration配置类 reader Resources.getResourceAsReader(re…

【3分钟开服】幻兽帕鲁服务器一键部署保姆教程

在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或肢解后食用。 引用自&#x…

脚本实现两台windows 机器间多个目录中文件同步到某个特定的目录里

脚本实现两台windows 机器间多个目录中文件同步到某个特定的目录里 要求:将172.20.26.74 中的test1、test2文件夹里的文件都同步到172.20.26.87机器上的t1文件夹里。 1、两台机器,关闭防火墙,能相互ping通,在172.20.26.87机器上将…

Windows编程入门-窗口控件-资源操作

window控件: 控件是常见的窗口上的交互元素例如:一个按钮,一个复选框,一个列表框等。 当控件的特定功能被触发后,会主动发送消息通知父窗口,父窗口可以通过发送消息给控件控制控件的行为。 控件的本质是一个…

Utreexo:优化Bitcoin UTXO集合的基于哈希的动态累加器

1. 引言 前序博客: Utreexo:比特币UTXO merkle tree proof以节约节点存储空间 MIT Digital Currency Initiative 的 Thaddeus Dryja 2019年论文 Utreexo: A dynamic hash-based accumulator optimized for the Bitcoin UTXO set。 开源代码实现见&…

Kafka 记录

推荐资源 官网http://kafka.apache.org/Githubhttps://github.com/apache/kafka书籍《深入理解Kafka 核心设计与实践原理》 Kafka 架构 Kafka使用ZooKeeper作为其分布式协调框架,其动态扩容是通过ZooKeeper来实现的。Kafka使用Zookeeper保存broker的元数据和消费者信…

使用流服务器m7s对接gb28181

优:sip品牌兼容性比较好,大华,海康都稳定可以,srs的5.0 sip品牌兼容性大华没反应,akstream-sip 大华也有问题,wvp也还可以 缺:目前最新的4.7.4版本,,sip协议用udp正常&a…

年底特殊时期外贸装柜多花点心思

如果可以,尽量不要在工厂快要放假的时候安排装柜了,一个是人手不够,一个是容易漏货,还有就是柜子不好定。 看到有人说自己客户收到货的时候比预期晚了两个星期,一直延误,已经比原来要计划开业的时间推迟&a…

mini-spring 实现应用上下文,自动识别、资源加载、扩展机制

我们不能让面向 Spring 本身开发的 DefaultListableBeanFactory 服务,直接给予用户使用 DefaultListableBeanFactory、XmlBeanDefinitionReader,是我们在目前 Spring 框架中对于服务功能测试的使用方式,它能很好的体现出 Spring 是如何对 xm…

Cocos creator 动作系统

动作系统简介 是用于控制物体运动的一套系统,完全依赖代码进行实现,动态调节节点的移动。 移动 cc.moveTo 移动到某个坐标(x,y) //1秒时间内,移动到0,0let action1 cc.moveTo(1,0,0)this.node.runAction(action1)c…

Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!

Walrus file 是 Walrus 0.5 版本推出的新功能,用户可以通过一个非常简洁的 YAML 描述应用或基础设施资源的部署配置,然后通过 Walrus CLI 执行 walrus apply或在 Walrus UI 上进行import,将 Walrus file 提交给 Walrus server,由 …

Qt简易的五子棋

五子棋是个简单的小游戏,尝试使用Qt将他做出来,学习时的练习demo。 成果展示 需求分析 五子棋:在棋盘上,黑棋先行,交替下棋,五子练成直线获取胜利。 实现过程 1.棋盘绘制:下棋的第一步肯定是绘制…

7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析

本文给大家介绍一下在 Spring Boot 项目中如何集成消息队列 RabbitMQ,包含对 RibbitMQ 的架构介绍、应用场景、坑点解析以及代码实战。 我将使用 waynboot-mall 项目作为代码讲解,项目地址:https://github.com/wayn111/waynboot-mall。本文大…

无需 Root 卸载手机预装软件,精简过的老年机又行了

基础准备 准备目标手机、USB 数据线、以及一台电脑。手机 USB 连接电脑,开发者选项中打开 USB 调试。(开发者选项默认隐藏,需要在关于手机中多次点击版本号才能调出)。 安装手机驱动,下载安装 ADB 工具包。 开始操作…

世界坐标系转换为平面地图坐标

将世界坐标系转换为平面地图坐标的方法通常涉及地图投影。地图投影是一种将地球(一个三维球体)上的点转换为平面(二维)地图上的点的方法。 这里介绍几种常见的地图投影方法: 墨卡托投影(Mercator Projection): 这是最常见的投影方式之一,尤其用于航海地图。它将经纬度…