STM32之模数转换器(ADC)

一、模数转换器介绍

1、模数转换器简介

为什么使用模拟转换器??

因为MCU只能识别01010101的数字信号,而外部物理信号均为模拟信号,如声音、光、电等,所以为了让计算机能够处理外部物理的信息,必须要通过模拟转换器将模拟量转换成数字量。

模数转换器:将模拟信号转换成数字信号的电路。

用途:主要用在各类传感器(主要)的测量结果。

2、模数转换器分类及原理

根据转换原理的不同,常用的有并联比较型ADC和逐次逼近型ADC。

ADC转换组成:采样+转换

(1)采样:对模拟量的采集。

(2)转换:将采集的信号转换为数字量。

注意:在转换之前,送入AD的量都是模拟量(电压值)

并联比较型

(1)物理结构

E:基准(参考)电压源

Ux:输入被转换的信号,由硬件(电压转换电路)将物理信号(光、声等)转换得到的。

(2)电路组成:电阻分压器、比较器和编码器。

(3)特点:转换速度快,位数越多所需比较器数目越多,成本越高、功耗越大。

比较原理:将输入电压与所有的参考电压做比较,然后将比较结果进行编码,最后输出数字信号。

逐次逼近型

电路组成:一个基准电压源、一个比较器、D/A转换器、缓冲寄存器及控制逻辑电路组成。

特点:线路构成简单,稳定性高,转换的速度慢。

原理:和天平相似,左物右码。不断的把电压值趋向于输入进来需要比较的电压值。一份一份的电压不断取出来进行比较,如果大小不足就继续加,如果超了则换成更小的。

3、模数转换器重要参数

(1)分辨率(灵敏度或精度):A/D对模拟信号的分辨能力或能被A/D辨别的最小模拟量变化。通常分为8、10、12、16位等。位数越多,对输入信号(模拟量)的分辨能力就越高。

(2)转换时间:转换时间是A/D完成一次转换所需的时间,代表了ADC的转换速度,与ADC的时钟频率、采样周期、转换周期相关。

(3)转换速度:一般情况下等于转换时间的倒数,具体速度取决于转换电路的类型,并联比较型ADC最高(小于50ns),逐次逼近型ADC次之(10~100us之间)。

(4)绝对精度:实际值和理论值的一个偏差。

二、STM32模数转换器介绍

1、STM32模数转换器简介

12 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次连续扫描不连续采样模式下进行。 ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。ADC 具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。

2、STM32模数转换器特征

可配置 12 位、 10 位、 8 位或 6 位分辨率
在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断
单次(只转换一次)和连续转换(不停的转换)模式
用于自动将通道 0 转换为通道“n”的扫描模式
数据对齐以保持内置数据一致性(选择右对齐)
可独立设置各通道采样时间
外部触发器选项,可为规则转换和注入转换配置极性(硬件触发转换)
不连续采样模式
双重 /三重模式(具有 2 个或更多 ADC 的器件提供)
双重 /三重 ADC 模式下可配置的 DMA 数据存储
双重 /三重交替模式下可配置的转换间延迟
ADC 转换类型(参见数据手册)
ADC 电源要求:全速运行时为 2.4 V 到 3.6 V,慢速运行时为 1.8 V(决定当前的ADC的时钟频率)
ADC 输入范围: VREF—  VIN  VREF+
规则通道转换期间可产生 DMA

3、STM32模数转换器相关概念

转换方式:

规则转换:可以类比主函数,是按照从上往下的顺序依次执行的-- ADC的转换按照通道的顺序依次转换

注入转换:可以类比中断,可以打断规则转换 ,转换完了以后再回到规则转换继续

序列(组)转换:

规则转换组:可以在19个复用通道中选择某一些通道作为规则组里的通道(16个通道)

注入转换组:可以在19个复用通道中选择某一些通道作为注入组里的通道(4个通道)

组别关系到扫描方式

三、STM32模数转换器框架

先选择哪几个通道给到是注入组还是规则组,选择分频值(决定采样和转换时间),选择硬件还是软件触发,转换结束后把相应的数据存到数据寄存器里,再有相应的转换结束标志位置1,如果开启了中断,则会进入中断服务函数。

通道选择:

16 条复用通道。可以将转换分为两组:规则转换和注入转换。每个组包含一个转换序列,该序列可按任意顺序在任意通道上完成。例如,可按以下顺序对序列进行转换: ADC_IN3ADC_IN8ADC_IN2ADC_IN2ADC_IN0ADC_IN2ADC_IN2ADC_IN15
   
一个规则转换组最多由 16 个转换构成。必须在 ADC_SQRx 寄存器中选择转换序列的规 则通道及其顺序。规则转换组中的转换总数必须写入 ADC_SQR1 寄存器中的 L[3:0] 位。(规则组转换通道总数
   
一个注入转换组最多由 4 个转换构成。必须在 ADC_JSQR 寄存器中选择转换序列的注入 通道及其顺序。注入转换组中的转换总数必须写入 ADC_JSQR 寄存器中的 L[1:0] 位。(注入组转换通道总数

如果在转换期间修改
ADC_SQRx ADC_JSQR 寄存器,将复位当前转换并向 ADC 发送一 个新的启动脉冲,以转换新选择的组。

触发方式

硬件触发:选择相应的外部硬件的触发源

软件触发:SWSTART(规则组) 或 JSWSTART(注入组) 位置 1 时,启动 AD 转换。

中断部分

使能相应的中断使能位,当发生相应的事件时就可以进入中断服务函数

ADC时钟

ADC 具有两个时钟方案:
● 用于模拟电路的时钟: ADCCLK,所有 ADC 共用此时钟来自于经可编程预分频器分频的 APB2 时钟,该预分频器允许 ADC 在 fPCLK2/2、/4、 /6 或 /8 下工作。有关 ADCCLK 的最大值,请参见数据手册。
● 用于数字接口的时钟(用于寄存器读 /写访问)
     此时钟等效于 APB2 时钟。可以通过 RCC APB2 外设时钟使能寄存器 (RCC_APB2ENR)
分别为每个 ADC 使能 /禁止数字接口时钟。

ADC的频率最好不要超过14Mhz

转换结果数据寄存器

设置转换时间:

采样时间 = 480 / 25M = 19.2us

四、STM32模数转换器相关寄存器

ADC 状态寄存器 (ADC_SR) (ADC转换过程中的各种标志位)

位 5 OVR溢出 (Overrun)

数据丢失时,硬件将该位置 1(在单一模式或双重/三重模式下)。

但需要通过软件清零。溢出检测仅在 DMA = 1 或 EOCS = 1 时使能。

0:未发生溢出

1:发生溢出

位 4 STRT规则通道开始标志 (Regular channel start flag) 规则通道转换开始时,硬件将该位置 1。

但需要通过软件清零。

0:未开始规则通道转换

1:已开始规则通道转换

位 3 JSTRT注入通道开始标志 (Injected channel start flag) 注入组转换开始时,硬件将该位置 1。

但需要通过软件清零。

0:未开始注入组转换

1:已开始注入组转换

位 2 JEOC注入通道转换结束 (Injected channel end of conversion)

组内所有注入通道转换结束时,硬件将该位置 1。但需要通过软件清零。

0:转换未完成

1:转换已完成

位 1 EOC规则通道转换结束 (Regular channel end of conversion)

规则组通道转换结束后,硬件将该位置 1。通过软件或通过读取 ADC_DR 寄存器将该位清零。

0:转换未完成 (EOCS=0) 或转换序列未完成 (EOCS=1)

1:转换已完成 (EOCS=0) 或转换序列已完成 (EOCS=1)

(转换完成:转换一个通道就表示完成;转换序列完成:在扫描模式下,所有要转换的通道,转换完成)

位 0 AWD模拟看门狗标志 (Analog watchdog flag)

当转换电压超过在 ADC_LTR 和 ADC_HTR 寄存器中编程的值时,硬件将该位置 1。

但需要通过软件清零。

0:未发生模拟看门狗事件

1:发生模拟看门狗事件

 ADC 控制寄存器 1 (ADC_CR1)

位 31:27 保留,必须保持复位值。

位 26 OVRIE溢出中断使能 (Overrun interrupt enable)

通过软件将该位置 1 和清零可使能/禁止溢出中断。

0:禁止溢出中断

1:使能溢出中断。OVR 位置 1 时产生中断。

位 25:24 RES[1:0]分辨率 (Resolution)

通过软件写入这些位可选择转换的分辨率。

0012 位(15 ADCCLK 周期)

01:10 位(13 ADCCLK 周期)

10:8 位(11 ADCCLK 周期)

11:6 位(9 ADCCLK 周期)

位 23 AWDEN规则通道上的模拟看门狗使能 (Analog watchdog enable on regular channels)

此位由软件置 1 和清零。

0:在规则通道上禁止模拟看门狗

1:在规则通道上使能模拟看门狗

位 22 JAWDEN注入通道上的模拟看门狗使能 (Analog watchdog enable on injected channels)

此位由软件置 1 和清零。

0:在注入通道上禁止模拟看门狗

1:在注入通道上使能模拟看门狗

位 21:16 保留,必须保持复位值。

位 15:13 DISCNUM[2:0]不连续采样模式通道计数 (Discontinuous mode channel count)

软件将写入这些位,用于定义在接收到外部触发后于不连续采样模式下转换的规则通道数。

000:1 个通道

001:2 个通道

...

111:8 个通道

位 12 JDISCEN注入通道的不连续采样模式 (Discontinuous mode on injected channels)

通过软件将该位置 1 和清零可使能/禁止注入通道的不连续采样模式。

0:禁止注入通道的不连续采样模式

1:使能注入通道的不连续采样模式

位 11 DISCEN规则通道的不连续采样模式 (Discontinuous mode on regular channels)

通过软件将该位置 1 和清零可使能/禁止规则通道的不连续采样模式。

0:禁止规则通道的不连续采样模式

1:使能规则通道的不连续采样模式

位 10 JAUTO注入组自动转换 (Automatic injected group conversion)

通过软件将该位置 1 和清零可在规则组转换后分别使能/禁止注入组自动转换。

0:禁止注入组自动转换

1:使能注入组自动转换

自动转换会接在规则转换结束后面转换;一般需要转换就去转换,不需要接在规则组后面转换,禁止自动转换

位 9 AWDSGL在扫描模式下使能单一通道上的看门狗 (Enable the watchdog on a single channel in scan mode)

通过软件将该位置 1 和清零可分别使能/禁止通过 AWDCH[4:0] 位确定的通道上的模拟看门狗。

0:在所有通道上使能模拟看门狗

1:在单一通道上使能模拟看门狗

位 8 SCAN扫描模式 (Scan mode) 通过软件将该位置 1 和清零可使能/禁止扫描模式。

在扫描模式下,转换通过 ADC_SQRx 或 ADC_JSQRx 寄存器选择的输入。

0:禁止扫描模式

1:使能扫描模式

(视具体情况定)

位 7 JEOCIE注入通道的中断使能 (Interrupt enable for injected channels)

通过软件将该位置 1 和清零可使能/禁止注入通道的转换结束中断。

0:禁止 JEOC 中断

1:使能 JEOC 中断。JEOC 位置 1 时产生中断。

位 6 AWDIE模拟看门狗中断使能 (Analog watchdog interrupt enable)

通过软件将该位置 1 和清零可使能/禁止模拟看门狗中断。

0:禁止模拟看门狗中断

1:使能模拟看门狗中断

位 5 EOCIEEOC 中断使能 (Interrupt enable for EOC) (如果使用中断功能,该位必须置1)

通过软件将该位置 1 和清零可使能/禁止转换结束中断。

0:禁止 EOC 中断

1:使能 EOC 中断EOC 位置 1 时产生中断。

注意:此位是EOC规则通道和注入通道转换完成中断使能

位 4:0 AWDCH[4:0]模拟看门狗通道选择位 (Analog watchdog channel select bits)

这些位将由软件置 1 和清零。它们用于选择由模拟看门狗监控的输入通道。

注意:

00000:ADC 模拟输入通道 0

00001:ADC 模拟输入通道 1

...

01111:ADC 模拟输入通道 15

10000:ADC 模拟输入通道 16

10001:ADC 模拟输入通道 17

10010:ADC 模拟输入通道 18

保留其它值

ADC 控制寄存器 2 (ADC_CR2)

位 31 保留,必须保持复位值。

位 30 SWSTART开始转换规则通道 (Start conversion of regular channels)

通过软件将该位置 1 可开始转换,而硬件会在转换开始后将该位清零。

0:复位状态

1:开始转换规则通道(软件触发开启位)

注意:该位只能在 ADON = 1 时置 1,否则不会启动转换。

位 29:28 EXTEN规则通道的外部触发使能 (External trigger enable for regular channels)

通过软件将这些位置 1 和清零可选择外部触发极性和使能规则组的触发。

00:禁止触发检测 (选择软件触发方式)

01:上升沿上的触发检测

10:下降沿上的触发检测

11:上升沿和下降沿上的触发检测

位 27:24 EXTSEL[3:0]为规则组选择外部事件 (External event select for regular group)

位 23 保留,必须保持复位值。

位 22 JSWSTART开始转换注入通道 (Start conversion of injected channels)

转换开始后,软件将该位置 1,而硬件将该位清零。

0:复位状态

1:开始转换注入通道

注意:该位只能在 ADON = 1 时置 1,否则不会启动转换。

位 21:20 JEXTEN注入通道的外部触发使能 (External trigger enable for injected channels)

通过软件将这些位置 1 和清零可选择外部触发极性和使能注入组的触发。

00:禁止触发检测

01:上升沿上的触发检测

10:下降沿上的触发检测

11:上升沿和下降沿上的触发检测

位 19:16 JEXTSEL[3:0]为注入组选择外部事件 (External event select for injected group)

位 15:12 保留,必须保持复位值。

位 11 ALIGN数据对齐 (Data alignment)

此位由软件置 1 和清零。请参见图 38 和图 39。

0:右对齐

1:左对齐

位 10 EOCS结束转换选择 (End of conversion selection)

此位由软件置 1 和清零。

0:在每个规则转换序列结束时将 EOC 位置 1。溢出检测仅在 DMA=1 时使能。

1:在每个规则转换结束时将 EOC 位置 1。使能溢出检测。

位 9 DDSDMA 禁止选择(对于单一 ADC 模式) (DMA disable selection (for single ADC mode))

此位由软件置 1 和清零。

0:最后一次传输后不发出新的 DMA 请求(在 DMA 控制器中进行配置)

1:只要发生数据转换且 DMA = 1,便会发出 DAM 请求

位 8 DMA直接存储器访问模式(对于单一 ADC 模式)(Direct memory access mode (for single ADC mode))

此位由软件置 1 和清零。有关详细信息,请参见 DMA 控制器一章。

0:禁止 DMA 模式

1:使能 DMA 模式

位 7:2 保留,必须保持复位值。

位 1 CONT连续转换 (Continuous conversion) (视情况而定)

此位由软件置 1 和清零。该位置 1 时,转换将持续进行,直到该位清零。

0:单次转换模式

1:连续转换模式

位 0 ADONA/D 转换器开启 / 关闭 (A/D Converter ON / OFF)

此位由软件置 1 和清零。

注意:

0:禁止 ADC 转换并转至掉电模式

1:使能 ADC

ADC 采样时间寄存器 1 (ADC_SMPR1)

位 31:27 保留,必须保持复位值。

位 26:0 SMPx[2:0]通道 X 采样时间选择 (Channel x sampling time selection) (视具体情况定)

通过软件写入这些位可分别为各个通道选择采样时间。在采样周期期间,通道选择位必须保持 不变。

注意:

000:3 个周期

001:15 个周期

010:28 个周期

011:56 个周期

100:84 个周期

101:112 个周期

110:144 个周期

111:480 个周期

总转换时间的计算公式如下:

Tconv = 采样时间 + 12 个周期

示例:

ADCCLK = 30 MHz 且采样时间 = 3 个周期时:

Tconv = 3 + 12 = 15 个周期 = 0.5 μs(APB2 为 60 MHz 时)

ADC 注入通道数据偏移寄存器 X (ADC_JOFRx)(x=1..4)

位 31:12 保留,必须保持复位值。

位 11:0 JOFFSETx[11:0]注入通道 X 的数据偏移 (Data offset for injected channel x) (直接写入0即可)

通过软件写入这些位可定义在转换注入通道时从原始转换数据中减去的偏移量。可从 ADC_JDRx 寄存器中读取转换结果。

寄存器介绍:偏移寄存器对应着4个注入数据寄存器,在转换完成后,先减去偏移寄存器中的值,再放入注入数据寄存器中。

ADC 看门狗高阈值寄存器 (ADC_HTR)

位 31:12 保留,必须保持复位值。

位 11:0 HT[11:0]模拟看门狗高阈值 (Analog watchdog higher threshold)

通过软件写入这些位可为模拟看门狗定义高阈值。

(填写一个上限值即可,注意不要超过范围。不使用看门狗时可以不操作。)

ADC 规则序列寄存器 1 (ADC_SQR1)

位 31:24 保留,必须保持复位值。

位 23:20 L[3:0]规则通道序列长度 (Regular channel sequence length)

通过软件写入这些位可定义规则通道转换序列中的转换总数。

0000:1 次转换

0001:2 次转换

...

1111:16 次转换

位 19:15 SQ16[4:0]规则序列中的第十六次转换 (16th conversion in regular sequence)

通过软件写入这些位,并将通道编号 (0..18) 分配为转换序列中的第十六次转换。

位 14:10 SQ15[4:0]规则序列中的第十五次转换 (15th conversion in regular sequence)

位 9:5 SQ14[4:0]规则序列中的第十四次转换 (14th conversion in regular sequence)

位 4:0 SQ13[4:0]:规则序列中的第十三次转换 (13th conversion in regular sequence)

ADC 注入序列寄存器 (ADC_JSQR)

位 31:22 保留,必须保持复位值。

位 21:20 JL[1:0]注入序列长度 (Injected sequence length)

通过软件写入这些位可定义注入通道转换序列中的转换总数。

00:1 次转换

01:2 次转换

10:3 次转换

11:4 次转换

位 19:15 JSQ4[4:0]注入序列中的第四次转换 (4th conversion in injected sequence)

通过软件写入这些位,并将通道编号 (0..18) 分配为序列中的第四次转换。

位 14:10 JSQ3[4:0]注入序列中的第三次转换 (3rd conversion in injected sequence)

位 9:5 JSQ2[4:0]注入序列中的第二次转换 (2nd conversion in injected sequence)

位 4:0 JSQ1[4:0]注入序列中的第一次转换 (1st conversion in injected sequence)

注意:

当 JL[1:0] = 3(定序器中有 4 次注入转换)时,ADC 将按以下顺序转换通道:JSQ1[4:0]、 JSQ2[4:0]、JSQ3[4:0] 和 JSQ4[4:0]。

当 JL[1:0] = 2(定序器中有 3 次注入转换)时,ADC 将按以下顺序转换通道:JSQ2[4:0]、 JSQ3[4:0] 和 JSQ4[4:0]。

当 JL[1:0] = 1(定序器中有 2 次注入转换)时,ADC 转换通道的顺序为:先是 JSQ3[4:0],而后是 JSQ4[4:0]。

当 JL[1:0] = 0(定序器中有 1 次注入转换)时,ADC 将仅转换 JSQ4[4:0] 通道。

ADC 注入数据寄存器 x (ADC_JDRx) (x= 1..4)

位 31:16 保留,必须保持复位值。

位 15:0 JDATA[15:0]注入数据 (Injected data) 这些位为只读。

它们包括来自注入通道 X 的转换结果。数据有左对齐和右对齐两种方式

寄存器介绍:注入数据寄存器有4个寄存器,这个寄存器是16位的,必须要设置左对齐或者右对齐。转换顺序并不是和注入通道一一对应的,而是按照先后顺序进入的。只和先后顺序有关和编号没有任何关系。

ADC 规则数据寄存器 (ADC_DR)

位 31:16 保留,必须保持复位值。

位 15:0 DATA[15:0]规则数据 (Regular data) 这些位为只读。

它们包括来自规则通道的转换结果。数据有左对齐和右对齐两种方式

ADC 通用控制寄存器 (ADC_CCR)

位 31:24 保留,必须保持复位值。

位 23 TSVREFE温度传感器和 VREFINT 使能 (Temperature sensor and VREFINT enable)

通过软件将该位置 1 和清零可使能/禁止温度传感器和 VREFINT 通道。

0:禁止温度传感器和 VREFINT 通道

1:使能温度传感器和 VREFINT 通道

注意:对于 STM32F42x 和 STM32F43x 器件,当 TSVREFE 位置 1 时必须禁止 VBATE。

两个位同时置 1 时,仅进行 VBAT 转换。

位 22 VBATEVBAT 使能 (VBAT enable)

通过软件将该位置 1 和清零可使能/禁止 VBAT 通道。

0:禁止 VBAT 通道

1:使能 VBAT 通道

位 21:18 保留,必须保持复位值。

位 17:16 ADCPREADC 预分频器 (ADC prescaler) 由软件置 1 和清零,以选择 ADC 的时钟频率。

该时钟为所有 ADC 所共用。

注意:

00:PCLK2 2 分频

01:PCLK2 4 分频

10:PCLK2 6 分频

11:PCLK2 8 分频

注意:这个位分频系数选择必须小于ADC的最大时钟

五、STM32模数转换器示例(五相按键)

1、硬件设计

2、软件

配置GPIO口

打开GPIOA时钟

配置为模拟输入功能

配置ADC(CR1,CR2,SMPR2,SQR1,SQR3,CCR)

打开ADC1时钟

选择通道ADC1_IN3

选择分频系数

各通道的独立采样时间

选择规则组和注入组

中断三件套

开启ADC

开启转换

中断服务函数

#include "adc.h"

u16 ADC_value;
/************************
函数功能:ADC初始化
形参:无
返回值:无
************************/
void Adc_Init(void)
{
	//开时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	//推挽输出
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//DMA初始化
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); //使能ADC1时钟
	DMA_InitTypeDef DMA_InitStructure; 
	DMA_DeInit(DMA2_Stream0);
	DMA_InitStructure.DMA_Channel = DMA_Channel_0;  //通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(ADC1->DR)); 
	DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&ADC_value; 
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory  ; 
	DMA_InitStructure.DMA_BufferSize = 1; 
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; 
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; 
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; 
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; 
	DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;/*单次传输*/
	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;/*单次传输*/

	DMA_Init(DMA2_Stream0, &DMA_InitStructure);
	DMA_Cmd(DMA2_Stream0, ENABLE);
	
	//ADC初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
    ADC_CommonInitStructure.ADC_DMAAccessMode =  ADC_DMAAccessMode_1; //DMA使能
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=100/4=25Mhz,ADC时钟最好不要超过36Mhz 
    ADC_CommonInit(&ADC_CommonInitStructure);//初始化
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//单次模式
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
	ADC_InitStructure.ADC_NbrOfConversion = 1;
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;//不扫描
	ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
	
	//设置指定ADC的规则组通道,一个序列,采样时间
	ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_480Cycles );//ADC1,ADC通道,480个周期,提高采样时间可以提高精确度		
	ADC_DMACmd(ADC1, ENABLE);
	ADC_Cmd(ADC1, ENABLE);//开启AD转换器	
	ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);  
	ADC_SoftwareStartConv(ADC1) ;//软件触发规则组转换 
}
#ifndef ADC_H_
#define ADC_H_
#include "stm32f4xx.h"
#define LEFT  (ADC_value >= 4085)
#define RIGHT (ADC_value > 2035 && ADC_value < 2050) 
#define UP 	  (ADC_value > 1020 && ADC_value < 1030)
#define DOWN  (ADC_value > 1360 && ADC_value < 1370)
void Adc_Init(void);
extern u16 ADC_value;
#endif

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

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

相关文章

增加CO气体报警、氢气报警以及烟雾报警

标题&#xff1a;增加CO气体报警、氢气报警以及烟雾报警。 内容&#xff1a;通过ADC采集通道&#xff0c;实现传感器电压的采集&#xff0c;通过对电压进行判断是否报警&#xff0c;&#xff08;理论上应该可以计算出气体浓度&#xff0c;通过气体浓度来判断是否报警&#xff…

入门分布式事务,2PC 3PC

分布式事务 什么是分布式一致性 在分布式系统中&#xff0c;为了保证数据的高可用&#xff0c;通常&#xff0c;我们会将数据保留多个副本(replica)&#xff0c;这些副本会放置在不同的物理的机器上。为了对用户提供正确的增\删\改\查等语义&#xff0c;我们需要保证这些放置…

VRRP协议负载分担

VRRP流量负载分担 VRRP负载分担与VRRP主备备份的基本原理和报文协商过程都是相同的。同样对于每一个VRRP备份组,都包含一个Master设备和若干Backup设备。与主备备份方式不同点在于:负载分担方式需要建立多个VRRP备份组,各备份组的Master设备可以不同;同一台VRRP设备可以加…

骑砍战团MOD开发(39)-RTS塔防保卫卡拉迪亚大陆

骑砍1战团mod开发-RTS塔防保卫卡拉迪亚大陆_哔哩哔哩bilibili_骑马与砍杀https://www.bilibili.com/video/BV1hw411E7bP/骑砍战团MOD开发(28)-骑砍联盟之RTS大规模军团竞技-CSDN博客文章浏览阅读369次&#xff0c;点赞11次&#xff0c;收藏7次。【代码】骑砍战团MOD开发(28)-骑…

SpringCloud Alibaba 深入源码 - Nacos 分级存储模型、支撑百万服务注册压力、解决并发读写问题(CopyOnWrite)

目录 一、SpringCloudAlibaba 源码分析 1.1、SpringCloud & SpringCloudAlibaba 常用组件 1.2、Nacos的服务注册表结构是怎样的&#xff1f; 1.2.1、Nacos的分级存储模型&#xff08;理论层&#xff09; 1.2.2、Nacos 源码启动&#xff08;准备工作&#xff09; 1.2.…

java steam 的使用

说steam 前看下kotlin的一个写法如果用java怎么写 fun main() {// 创建一个列表val fruits listOf("Apple", "Banana", "Cherry", "Date", "Elderberry")// 使用 Sequence 进行过滤和映射操作val uppercaseFruitLengths …

《机器学习》客户流失判断-python实现

客户流失判断 题目赛题描述数据说明赛题来源-DataCastle 问题描述解题思路Python实现读取数据并初步了解导入宏包读取数据查看数据类型检查缺失值描述性统计分析 可视化分析用户流失分析特征分析任期年数与客户流失的关系&#xff1a;服务类属性分析特征相关性分析 数据预处理类…

二叉树的直径(LeetCode 543)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 给你一棵二叉树的根节点&#xff0c;返回该树的直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的长度由它们之间边数…

安卓平板局域网内远程控制工控机方法

安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上&#xff0c;将安卓平板连接上WiFi&#xff0c;如下图所示 下载NoMachine远程软件安装包&#xff0c;官网地址&#xff1a;https://www.nomachine.com/ 点击Download now按钮…

C++实战:类的包含编译模型

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;C普通类的包含编译模型1、创建普通类定义文件2、创建普通类实现文件3、创建主程序文件4、运行主程序&#xff0c;查看结果 &#xff08;二&#xff09;C模板类的包含编译模型1、创建模板类定义文件2、创建模板类实…

微前端框架篇一,了解qiankun

微前端框架篇一&#xff0c;了解qiankun ① 前置知识补充Ⅰ 什么是微前端&#xff1f;Ⅱ 什么是JS CSS沙箱&#xff1f;Ⅲ 什么是spa单页面应用&#xff1f;Ⅳ SystemJS 与 import-html-entryⅤ 现有的微前端方案 ② 了解single-spa 微前端框架③ 了解qiankun框架 ① 前置知识补…

[超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动+CUDA+cuDNN+Pytorch)--[1]安装显卡驱动

[写在前面] &#x1f447;&#x1f447;&#x1f447; 如果这篇博客写的还可以的话&#xff0c;希望各位好心的读者朋友们到最下面点击关注一下Franpper的公众号&#xff0c;或者也可以直接通过名字搜索&#xff1a;Franpper的知识铺。快要过年了&#xff0c;Franpper想制作一…

腾讯云代金券如何领取?详细领取教程来了!

随着云计算的快速发展&#xff0c;越来越多的用户意识到云服务的重要性。腾讯云作为国内领先的云服务提供商&#xff0c;为广大用户提供了丰富的云计算解决方案。为了吸引用户上云&#xff0c;腾讯云推出了代金券活动&#xff0c;让用户在购买云服务时可以享受到更多的优惠。 那…

【Linux】Linux基本操作(二):rm rmdir man cp mv cat echo

承接上文&#xff1a; 【【Linux】Linux基本操作&#xff08;一&#xff09;&#xff1a;初识操作系统、ls、cd、touch、mkdir、pwd 】 目录 1.rmdir指令 && rm 指令&#xff1a; rmdir -p #当子目录被删除后如果父目录也变成空目录的话&#xff0c;就连带父目录一…

线性表的案例引入 | 稀疏多项式的运算

#include <iostream> using namespace std;#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2typedef int Status;// 定义单链表 typedef struct PNode {float coef; //系数int expn; //指数struct PNode *nex…

「优选算法刷题」:查找总价格为目标值的两个商品

一、题目 购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况&#xff0c;返回任一结果即可。 示例 1&#xff1a; 输入&#xff1a;price [3, 9, 12, 15], target 18 输出&#xff1a;[3,15] 或者 [15,3]示例…

windows下载安装ImageMagick

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;十七&#xff09;——windows下载安装ImageMagick 文章目录 win系统环境搭建&#xff08;十七&#xff09;——windows下载安装ImageMagick1.下载2.安装3.验证3.1 依赖缺失问题3.2 依赖缺失解决 1.下载 …

二叉树 - 堆 | 数据结构中的小技巧大作用

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 一、堆的概念及介绍二、结构图示三、堆的代码实现&#xff08;图解&#xff09;3.1 创…

6种解决msvcp140.dll文件丢失的有效方法讲解

msvcp140.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。这个文件通常位于Windows操作系统的System32文件夹中&#xff0c;它包含了许多用于支持C编程语言的函数和类。当您在运行一个需要使用这些函数和类的应用程序时&#xff0c…

cpp_12_异常处理

1 异常理论 1.1 何为异常&#xff1f; 在实际运行环境中发生&#xff0c;却在设计、编码、测试阶段无法预料的&#xff0c;各种潜在的问题。 1.2 报告异常的2种机制 1&#xff09;通过 return 返回值报告异常信息&#xff1a; 所有局部对象都能正确地被析构、被释放 定位错…