目录

一、ADC的介绍

1.ADC的特点

2.通道和引脚的对应关系

3.注入通道和规则通道

4.转换模式

5.ADC中断

6.ADC的时钟

二、寄存器的介绍

1.ADC_CR1

2.ADC_CR2

3.ADC 采样事件寄存器(ADC_SMPR1 和 ADC_SMPR2)

4.ADC 规则序列寄存器(ADC_SQR1~3)

5.ADC 规则数据寄存器(ADC_DR)

6.ADC 状态寄存器(ADC_SR)

三、配置函数


一、ADC的介绍

1.ADC的特点

ADC控制器有多个通道 可以选择通道 可以给通道排序设置优先级

2.通道和引脚的对应关系

3.注入通道和规则通道

注入通道的位置是可以设置的

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

4.转换模式

5.ADC中断

6.ADC的时钟

二、寄存器的介绍

1.ADC_CR1

ADC_CR1 的 SCAN 位,该位用于设置扫描模式,由软件设置和清除,如果设置为 1,则
使用扫描模式,如果为 0,则关闭扫描模式。在扫描模式下,由 ADC_SQRx 或 ADC_JSQRx 寄
存器选中的通道被转换。如果设置了 EOCIE 或 JEOCIE,只在最后一个通道转换完毕后才会产
生 EOC 或 JEOC 中断。

2.ADC_CR2

ADON 位用于开关 AD 转换器。而 CONT 位用于设置是否进行连续转换,本次使用单次转换,所以 CONT 位必须为 0。CAL 和 RSTCAL 用于 AD 校准。ALIGN 用于设置数据对齐,使用右对齐,该位设置为 0。
软件触发(SWSTART),所以设置这 3 个位为 111。ADC_CR2 的 SWSTART 位用于开始规则通道的转换,每次转换(单次转换模式下)都需要向该位写 1。 AWDEN 为用于使能温度传感器和 Vrefint。

3.ADC 采样事件寄存器(ADC_SMPR1 和 ADC_SMPR2)

这两个寄存器 用于设置通道 0~17 的采样时间,每个通道占用 3 个位。
ADC_SMPR2 的各位描述:
对于每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降
低 ADC 的转换速率。ADC 的转换时间可以由以下公式计算:
Tcovn=采样时间+12.5 个周期
其中:Tcovn 为总转换时间,采样时间是根据每个通道的 SMP 位的设置来决定的。例如,
当 ADCCLK=14Mhz 的时候,并设置 1.5 个周期的采样时间,则得到:Tcovn=1.5+12.5=14 个周
期=1us。

4.ADC 规则序列寄存器(ADC_SQR1~3)

L[3:0]用于存储规则序列的长度,这里只用了 1 个,所以设置这几个位的值为 0。其他的 SQ13~16 则存储了规则序列中第 13~16 通道的编号(编号范围:0~17)。另外两个规则序
列寄存器同 ADC_SQR1 大同小异。我们选择的是 单次转换,所以只有一个通道在规则序列里面,这个序列就是 SQ1,通过 ADC_SQR3 的最低 5 位(也就是 SQ1)设置。

5.ADC 规则数据寄存器(ADC_DR)

规则序列中的 AD 转化结果都将被存在这个寄存器里面,而注入通道的转换结果被保存在 ADC_JDRx 里面。

6.ADC 状态寄存器(ADC_SR)

三、配置函数

1)开启 PA 口和 ADC1 时钟,设置 PA1 为模拟输入。
STM32F103RCT6 的 ADC 通道 1 在 PA1 上,所以,先要使能 PORTA 的时钟,然后设置 PA1 为模拟输入。使能 GPIOA 和 ADC 时钟用 RCC_APB2PeriphClockCmd 函数,设置 PA1 的输入方式,使用 GPIO_Init 函数即可.
2)复位 ADC1,同时设置 ADC1 分频因子。
开启 ADC1 时钟之后,要复位 ADC1,将 ADC1 的全部寄存器重设为缺省值之后就可以通过 RCC_CFGR 设置 ADC1 的分频因子。分频因子要确保 ADC1 的时钟(ADCCLK) 不要超过 14Mhz。 设置分频因子位 6,时钟为 72/6=12MHz,库函数的实现方法是:
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

ADC 时钟复位的方法是:

ADC_DeInit(ADC1);

这个函数非常容易理解,就是复位指定的 ADC。

3)初始化 ADC1 参数,设置 ADC1 的工作模式以及规则序列的相关信息。

在设置完分频因子之后,就可以开始 ADC1 的模式配置了,设置单次转换模式、触发方式选择、数据对齐方式等都在这一步实现。同时,还要设置 ADC1 规则序列的相关信息, 这里只有一个通道,并且是单次转换的,所以设置规则序列中通道数为 1。这些在库函数 中是通过函数 ADC_Init 实现的。

typedef struct
{
uint32_t ADC_Mode;
FunctionalState ADC_ScanConvMode;
FunctionalState ADC_ContinuousConvMode;
uint32_t ADC_ExternalTrigConv;
uint32_t ADC_DataAlign;
uint8_t ADC_NbrOfChannel;
}ADC_InitTypeDef;

参数 ADC_Mode 故名是以是用来设置 ADC 的模式。
参数 ADC_ScanConvMode 用来设置是否开启扫描模式,因为的实验是单通道单次转换,
所以这里选择不开启值 DISABLE 即可。
参数 ADC_ContinuousConvMode 用来设置是否开启连续转换模式,因为是单次转换模式,所以
选择不开启连续转换模式,DISABLE 即可。
参数 ADC_ExternalTrigConv 是用来设置启动规则转换组转换的外部事件,这里选择软件触
发,选择值为 ADC_ExternalTrigConv_None 即可。
参数 DataAlign 用来设置 ADC 数据对齐方式是左对齐还是右对齐,这里我们选择右对齐方式
ADC_DataAlign_Right。
参数 ADC_NbrOfChannel 用来设置规则序列的长度,实验只开启一个通道,所以值为 1 即
可。
5)使能 ADC 并校准。
在设置完了以上信息后,就使能 AD 转换器,执行复位校准和 AD 校准注意这两步
是必须的!不校准将导致结果很不准确。
使能指定的 ADC 的方法是:

ADC_Cmd(ADC1, ENABLE);//使能指定的 ADC1

执行复位校准的方法是:
ADC_ResetCalibration(ADC1);

执行 ADC 校准的方法是:
ADC_StartCalibration(ADC1);

记住,每次进行校准之后要等待校准结束。这里是通过获取校准状态来判断是否校准是否结束。
下面我们一一列出复位校准和 AD 校准的等待结束方法:

while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
while(ADC_GetCalibrationStatus(ADC1)); //等待校 AD 准结束

6)读取 ADC 值。
在上面的校准完成之后,ADC 就算准备好了。接下来要做的就是设置规则序列 1 里面
的通道,采样顺序,以及通道的采样周期,然后启动 ADC 转换。在转换结束后,读取 ADC 转
换结果值就是了。这里设置规则序列通道以及采样周期的函数是:

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel,
uint8_t Rank, uint8_t ADC_SampleTime);

这里是规则序列中的第 1 个转换,同时采样周期为 239.5,所以设置为:
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );

软件开启 ADC 转换的方法是:

ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的 ADC1 的软件转换启动功能

开启转换之后,就可以获取转换 ADC 转换结果数据,方法是:
ADC_GetConversionValue(ADC1);

同时在 AD 转换中,我们还要根据状态寄存器的标志位来获取 AD 转换的各个状态信息。库函 数获取 AD 转换的状态信息的函数是:

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)

比如我们要判断 ADC1d 的转换是否结束,方法是:

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

通过 ADC1 的通道 1 (PA1)来读取外部电压值,MiniSTM32 开发板没有设计参考电压源在上面,但是板上有几个可以提供测试的地方:1,3.3V 电源。2,GND。3,后备电池。注意:这里不能接到板上 5V 电源上去测试,这可能会烧坏 ADC!。

二十一、ADC模数转换实验相关推荐

  1. 51单片机 | ADC模数转换实验

    文章目录 一.ADC介绍 1.ADC简介 2.ADC 转换原理 二.XPT2046 芯片介绍 三.硬件设计 四.软件设计 1.ADC 读写函数 2.主函数 五.实验现象   前面我们介绍的都是对数字信 ...

  2. 51单片机——ADC模数转换实验

    目录 一.功能描述 二.ADC介绍 2.1 逐次逼近型ADC转换原理 2.2 ADC的主要技术指标 三.XPT2046芯片介绍 3.1 XPT2046外部引脚 3.2 XPT2046的命令字 3.3 ...

  3. 实验14:ADC模数转换实验

    一.ADC简介 ADC:Analog-to-Digital Converter的缩写,指模拟/数字转换器.是将连续变量的模拟信号转换为离散的数字信号的器件. 典型的模拟数字转换器将模拟信号转换为表示一 ...

  4. ADC 模数转换实验

    生活中的模拟信号,如温度.声音.压力等,需要转换为更方便储存.处理和发射的数字形式. 51 单片机无法直接操作这些模拟量,其系统内部时运算都是数字量 0 和 1,因此必须将模拟量转换成数字量.数字量, ...

  5. 【iCore3 双核心板】例程二十一:LAN_TCPS实验——以太网数据传输

    实验指导书及代码包下载: http://pan.baidu.com/s/1ntTjWpV iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  6. 单片机:ADC模数转换实验(内含ADC介绍+XPT2046芯片介绍+硬件电路设计+软件编程设计+原始代码)

     ADC简介 单片机只能分析数字信号,帮你分析模拟信号.所以接受外界模拟量--->数字量(0或1) 分辨率:模拟信号能输出离散信号的个数.通常用2进制存储,所以通常用bit.输入5V,最小的电压 ...

  7. 51单片机ADC模数转换

    51单片机ADC模数转换 ADC介绍 1.ADC简介 ​        ADC(analog to digital converter)也称为模数转换器,是指一个将模拟信号转变为数字信号.单片机在采集 ...

  8. STM32物联网项目-ADC采集实验板板温度(NTC热敏电阻)

    STM32 ADC采集板载温度 STM32 ADC简介 ​ STM32 拥有 1~3 个 ADC(STM32F101/102 系列只有 1 个 ADC),这些 ADC 可以独立使用, 也可以使用双重模 ...

  9. 飞思卡尔16位单片机(五)——ADC模数转换模块测试

    一.介绍 ADC模块的作用是将模拟的电压信号转换为CPU可以处理的数字信号.一些低端的单片机上没有ADC模块,必须使用片外的ADC芯片,才能实现模数转换的功能.而飞思卡尔的单片机一般是集成了ADC模块 ...

最新文章

  1. Matlab编程与数据类型 -- 多分支条件选择语句if/elseif/…/else/end
  2. 3. Port scanners (端口扫描器 4个)
  3. DL:神经网络算法简介之耗算力的简介、原因、经典模型耗算力计算、GPU使用之详细攻略
  4. Git 之四 分支管理
  5. 【渝粤题库】陕西师范大学200401 初等代数研究 作业(专升本)
  6. 百万数据下几种SQL性能测试
  7. oracle data guard闪回,11gR2 Active Data Guard 闪回 - flashback database / snapshot standby - 2
  8. 一次oracle大量数据删除经历
  9. 判断力有时候有多么重要?懂得选择多么重要?
  10. 27. 考研与工作怎么选择
  11. 编写带界面的ActiveX控件(CAB网页控件)全过程
  12. Spring+Spring MVC+MyBatis实现SSM框架整合详细教程【转】
  13. 0ctf-2017-babyheap图解
  14. Dreamweaver中如何设定文字——大小、字体、颜色
  15. 怎么查二手苹果手机价格
  16. 刻意练习:机器学习实战 -- Task01. 决策树
  17. Gitlab的branch与Tag的使用
  18. 尚学堂j2ee视频教程
  19. 主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是“投影”?
  20. 爬虫基本原理与实战---1、爬虫实战概述

热门文章

  1. Java 获取 n个 工作日【前】或【后】的日期
  2. SOHO回归职场,英文介绍怎么做?
  3. 【security】spring项目出现【Please sign in】登录界面
  4. 怎么对阿里iconfont两个项目中的字体图标合并
  5. 用linux命令操作手机,Linux基本操作
  6. 二元运算符重载 must take either zero or one argument
  7. [JZOJ5445]失格
  8. navicat 链接mysql异常 2005 - Unknown MySQL server host ‘xxxxxxxxx‘(11001)
  9. autogloun自然语言处理
  10. (Java实现) 洛谷 P1115 最大子段和