天天看点

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

ADC介绍

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

模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。

ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。

ADC特性

● 12位分辨率

● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断

● 单次和连续转换模式

● 从通道0到通道n的自动扫描模式

● 自校准 ● 带内嵌数据一致性的数据对齐

● 采样间隔可以按通道分别编程

● 规则转换和注入转换均有外部触发选项

● 间断模式

● 双重模式(带2个或以上ADC的器件)

● ADC转换时间:

─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)

● ADC供电要求:2.4V到3.6V

● ADC输入范围:VREF- ≤ VIN ≤ VREF+

● 规则通道转换期间有DMA请求产生。

ADC功能描述

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

1.ADC电压输入范围

ADC所能测量的电压范围就是VREF- ≤ VIN ≤ VREF+,把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到ADC 的输入电压范围为: 0~3.3V。

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化
STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

2.输入通道

ADC的信号输入就是通过通道来实现的,信号通过通道输入到单片机中,单片机经过转换后,将模拟信号输出为数字信号。STM32中的ADC有着18个通道,其中外部的16个通道已经在框图中标出,如下:

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

ADC的全部通道:

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

外部的16个通道在转换时又分为规则通道和注入通道,其中规则通道最多有16路,注入通道最多有4路。

规则通道

规则通道顾名思义即最常用的通道,单个使用ADC转换都是用规则通道实现的。

注入通道

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

3.转换顺序

有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进 行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道 2、通道0、通道2、通道2、通道15。

● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规 则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中。

● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入 组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。

如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉 冲将发送到ADC以转换新选择的组。

规则通道转换顺序

规则通道中的转换顺序由三个寄存器控制:SQR1、SQR2、SQR3,它们都是32位寄存器。SQR寄存器控制着转换通道的数目和转换顺序,只要在对应的寄存器位SQx中写入相应的通道,这个通道就是第x个转换。

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化
STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化
STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

注入通道转换顺序

和规则通道转换顺序的控制一样,注入通道的转换也是通过注入寄存器来控制,只不过只有一个JSQR寄存器来控制,控制关系如下:

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

需要注意的是,只有当JL=4的时候,注入通道的转换顺序才会按照JSQ1、JSQ2、JSQ3、JSQ4的顺序执行。当JL=3时,执行顺序为:JSQ2、JSQ3、JSQ4。当JL=2时,执行顺序为:JSQ3、JSQ4。当JL=1时,执行顺序为:JSQ4。

4.触发源

ADC转换的输入、通道、转换顺序都已经说明了,但ADC转换是怎么触发的呢?就像通信协议一样,都要规定一个起始信号才能传输信息,ADC也需要一个触发信号来实行模/数转换。

其一就是通过直接配置寄存器触发,通过配置控制寄存器CR2的ADON位,写1时开始转换,写0时停止转换。在程序运行过程中只要调用库函数,将CR2寄存器的ADON位置1就可以进行转换,比较好理解。

另外,还可以通过内部定时器或者外部IO触发转换,也就是说可以利用内部时钟让ADC进行周期性的转换,也可以利用外部IO使ADC在需要时转换,具体的触发由控制寄存器CR2决定。

ADC_CR2寄存器的详情如下:

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化
STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化
STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

5.转换时间

ADC的每一次信号转换都要时间,这个时间就是转换时间,转换时间由输入时钟和采样周期来决定。

输入时钟

由于ADC在STM32中是挂载在APB2总线上的,所以ADC得时钟是由PCLK2(72MHz)经过分频得到的,分频因子由 RCC 时钟配置寄存器RCC_CFGR 的位 15:14 ADCPRE[1:0]设置,可以是 2/4/6/8 分频。(ADC的输入时钟不得超过14MHz)

采样周期

ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和 ADC_SMPR2寄存器中的SMP[2:0]位更改。ADC_SMPR2 控制的是通道 0~9, ADC_SMPR1 控制的是通道 10~17。

每个通道可以分别用不同的时间采样,但最小的采样周期是1.5个周期,也就是说如果想最快时间采样就设置采样周期为1.5.

转换时间

转换时间= 采样时间+ 12.5个周期

例:当ADCCLK=14MHz,采样时间为1.5周期 TCONV = 1.5 + 12.5 = 14周期 = 1μs

6.数据寄存器

转换完成后的数据就存放在数据寄存器中,但数据的存放也分为规则通道转换数据和注入通道转换数据的。

规则数据寄存器

规则数据寄存器负责存放规则通道转换的数据,通过32位寄存器ADC_DR来存放。

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

当使用ADC独立模式(也就是只使用一个ADC,可以使用多个通道)时,数据存放在低16位中,当使用ADC多模式时高16位存放ADC2的数据。需要注意的是ADC转换的精度是12位,而寄存器中有16个位来存放数据,所以要规定数据存放是左对齐还是右对齐。

当使用多个通道转换数据时,会产生多个转换数据,然鹅数据寄存器只有一个,多个数据存放在一个寄存器中会覆盖数据导致ADC转换错误,所以我们经常在一个通道转换完成之后就立刻将数据取出来,方便下一个数据存放。一般开启DMA模式将转换的数据,传输在一个数组中,程序对数组读操作就可以得到转换的结果。

注入数据寄存器

注入通道转换的数据寄存器有4个,由于注入通道最多有4个,所以注入通道转换的数据都有固定的存放位置,不会跟规则寄存器那样产生数据覆盖的问题。 ADC_JDRx 是 32 位的,低 16 位有效,高 16 位保留,数据同样分为左对齐和右对齐,具体是以哪一种方式存放,由ADC_CR2 的 11 位 ALIGN 设置。

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

7.中断

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

从框图中可以知道数据转换完成之后可以产生中断,有三种情况:

规则通道转换完成中断

规则通道数据转换完成之后,可以产生一个中断,可以在中断函数中读取规则数据寄存器的值。这也是单通道时读取数据的一种方法。

注入通道转换完成中断

注入通道数据转换完成之后,可以产生一个中断,并且也可以在中断中读取注入数据寄存器的值,达到读取数据的作用。

模拟看门狗事件

当输入的模拟量(电压)不再阈值范围内就会产生看门狗事件,就是用来监视输入的模拟量是否正常。

以上中断的配置都由ADC_SR寄存器决定:

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都有 独立的中断使能位。

注: ADC1和ADC2的中断映射在同一个中断向量上,而ADC3的中断有自己的中断向量。 ADC_SR寄存器中有2个其他标志,但是它们没有相关联的中断:

● JSTRT(注入组通道转换的启动)

● STRT(规则组通道转换的启动)

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

8.电压转换

转换后的数据是一个12位的二进制数,我们需要把这个二进制数代表的模拟量(电压)用数字表示出来。

比如测量的电压范围是0~3.3V,转换后的二进制数是x,因为12位ADC在转换时将电压的范围大小也就是3.3分为4096份,所以真实电压的计算方法就是:y=3.3* x / 4096

9.数据对齐

ADC_CR2寄存器中的ALIGN位选择转换后数据储存的对齐方式。数据可以左对齐或右对齐。

注入组通道转换的数据值已经减去了在ADC_JOFRx寄存器中定义的偏移量,因此结果可以是一 个负值。

SEXT位是扩展的符号值。 对于规则组通道,不需减去偏移值,因此只有12个位有效。

STM32F103ZE_ADC笔记ADC介绍ADC特性ADC功能描述ADC初始化

ADC初始化

ADC配置函数

void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;      //禁止扫描模式,多通道时使用
  hadc1.Init.ContinuousConvMode = DISABLE;         //禁止连续转换模式
  hadc1.Init.DiscontinuousConvMode = DISABLE;      //禁止间断模式
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;//不使用外部触发转换,采用软件触发
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;      //数据结构右对齐
  hadc1.Init.NbrOfConversion = 1;                  //一个转换通道
  HAL_ADC_Init(&hadc1)

  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;        // ADC内部通道(设备引脚上没有连接)
  sConfig.Rank = ADC_REGULAR_RANK_1;               //规则通道1
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;  //采样时间1.5 ADC时钟周期
  HAL_ADC_ConfigChannel(&hadc1, &sConfig)


}
           

ADC函数

(1)HAL_ADC_Start

功能:开启ADC 

例:HAL_ADC_Start(&hadc1);

说明:hadc1由STM32Cube自动生成,为结构体变量

(2)HAL_ADC_PollForConversion

功能:等待转化完成,完成跳过

例:HAL_ADC_PollForConversion(&hadc1,100);

说明:表示等待转换完成.第一空填写第个ADC,第二个填写超时时间或最多等多久(单位为毫秒)

(3)HAL_ADC_GetValue(&hadc1)

功能:读取ADC转换数据,数据为12位(最大为4096)。

(4)HAL_ADC_GetState(&hadc1)

功能:为换取ADC状态,

(5)HAL_ADC_STATE_REG_EOC

功能:表示转换完成标志位,转换数据可用。

(6)HAL_IS_BIT_SET(XX, XX)

例:HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)

说明:就是判断转换完成标志位是否设置。

继续阅读