前言:

本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用

所用工具:

1、芯片: STM32F407ZET6/ STM32F103ZET6

2、STM32CubeMx软件

3、IDE: MDK-Keil软件

4、STM32F1xx/STM32F4xxHAL库

知识概括:

通过本篇博客您将学到:

ACD工作原理

STM32CubeMX创建ADC例程

HAL库定时器ADC函数库

什么是ADC

Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。

典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

简单地说就是将模拟电压值,转换成对应的肉眼可读数值

12位ADC是一种逐次逼近型模拟数字转换器。它有,3个ADC控制器,多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

12位模拟数字转换器

就是ADC的数字存储是12位的 也就是说转换器通过采集转换所得到的最大值是4095 “111111111111”=4095 二进制的12位可表示0-4095个数, 对应着所测电压的实际值,转换的电压范围是0v-3.3v的话,转换器就会把0v-3.3v平均分成4096份。设转换器所得到的值为x,所求电压值为y。

同理,可以理解8位精度和10位精度

具体的转压范围下面我们会讲

3个ADC控制器

就是说STM32一共有3个ADC ADC1,ADC2,ADC3

18个通道

STM32 的ADC 多达18 个通道,
16个外部通道和2个内部信号源 具体是哪一个IO 口可以从手册查询到

STM32F10x系列芯片ADC通道和引脚对应关系 :
16个外部通道:芯片上有16个引脚是可以接到模拟电压上进行电压值检测的

2个内部信号源 : 一个是内部温度传感器,一个是内部参考电压

一共支持23个引脚支持ADC,包括21个外部和2个内部信号源

ADC的转换模式 (重要,请务必看懂)

1 单次转换模式:ADC只执行一次转换;

2 连续转换模式:转换结束之后马上开始新的转换;

3 扫描模式:ADC扫描被规则通道和注入通道选中的所有通道,在每个组的每个通道上执行单次转换。在每个转换结束时,这一组的下一个通道被自动转换。如果设置了CONT位(开启了连续 转换模式),转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。

4 间断模式:触发一次,转换一个通道,在触发,在转换。在所选转换通道循环,由触发信号启动新一轮的转换,直到转换完成为止。

扫描模式简单的说是一次对所有所选中的通道进行转换,比如开了ch0,ch1,ch4,ch5。  ch0转换完以后就会自动转换通道1,4,5直到转换完这个过程不能被打断。如果开启了连续转换模式,则会在转换完ch5之后开始新一轮的转换。

这就引入了间断模式,可以说是对扫描模式的一种补充。它可以把0,1,4,5这四个通道进行分组。可以分成0,1一组,4,5一组。也可以每个通道单独配置为一组。这样每一组转换之前都需要先触发一次。

ADC单通道:

只进行一次ADC转换:配置为“单次转换模式”,扫描模式关闭。ADC通道转换一次后,就停止转换。等待再次使能后才会重新转换

进行连续ADC转换:配置为“连续转换模式”,扫描模式关闭。ADC通道转换一次后,接着进行下一次转换,不断连续。

ADC多通道:

只进行一次ADC转换:配置为“单次转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。等待再次使能后才会重新转换

进行连续ADC转换:配置为“连续转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断连续。

也就是:多通道必须使能扫描模式

上面转换模式介绍一部分为转自他人

左对齐或右对齐

因为ADC得到的数据是12位精度的,但是数据存储在 16 位数据寄存器中,所以ADC的存储结果可以分为左对齐或右对齐方式(12位)

ADC的工作框图

  • 图:stm32f103参考手册

接下来我们介绍下ADC的工作框图,让您有个更直白地了解,涉及到寄存器的一些部分不再详细讲解,

1电压输入范围


ADC一般用于采集小电压,其输入值不能超过VDDA,即ADC输入范围:VREF- ≤ VIN ≤ VREF+。具体的定义见上图。
一般把VSSA和VREF- 接地, VREF+ 和 VDDA接3V3,那么ADC的输入范围是0~3.3V。

2ADC输入通道

ADCx_INT0-ADCx_INT15 对应三个ADC的16个外部通道,进行模拟信号转换 此外,还有两个内部通道:温度检测或者内部电压检测
选择对应通道之后,便会选择对应GPIO引脚,相关的引脚定义和描述可在开发板的数据手册里找

3注入通道,规则通道

我们看到,在选择了ADC的相关通道引脚之后,在模拟至数字转换器中有两个通道,注入通道,规则通道
规则通道至多16个,注入通道至多4个

规则通道:

规则通道相当于你正常运行的程序,看它的名字就可以知道,很规矩,就是正常执行程序
注入通道:
注入通道可以打断规则通道,听它的名字就知道不安分,如果在规则通道转换过程中,有注入通道进行转换,那么就
要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程

  • 图:正点原子

你可以通过上图有一个更直观的认识,可以简单地把注入通道理解为中断形式,可以更好理解

4ADC时钟

图中的ADC预分频器的ADCCLK是ADC模块的时钟来源。通常,由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个专用的可编程预分频器。 分频因子由RCC_CFGR的ADCPRE[1:0]配置,可配置2/4/6/8分频

STM32的ADC最大的转换速率为1MHz,也就是说最快转换时间为1us,为了保证ADC转换结果的准确性,ADC的时钟最好不超过14M。

T = 采样时间 + 12.5个周期,其中1周期为1/ADCCLK

例如,当 ADCCLK=14Mhz 的时候,并设置 1.5 个周期的采样时间,则得到: Tcovn=1.5+12.5=14 个周期=1us。

5外部触发转换

ADC 转换可以由ADC 控制寄存器2: ADC_CR2 的ADON 这个位来控制,写1 的时候开始转换,写0 的时候停止转换

当然,除了ADC_CR2寄存器的ADON位控制转换的开始与停止,还可以支持外部事件触发转换(比如定时器捕捉、EXTI线)

包括内部定时器触发外部IO触发。具体的触发源由ADC_CR2的EXTSEL[2:0]位规则通道触发源 )和 JEXTSEL[2:0]位注入通道触发源)控制。

同时ADC3的触发源与ADC1/2的触发源有所不同,上图已经给出,

具体查看第五部分框图即可理解

6中断

中断触发条件有三个,规则通道转换结束注入通道转换结束,或者模拟看门狗状态位被设置时都能产生中断,


转换结束中断就是正常的ADC完成一次转换,进入中断,这个很好理解

模拟看门狗中断
,当被ADC转换的模拟电压值低于低阈值或高于高阈值时,便会产生中断。阈值的高低值由ADC_LTR和ADC_HTR配置
模拟看门狗,听他的名字就知道,在ADC的应用中是为了防止读取到的电压值超量程或者低于量程

DMA

同时ADC还支持DMA触发,规则和注入通道转换结束后会产生DMA请求,用于将转换好的数据传输到内存。

注意,只有ADC1和ADC3可以产生DMA请求

因为涉及到DMA传输,所以这里我们不再详细介绍,之后几节会更新DMA,一般我们在使用ADC 的时候都会开启DMA 传输。

ADC的主要特征

STM32F10x ADC特点

  • 12位逐次逼近型的模拟数字转换器。
  • 最多带3个ADC控制器
  • 最多支持18个通道,可最多测量16个外部和2个内部信号源。
  • 支持单次和连续转换模式
  • 转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。
  • 通道0到通道n的自动扫描模式 自动校准
  • 采样间隔可以按通道编程
  • 规则通道和注入通道均有外部触发选项
  • 转换结果支持左对齐或右对齐方式存储在16位数据寄存器
  • ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)
  • ADC供电要求:2.4V-3.6V
  • ADC输入范围:VREF- ≤ VIN ≤ VREF+

STM32F4x ADC特点


注: 上部分来自正点原子

F1与F4区别

F4的ADC支持12位,10位,8位和6位精度,F1只支持12位

F1和F4都具有3个ADC,F1可提供21个输入通道,F4可以提供24个输入通道。

F1的ADC最大采样频率为1Msps,2路交替采样可到2Msps(F1不支持3路交替采样)。F4的ADC最大采样频率为2.4Msps,3路交替采样可到7.2Msps。

下面到了CubeMax的创建时间

工程创建

1设置RCC

设置高速外部时钟HSE 选择外部时钟源

设置ADC引脚

因为只有设置了ADC的引脚,才能够设置ADC的时钟分频

2设置时钟


我的是 外部晶振为8MHz

  • 1选择外部时钟HSE 8MHz
  • 2PLL锁相环倍频9倍
  • 3系统时钟来源选择为PLL
  • 4设置APB1分频器为 /2
  • 5 设置ADC时钟分频 ,只能是6/8分频

如果ADC时钟频率大于14MHz则会报错

32的时钟树框图 如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》

ADC配置

这个我们简单的讲解下,如果看懂上方原理讲解,看这几个配置也是很简单的

ADCs_Common_Settings          ADC模式设置
Mode     ADC_Mode_Independent
这里设置为独立模式

独立模式模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,应该设成独立模式,多个ADC同时使用时会有其他模式,如双重ADC同步模式,两个ADC同时采集一个或多个通道,可以提高采样率

Data Alignment (数据对齐方式): 右对齐/左对齐

这个上方有讲解,数据的左右对齐

Scan Conversion Mode( 扫描模式 ) :   DISABLE

如果只是用了一个通道的话,DISABLE就可以了(也只能DISABLE),如果使用了多个通道的话,会自动设置为ENABLE。 就是是否开启扫描模式

Continuous Conversion Mode(连续转换模式)    ENABLE

设置为ENABLE,即连续转换。如果设置为DISABLE,则是单次转换。两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以进行转换

Discontinuous Conversion Mode(间断模式)    DISABLE

因为我们只用到了1个ADC,所以这个直接不使能即可

规则通道设置

Enable Regular Conversions (启用常规转换模式)    ENABLE

使能 否则无发进行下方配置

Number OF Conversion(转换通道数)    1
用到几个通道就设置为几
多个通道自动使能扫描模式

Extenal Trigger Conversion Source (外部触发转换源)

设定ADC的触发方式

Regular Conversion launched by software 规则的软件触发 调用函数触发即可

Timer X Capture Compare X event 外部引脚触发,

Timer X Trigger Out event 定时器通道输出触发 需要设置相应的定时器设置

这个具体在上方ADC框图的5部分有讲解

Rank          转换顺序
这个只修改通道采样时间即可 默认为1.5个周期

多个通道时会有多个Rank,可以设定每个通道的转换顺序
ADC总转换时间如下计算:

TCONV = 采样时间+ 12.5个周期

当ADCCLK=14MHz(最大),采样时间为1.5周期(最快)时,TCONV =1.5+12.5=14周期=1μs。

因此,ADC的最小采样时间1us(ADC时钟=14MHz,采样周期为1.5周期下得到) 这个上方也有讲解

注入通道设置

也就是注入通道的设置,和转换通道没啥太大区别,这里不再详解

WahchDog

Enable Analog WatchDog Mode(使能模拟看门狗中断)

这个上方有讲解,本质也测量值就是超出测量范围或者低于最低范围,启动看门狗

具体的配置看下图:

ADC转换结束中断

ADC的DMA传输

GPIO的模式为模拟模式

同时,如果需要打印到上位机,需要配置下串口,具体请看

STM32】HAL库 STM32CubeMX教程四—UART串口通信详解

  • 1 设置项目名称
  • 2 设置存储路径
  • 3 选择所用IDE


创建工程文件

然后点击GENERATE CODE 创建工程

配置下载工具

新建的工程所有配置都是默认的 我们需要自行选择下载方式,勾选上下载后复位运行

例程:

在main.c中加上

  /* USER CODE BEGIN 0 */uint16_t ADC_Value;/* USER CODE END 0 */

在ADC初始化之后加上AD校准函数

  MX_ADC1_Init();HAL_ADCEx_Calibration_Start(&hadc1);    //AD校准MX_USART1_UART_Init();/* USER CODE BEGIN 2 */

while中加上:

 HAL_ADC_Start(&hadc1);     //启动ADC转换HAL_ADC_PollForConversion(&hadc1, 50);   //等待转换完成,50为最大等待时间,单位为msif(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)){ADC_Value = HAL_ADC_GetValue(&hadc1);   //获取AD值printf("ADC1 Reading : %d \r\n",ADC_Value);printf("PA3 True Voltage value : %.4f \r\n",ADC_Value*3.3f/4096);printf("Z小旋测试\r\n");
}
HAL_Delay(1000);

就可以完成正常读取

中断读取:

如果使能了ADC转换结束中断,并且使能了定时器中断,可以这样写:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)    //定时器中断回调
{HAL_ADC_Start_IT(&hadc1); //定时器中断里面开启ADC中断转换,1ms开启一次采集
}void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)    //ADC转换完成回调
{HAL_ADC_Stop_IT(&hadc1);        //关闭ADCHAL_TIM_Base_Stop_IT(&htim3);    //关闭定时器AD_Value=HAL_ADC_GetValue(&hadc1);  //获取ADC转换的值printf("ADC1 Reading : %d \r\n",AD_Value);printf("%.4f V\r\n",(AD_Value*3.3/4096));     //串口打印电压信息HAL_TIM_Base_Start_IT(&htim3);       //开启定时器
}

函数讲解:

开启ADC 3种模式 ( 轮询模式 中断模式 DMA模式 )

HAL_ADC_Start(&hadcx);       //轮询模式开启ADC
HAL_ADC_Start_IT(&hadcx);       //中断轮询模式开启ADC
HAL_ADC_Start_DMA(&hadcx);       //DMA模式开启ADC

关闭ADC 3种模式 ( 轮询模式 中断模式 DMA模式 )

• HAL_ADC_Stop()
• HAL_ADC_Stop_IT()
• HAL_ADC_Stop_DMA()

ADC校准函数 :

HAL_ADCEx_Calibration_Start(&hadcx);      

F4系列不支持

读取ADC转换值

• HAL_ADC_GetValue()

等待转换结束函数

• HAL_ADC_PollForConversion(&hadc1, 50);

第一个参数为那个ADC,第二个参数为最大等待时间

ADC中断回调函数
• HAL_ADC_ConvCpltCallback()

转换完成后回调,DMA模式下DMA传输完成后调用

规则通道及看门狗配置

• HAL_ADC_ConfigChannel() 配置规则组通道
• HAL_ADC_AnalogWDGConfig()

原理讲解部分参考: https://blog.csdn.net/weixin_42653531/article/details/81123770 https://zhuanlan.zhihu.com/p/27866193 正点原子 --ADC

【STM32】HAL库 STM32CubeMX教程九---ADC相关推荐

  1. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...

  2. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  3. 【STM32】HAL库 STM32CubeMX教程十---DAC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  4. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 上一讲我们说了CubeMX配置SDRAM的一些基本配置,还有FMC跟SDRAM的讲解,这一讲我们 ...

  5. 【STM32】HAL库 STM32CubeMX教程十四---SPI

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...

  6. 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...

  7. STM32 HAL库 CubeMX教程(五)串口通信基础

    STM32 HAL库 CubeMX教程(五)串口通信基础 串口通信简介 CubeMX配置 初始化程序分析 程序编写 参考文献 STM32 HAL库 CubeMX系列教程 目录 串口通信简介 UART: ...

  8. 【STM32】HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)

    前言:   今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,窗口看门狗的使 ...

  9. 【STM32】HAL库 STM32CubeMX教程六----定时器中断

    前言: 今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等.是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将 ...

最新文章

  1. 踢毽也能治胃病,适当的运动带来健康,健康带来快乐
  2. Nginx 学习笔记(四) Nginx+keepalived
  3. jQuery学习教程(一):入门
  4. gitlable iphone_使用gitlab ci构建IOS包并发送通知消息到企业微信
  5. testlink(以及服务器)问题定位思路
  6. Newsgroups数据集介绍
  7. java 注解 @?(name=quot;usernamequot;),【MyBatis】MyBatis 注解开发
  8. 面试题|集合ArrayList list = new ArrayList(20) 中的list扩充几次?
  9. 相同源代码的html文件在本地和服务器端被浏览器请求时,显示的效果不一样!!!...
  10. bat执行cmd命令_kettle定时任务pan.bat和kitchen.bat
  11. linux用for循环写九九乘法表,写一个方法,用一个for循环打印九九乘法表
  12. 【转】写给支持和反对《完全用Linux工作》的人们
  13. python英雄对战代码_Python爬虫获取op.gg英雄联盟英雄对位胜率代码
  14. 温暖和暖和的区别Java_国内冬天哪里比较暖和 冬天暖和的城市排名
  15. Android 视频播放器
  16. SQLServer2008 SQLSERVER服务远程过程调用失败解决方案
  17. OSChina 周三乱弹 —— 无他,唯眼熟尔
  18. android撕衣服案例解析
  19. 【报告分享】2022百度职业资格考试培训行业洞察-百度营销研究院(附下载)
  20. Smarting:第一款真正意义上的便携式可移动脑电设备

热门文章

  1. 无法定位程序输入点(cmake opencv_contrib,并配置后)
  2. 华为前三季度营收4458亿元;周鸿祎谈程序员35岁就会被淘汰;金山WPS月活用户已超5.7亿 | EA周报...
  3. 关于Servlet的两种配置Web.xml文件配置或者使用(@WebServlet(name = ,urlPatterns = ))配置问题——WebServlet注解
  4. 微分恒等式(助于找到均值、方差和其他矩)
  5. netts之 CTWSocket代码流程分析(整体是客户端请求式的)
  6. 计算机专硕可以考事业编吗,专硕考事业编制遇冷
  7. Unity摄像机对象锁定旋转运镜模拟
  8. 程序员必备的十四款工具,你都用过吗?
  9. 解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。
  10. Q版京剧脸谱来喽——花旦