STM32CubeMX系列教程7:模数转换(ADC)

发布者:Shuangfei最新更新时间:2020-06-23 来源: eefocus关键字:STM32CubeMX系列  模数转换  ADC 手机看文章 扫描二维码
随时随地手机看文章

本章通过两个例程介绍STM32的模数转换器(ADC),第一个通过ADC采集内部温度传感器通道电压,然后得出MCU内部温度。第二个通过DMA的方式采集两个ADC通道电压。


1.ADC

本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。ADC1外设选择温度传感器通道。


ADC1配置如下,选择默认设置。其Date Alignment设置为数据右对齐。


生成报告以及代码,编译程序。在adc.c文件中可以看到ADC初始化函数。

在stm32f7xx_hal_adc.h头文件中可以找到如下ADC操作函数。和串口一样,ADC也可以通过三种方式控制。


01

/** @addtogroup ADC_Exported_Functions_Group2

02

  * @{

03

  */

04

/* I/O operation functions ******************************************************/

05

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);

06

HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);

07

HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);

08

  

09

HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout);

10

  

11

HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);

12

HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);

13

  

14

void              HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);

15

  

16

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);

17

HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);

18

  

19

uint32_t          HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);

20

  

21

void       HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);

22

void       HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc);

23

void       HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc);

24

void       HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc);


在main()函数前面声明变量保存AD采集的值。


1

/* USER CODE BEGIN PV */

2

/* Private variables ---------------------------------------------------------*/

3

uint16_t AD_Value = 0;

4

/* USER CODE END PV */


在main()函数while(1)循环里面添加函数声明变量保存AD采集的值。


01

/* USER CODE BEGIN WHILE */

02

while (1)

03

{

04

/* USER CODE END WHILE */

05

 

06

/* USER CODE BEGIN 3 */

07

      /*##-1- Start the conversion process #######################################*/ 

08

      HAL_ADC_Start(&hadc1);

09

 

10

      /*##-2- Wait for the end of conversion #####################################*/ 

11

       /*  Before starting a new conversion, you need to check the current state of

12

                  the peripheral; if it’s busy you need to wait for the end of current

13

                  conversion before starting a new one.

14

                  For simplicity reasons, this example is just waiting till the end of the

15

                  conversion, but application may perform other tasks while conversion

16

                  operation is ongoing. */

17

      HAL_ADC_PollForConversion(&hadc1, 50);

18

 

19

      /* Check if the continous conversion of regular channel is finished */ 

20

      if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))

21

      {

22

          /*##-3- Get the converted value of regular channel  ######################*/

23

          AD_Value = HAL_ADC_GetValue(&hadc1);

24

          printf("MCU Temperature : %.1f¡ærn",((AD_Value*3300/4096-760)/2.5+25));

25

      }

26

      HAL_Delay(1000);

27

}

28

/* USER CODE END 3 */


HAL_ADC_Start(&hadc1)为启动ADC装换,

HAL_ADC_PollForConversion(&hadc1, 50);表示等待转换完成,第二个参数表示超时时间,单位ms.

HAL_ADC_GetState(&hadc1)为换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用。

HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)就是判断转换完成标志位是否设置。

HAL_ADC_GetValue(&hadc1);读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0~4095.


AD_Value*3300/4096为将转换后的数据转化为电压,单位为mV,参考电压为3.3V。查询数据手册可以电压和温度的关系。经过计算公式装换后等到MCU内部温度值。


编译程序并下载到开发板。打开串口调试助手。设置波特率为115200。串口助手上会显示MCU温度。


2.ADC_DMA

前面介绍了通过ADC轮询的方式采集单通道的数据。现在介绍一下通过DMA方式采集多通道的数据。

复制串口printf工程的工程,修改文件夹名。点击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。本实验使用微雪Analog Test Board接到SPI1接口。更具原理图配置PA6,PA7管脚作为ADC1的输入管脚。


ADC1配置:使能扫描转换模式(Scan Conversion Mode),使能连续转换模式(Continuous Conversion Mode),使能DMA连续请求。ADC规则组选择转换通道数为2(Number Of Conversion)。其他为默认设置。


添加DMA设置,设置为连续传输模式,数据长度为字。

生成报告以及代码,编译程序。在adc.c文件中可以看到ADC初始化函数。

在main函数前面添加变量。其中ADC_Value作为转换数据缓存数组,ad1,ad2存储PA6,PA7的电压值。


1

/* USER CODE BEGIN PV */

2

/* Private variables ---------------------------------------------------------*/

3

uint32_t ADC_Value[100];

4

uint8_t i;

5

uint32_t ad1,ad2;

6

/* USER CODE END PV */


在while(1)前面以DMA方式开启ADC装换。HAL_ADC_Start_DMA()函数第二个参数为数据存储起始地址,第三个参数为DMA传输数据的长度。


1

/* USER CODE BEGIN 2 */

2

  /*##-1- Start the conversion process and enable interrupt ##################*/ 

3

HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 100);

4

/* USER CODE END 2 */


由于DMA采用了连续传输的模式,ADC采集到的数据会不断传到到存储器中(此处即为数组ADC_Value)。ADC采集的数据从ADC_Value[0]一直存储到ADC_Value[99],然后采集到的数据又重新存储到ADC_Value[0],一直到ADC_Value[99]。所以ADC_Value数组里面的数据会不断被刷新。这个过程中是通过DMA控制的,不需要CPU参与。我们只需读取ADC_Value里面的数据即可得到ADC采集到的数据。


其中ADC_Value[0]为通道6(PA6)采集的数据,ADC_Value[1]为通道7(PA7)采集的数据,ADC_Value[2]为通道6采集的数据,如此类推。数组偶数下标的数据为通道6采集数据,数组奇数下标的数据为通道7采集数据。


在while(1)循环中添加应用程序,将采集的数据装换为电压值并输出。


01

/* USER CODE BEGIN WHILE */

02

  while (1)

03

  {

04

  /* USER CODE END WHILE */

05

  

06

  /* USER CODE BEGIN 3 */

07

        HAL_Delay(500);

08

        for(i = 0,ad1 =0,ad2=0; i < 100;)

09

        {

10

            ad1 += ADC_Value[i++];

11

            ad2 += ADC_Value[i++];

12

        }

13

        ad1 /= 50;

14

        ad2 /= 50;

15

  

16

        printf("rn******** ADC DMA Example ********rnrn");

17

        printf(" AD1 value = %1.3fV rn", ad1*3.3f/4096);

18

        printf(" AD2 value = %1.3fV rn", ad2*3.3f/4096);

19

  }

20

  /* USER CODE END 3 */


程序中将数组偶数下标数据加起来求平均值,实现均值滤波的功能,再将数据装换为电压值,即为PA6管脚的电压值。同理对数组奇数下标数据处理得到PA7管脚的电压值。


编译程序并下载到开发板。打开串口调试助手。设置波特率为115200。串口助手上会显示采集到的电压值,旋转Analog Test Board上电位器,输出的电压值会改变。 

编译程序并下载到开发板。打开串口调试助手。设置波特率为115200。串口助手上会显示采集到的电压值,旋转Analog Test Board上电位器,输出的电压值会改变。       


关键字:STM32CubeMX系列  模数转换  ADC 引用地址:STM32CubeMX系列教程7:模数转换(ADC)

上一篇:STM32CubeMX系列教程8:数模转换(DAC)
下一篇:STM32CubeMX系列教程6:直接存储器访问 (DMA)

推荐阅读最新更新时间:2024-11-13 12:06

STM32F429HAL库ADCDMA学习笔记
做了一个ADC的程序一直想学习一下DMA的配置,我一直也是不懂DMA到底有什么用处,还是感觉很鸡肋。稍微配置了一下,我是这样理解DMA的。在配置了dma之后我们adc的数据不会再由cpu搬运,我们直接读取我们DMA数据是节省adc时间。直接看配置 void MY_ADC_Init(void) { ADC_ChannelConfTypeDef ADC1_ChanConf; ADC1_Handler.Instance=ADC1; ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ A
[单片机]
ADI公司发布12位、2.5 GSPS ADC
该模块集成AD9625-2.5 ADC,提供宽带RF GSPS数据转换器与FPGA平台实现互操作所需的全部硬件和软件。 中国,北京 — Analog Devices, Inc. (NASDAQ:ADI)全球领先的高性能信号处理解决方案供应商及数据转换器市场份额领先者*,近日宣布即日开始供货AD-FMCADC2-EBZ FMC模块,其HDL代码和软件驱动程序,用于快速设计原型制作并与Xilinx FPGA实现互操作性。AD-FMCADC2-EBZ板集成同时推出的12位、2.5 GSPS AD9625-2.5 ADC,提供输入巴伦、电源和软件堆栈。此模块提供出色的宽带动态性能和集成式功能,可实现高级RF采样架构的开发和原型制作。AD
[模拟电子]
STM32CubeMX系列教程
STM32Cube 是一个全面的软件平台,包括了ST产品的每个系列。平台包括了STM32Cube 硬件抽象层(一个STM32抽象层嵌入式软件,确保在STM32系列最大化的便携性)和一套的中间件组件(RTOS, USB, FatFs, TCP/IP, Graphics, 等等). 直观的STM32微控制器的选择和时钟树配置 微控制器图形化配置外围设备和中间件的功能模式和初始化参数 C代码生成项目覆盖STM32微控制器的初始化符合IAR™,Keil的™和GCC编译器。 对于新的产品设计,我们强烈推荐使用STM32Cube来加速你的开发过程,并为以后的产品平台移植打下良好的基础。 1.新建工程 打开STM32
[单片机]
<font color='red'>STM32CubeMX</font><font color='red'>系列</font>教程
一种多通道ADC采样板系统电路设计
  ADC板的设计从通道上来划分的话,可以分为单通道ADC板和多通道ADC板,除去有效位数、动态范围、最大采样率以及输入带宽等一些基本参数以外,多通道ADC板相对于单通道ADC板来说,往往还要衡量通道间幅度一致性和通道间相位一致性,这也正是多通道ADC板设计的一个难点。为了满足四路ADC之间通道间幅度一致性和通道间相位一致性的指标要求,首先需要将四路ADC芯片的采样时钟做到尽可能同步,实现四路ADC芯片对输入中频信号的同步采集。为此,本设计采取了把外部输入采样时钟通过同一时钟驱动芯片分发后送给四路ADC芯片作为同步采样时钟的方式,在时序上保证了四路ADC芯片采样时钟的同步。    时钟分发单元电路设计   时钟分发单元需要差分时
[电源管理]
一种多通道<font color='red'>ADC</font>采样板系统电路设计
MSP430之ADC采集滤波
占位符 1 /* 加权平均滤波 */ 2 static unsigned char coe = {1,2,3,4,5,6,7,8,9,10,11,12,13}; 3 static unsigned int coeSum= 1+2+3+4+5+6+7+8+9+10+11+12+13; 4 unsigned long temp = 0; 5 6 for (i = 0; i ADCN; i++) 7 { 8 temp += arr *coe ; 9 } 10 temp = (unsigned long )( temp * 1.0 / coeSum); 占位符 1 /* 中值
[单片机]
STM32入门篇—ADC教程
1、 main.c 简单清楚地一个例程,一个简单的ADC例程,调用了A0引脚测量电压值。 2、 ADC初始化 ,PTA0 M_ADC_Init(ADC1, ADC_CH0_Pin, ADC_ExternalTrigConv_None, 1, Rank_1); 3、 ADC初始化-- - ADC_CH0_Pin的选择 4、 ADC初始化---ADC_ExternalTrigConv_None的****选择 使用软件触发,一般不需要更改这个配置。 5、ADC初始化--- 1 的选择通道数: **6、**ADC初始化--- Rank_1 的采样顺序: 7、 ADC采样 : M_ADCx_GetValue(AD
[单片机]
STM32入门篇—<font color='red'>ADC</font>教程
具数字滤波和 1Msps 无延迟输出的 32 位 SAR ADC
2016年8月1日,凌力尔特公司 (Linear Technology Corporation) 推出超高精度 32 位逐次逼近寄存器 (SAR) 型模数转换器 (ADC) LTC2508-32。许多高性能应用 (包括数据采集、工业控制和医疗仪表) 均要求准确度和速度。这通常是通过在同一个系统中采用一个高分辨率 ADC 和一个高速 SAR ADC 来实现。 LTC2508-32 通过同时提供一个 32 位低噪声数字滤波输出和一个 14 位 1Msps 无延迟输出简化了此类混合 ADC 系统设计。由于这些输出是从单个 32 位 SAR ADC 内核产生,因此高准确度和高速输出是完全匹配的,即使当工作温度、电源和应力变化时也不例外
[测试测量]
具数字滤波和 1Msps 无延迟输出的 32 位 SAR <font color='red'>ADC</font>
STM8 ADC时序图
STM8 ADC时序图 如图149所示,在ADC上电后,在开始精确转换之前ADC需要一个稳定时间tSTAB(等于一次转换的时间tCONV),对于之后接下来的转换就不需要稳定延时,而且ADON位只需要被置位一次。一次ADC转换需要14个时钟周期,在转换完成后EOC标志被置位,同时转换结果保存在10位ADC数据寄存器里面。 (图149:STM8单次模式的时序图(CONT=0)) (图150:STM8单次模式的时序图(CONT=1))
[单片机]
STM8 <font color='red'>ADC</font>时序图
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved