【嵌入式 – GD32开发实战指南(ARM版)】第1部分 基础篇

您所在的位置:网站首页 华为怎么触发单手模式切换 【嵌入式 – GD32开发实战指南(ARM版)】第1部分 基础篇

【嵌入式 – GD32开发实战指南(ARM版)】第1部分 基础篇

2023-10-13 14:37| 来源: 网络整理| 查看: 265

目录 隐藏 12.1 ADC工作原理 12.1.1 ADC架构 12.1.2 ADC通道选择 12.1.3 ADC转换模式 12.2 ADC寄存器描述 12.3 ADC具体代码实现 12.3.1 ADC单通道电压采集查询方式实现 12.3.2 ADC单通道电压采集中断方式实现 12.3.3 ADC单通道电压采集DMA方式实现 12.4实验现象 欢迎访问我的网站 资源获取方式

开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK

12.1 ADC工作原理

GD32F2系列有 3 个逐次逼近型的ADC,精度为 12 位,有18个多路复用通道,可以转换来自16个外部通道和2个内部通道的模拟信号。其中ADC0 和 ADC1都有 16 个外部通道, ADC2 根据 CPU 引脚的不同通道数也不同,一般都有8 个外部通道。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。ADC 的输入时钟不得超过28MHz,它是由PCLK2经分频产生。

12.1.1 ADC架构

ADC架构如下图所示。

jIUZQ0.md.png

1.电压输入范围

ADC 输入范围为:VREFN ≤ VIN ≤ VREFP。由VREFN、VREFP、VDDA、VSSA这四个外部引脚决定。

我们在设计原理图的时候一般把 VSSA 和 VREFN接地,把VREFP和 VDDA 接 3V3,得到ADC 的输入电压范围为: 0 ~ 3.3V。在 64 脚以下的 CPU 中,没有VREFN和 VREFP这两个引脚, ADC 电压输入范围直接由 VDDA和 VSSA决定。如果我们想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到 0~3.3V,这样 ADC 就可以测量。

jIUueU.md.png

【注】VDDA和VSSA必须分别连接到VDD和VSS。

2.输入通道

我们确定好ADC输入电压之后,那么电压怎么输入到 ADC?这里我们引入通道的概念,GD32 的ADC多达18个通道,其中外部的16个通道就是框图中的 ADCx_IN0、ADCx_IN1…ADCx_IN5。这16个通道对应着不同的 IO 口,具体是哪一个 IO 口可以从手册查询到。其中 ADC0/1/2还有内部通道: ADC0 的通道 16 连接到了芯片内部的温度传感器, Vrefint 连接到了通道 17。 ADC1 的模拟通道 16 和 17 连接到了内部的 VSS。ADC2 的模拟通道 9、 14、 15、 16 和 17 连接到了内部的 VSS。

外部的 16 个通道在转换的时候又分为规则通道和注入通道,其中规则通道最多有 16路,注入通道最多有 4 路。那这两个通道有什么区别?在什么时候使用?

规则通道 规则通道:规则通道就是很规矩的意思,我们平时一般使用的就是这个通道,或者应该说我们用到的都是这个通道,没有什么特别要注意的可讲。

注入通道 注入,可以理解为插入,插队的意思,是一种不安分的通道。它是一种在规则通道转换的时候强行插入要转换的一种。如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程。这点跟中断程序很像,都是不安分的主。所以,注入通道只有在规则通道存在时才会出现。

3.转换顺序 ADC支持18个多路通道,可以把转换组织成两组:一个规则组通道和一个注入组通道。

规则组,可以按照特定的序列组织成多达16个转换的序列。ADC_RSQ0~ADC_RSQ2寄存器规定了规则组的通道选择。ADC_RSQ0寄存器的RL[3:0]位规定了整个规则组转换序列的长度。

注入组,可以按照特定的序列组织成多达4个转换的序列。ADC_ISQ寄存器规定了注入组的通道选择。ADC_ISQ寄存器的IL[1:0]位规定了整个注入组转换序列的长度。

4.触发源 通道选好了,转换的顺序也设置好了,那接下来就该开始转换了。 ADC 转换可以由ADC_CTL1的 ADON 这个位来控制,写 1 的时候开始转换,写 0 的时候停止转换,这个是最简单也是最好理解的开启 ADC 转换的控制方式,理解起来没啥技术含量。

除了这种庶民式的控制方法, ADC 还支持触发转换,这个触发包括内部定时器触发和外部 IO 触发。触发源有很多,具体选择哪一种触发源,由 ADC_CTL1的ETSRC[2:0]和ETSIC[2:0]位来控制。ETSRC[2:0]用于选择规则通道的触发源,ETSIC[2:0]用于选择注入通道的触发源。选定好触发源之后,触发源是否要激活,则由ADC_CTL1的 ETERC和 ETEIC这两位来激活。

5.数据寄存器 一切准备就绪后,ADC 转换后的数据根据转换组的不同,规则组的数据放在ADC_RDATA寄存器,注入组的数据放在ADC_IDATAx。

6.中断转换结束中断 数据转换结束后,可以产生中断,中断分为三种:规则通道转换结束中断,注入转换通道转换结束中断,模拟看门狗中断。其中转换结束中断很好理解,跟我们平时接触的中断一样,有相应的中断标志位和中断使能位,我们还可以根据中断类型写相应配套的中断服务程序。

模拟看门狗中断 当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启了模拟看门狗中断,其中低阈值和高阈值由 ADC_WDHT 和 ADC_WDLT置。例如我们设置高阈值是 2.5V,那么模拟电压超过 2.5V 的时候,就会产生模拟看门狗中断,反之低阈值也一样。

DMA 请求 DMA 请求可以通过设置 ADC_CTL1 寄存器的 DMA 位来使能,它用于传输规则组多个通道的转换结果。 ADC 在规则组一个通道转换结束后产生一个 DMA 请求, DMA 接受到请求后可以将转换的数据从 ADC_RDATA 寄存器传输到用户指定的目的地址。

注意: 只有 ADC0 和 ADC2 有 DMA 功能, ADC1 转换的数据可以在 ADC 同步模式下传输。

7.转换时间

ADC 时钟

ADC 输入时钟 ADCCLK由 PCLK2 经过分频产生,最大是28M,分频因子由 RCC 时钟配置寄存器RCU_CFG0的位 15:14 ADCPSC[1:0]设置,可以是 2/4/6/8/12/16 分频,注意这里没有 1 分频。一般我们设置 PCLK2=HCLK=120M。

采样时间 ADC 使用若干个 ADCCLK 周期对输入的电压进行采样,采样的周期数可通过 ADC采样时间寄存器ADC_SAMPT0 和 ADC_SAMPT1中的 SMP[2:0]位设置,ADC_SAMPT1控制的是通道 0 ~ 9,

ADC_SAMPT0 控制的是通道 10 ~ 17。每个通道可以分别用不同的时间采样。其中采样周期最小是 1.5 个,即如果我们要达到最快的采样,那么应该设置采样周期为 1.5个周期,这里说的周期就是 1/ADCCLK。

ADC 的转换时间跟 ADC 的输入时钟和采样时间有关,公式为:

Tconv = 采样时间 +12.5 个周期。

例如,当 ADCLK = 14MHz,采样时间设置为 1.5 周期(最快),那么总的转换时间:

Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 1us。

8.电压转换

模拟电压经过 ADC 转换后,是一个 12 位的数字值,如果通过串口以 16 进制打印出来的话,可读性比较差,那么有时候我们就需要把数字电压转换成模拟电压,也可以跟实际的模拟电压(用万用表测)对比,看看转换是否准确。

我们一般在设计原理图的时候会把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.3 * X ) / 2^12。

12.1.2 ADC通道选择

GD32 将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。

规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。

通过一个形象的例子可以说明: 假如你在家里的院子内放了 5 个温度探头,室内放了 3 个温度探头; 你需要时刻监视室外温度即可,但偶尔你想看看室内的温度;因此你可以使用规则通道组循环扫描室外的 5 个探头并显示 AD 转换结果,当你想看室内温度时,通过一个按钮启动注入转换组(3个室内探头)并暂时显示室内温度,当你放开这个按钮后,系统又会回到规则通道组继续检测室外温度。从系统设计上,测量并显示室内温度的过程中断了测量并显示室外温度的过程,但程序设计上可以在初始化阶段分别设置好不同的转换组,系统运行中不必再变更循环转换的配置,从而达到两个任务互不干扰和快速切换的结果。可以设想一下,如果没有规则组和注入组的划分,当你按下按钮后,需要从新配置 AD 循环扫描的通道,然后在释放按钮后需再次配置 AD 循环扫描的通道。

jIUJQx.md.png

上面的例子因为速度较慢,不能完全体现这样区分(规则通道组和注入通道组)的好处,但在工业应用领域中有很多检测和监视探头需要较快地处理,这样对 AD 转换的分组将简化事件处理的程序并提高事件处理的速度。

GD32 其 ADC 的规则通道组最多包含 16 个转换,而注入通道组最多包含 4 个通道。关于这两个通道组的详细介绍,请参考《GD32参考手册》,我们这里就不在一一列举了。

温度传感器和通道ADC0_IN16相连接,内部参照电压VREFINT和ADC0_IN17相连接。可以按注入或规则通道对这两个内部通道进行转换。

【注意】温度传感器和VREFINT只能出现在主ADC0 中。

12.1.3 ADC转换模式

 单次转换模式

该模式能够运行在规则组和注入组。单次转换模式下, ADC_RSQ2寄存器的RSQ0[4:0]位或者ADC_ISQ寄存器的ISQ3[4:0]位规定了ADC的转换通道。当ADCON位被置1,一旦相应软件触发或者外部触发发生, ADC就会采样和转换一个通道。

规则通道单次转换结束后,转换数据将被存放于ADC_RDATA寄存器中, EOC将会置1。如果EOCIE位被置1,将产生一个中断。

注入通道单次转换结束后,转换数据将被存放于ADC_IDATA0寄存器中, EOC和EOIC位将会置1。如果EOCIE或EOICIE位被置1,将产生一个中断。

jIawuV.md.png

 连续转换模式 在该模式可以运行在规则组通道上。对ADC_CTL1寄存器的CTN位置1可以使能连续转换模式。在此模式下, ADC执行由RSQ0[4:0]规定的转换通道。当ADCON位被置1,一旦相应软件触发或者外部触发产生, ADC就会采样和转换规定的通道。转换数据保存在ADC_RDATA寄存器中。

jIaoUe.md.png

 扫描模式 扫描转换模式可以通过将ADC_CTL0寄存器的SM位置1来使能。在此模式下, ADC扫描转换所有被ADC_RSQ0~ADC_RSQ2寄存器或ADC_ISQ寄存器选中的所有通道。一旦ADCON位被置1,当相应软件触发或者外部触发产生, ADC就会一个接一个的采样和转换规则组或注入组通道。转换数据存储在ADC_RDATA或ADC_IDATAx寄存器中。规则组或注入组转换结束后,EOC或者EOIC位将被置1。如果EOCIE或EOICIE位被置1,将产生中断。当规则组通道工作在扫描模式下时, ADC_CTL1寄存器的DMA位必须设置为1。

如果ADC_CTL1寄存器的CTN位也被置1,则在规则通道转换完之后,这个转换自动重新开始。

jIaT4H.md.png

 间断模式

规则组 对于规则组, ADC_CTL0 寄存器的 DISRC 位置 1 使能间断转换模式。该模式下可以执行一次n 个通道的短序列转换(n



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3