一、模数转换器介绍
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_IN3、ADC_IN8、 ADC_IN2、 ADC_IN2、 ADC_IN0、 ADC_IN2、 ADC_IN2、 ADC_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)
通过软件写入这些位可选择转换的分辨率。
00:12 位(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 EOCIE:EOC 中断使能 (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 DDS:DMA 禁止选择(对于单一 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 ADON:A/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 VBATE:VBAT 使能 (VBAT enable)
通过软件将该位置 1 和清零可使能/禁止 VBAT 通道。
0:禁止 VBAT 通道
1:使能 VBAT 通道
位 21:18 保留,必须保持复位值。
位 17:16 ADCPRE:ADC 预分频器 (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