STM32F407ADC数据采集

ADC

ADC(模数转换器)是一种将模拟信号转换为数字数据的设备或模块。

在这里插入图片描述

  1. Scan Conversion Mode(扫描模式)

当使能一个以上通道时,默认开启。

2.Continuous Conversion Mode(连续转换模式)

选择是否使能连续转换模式。不使能相当于单次转换模式,ADC会将通道的所有转换执行一次。使能的话,相当于连续转换模式,该模式用于常规通道。在连续转换模式下,如果发生软件或者硬件触发,ADC会执行所有常规通道的转换,随后会自动重启并继续执行每一个通道的转换。若想使用ADC+DMA的话,必须先使能连续转换模式。

3.Discontinuous Conversion Mode(不连续序列转换模式)

配置ADC规则组转换序列的不连续方式。这里的不连续含义是指每次触发进行一个子组的转换,跟Continuous Conversion Mode的连续含义不一样。例如使能了该配置,该参数的下方就立马出现Number Of Discontinuous Conversions,如果它设为2,且ADC1使能了通道1,2,5,7,10,11的话,那么第一次触发ADC1采样时,就会采样通道1与通道2的值,再一次触发ADC1采样的话,就会采样通道5与通道7值,如此类推。值得注意的是,Continuous Conversion Mode与Discontinuous Conversion Mode不能同时使能,两者不能共存。1

4.End of Conversion Selection(结束转换的选择)

>选择结束转换的事件。有End of single conversion(EOC) 与 End of all of conversion(EOS)两种选择。这两个事件会触发中断与DMA。一般选择EOS,等所有通道转换完毕后,产生中断后将全部数据取出来,或者使用DMA将全部数据取出来

1.EOC flag at the end of single channel conversion:ADC EOC SINGLE CONV
连续转换模式:在连续转换模式下,ADC会根据预定义的通道顺序,连续地进行模数转换。每次转换完成后,会产生EOC(End of Conversion)标志,并自动开始下一次转换。这种模式适用于需要连续采样多个通道的应用场景。
2.EOC flag at the end ofall conversions:ADC EOC SEQ CONV
单次转换模式:在单次转换模式下,ADC只会执行一次转换,并在转换完成后自动停止。当转换完成时,会产生EOC标志。这种模式适用于只需要进行单次采样的应用场景。

5.Numer of Conversion(转换通道的数量)

转换通道的数量(支持1 - 16)。

6.External Trigger Conversion Soure(触发转换的外部来源)

选择触发转换的来源:
Regular Conversion launched by software (软件触发)
Timer 1 Capture Compare 1 event (定时器1捕获比较事件1)
Timer 1 Capture Compare 2 event(定时器1捕获比较事件2)
Timer 1 Capture Compare 3 event(定时器1捕获比较事件3)
… (各种定时器触发来源)

7.External Trigger Conversion Edge(触发转换的外部沿)

选择定时器触发时,需要进一步选择触发的沿。选择软件触发时,该项为None。
Trigger detection on the rising edge(上升沿)
Trigger detection on the falling edge(下降沿)
Trigger detection on the rising and falling edge(上升与下降沿)

8.Rank

  • Channel
    选择采样的通道
  • Sampling Time
    过采样的时间。ADC的采样速度 = 过采样时间 + 逐次逼近时间

工作模式

1. 独立模式

采集电阻阻值

在这里插入图片描述

1.1. 单通道单次采集

CubeMX ADC配置

在这里插入图片描述

Scan Conversion Mode(扫描模式):多通道时开启

  /* USER CODE BEGIN 2 */
 HAL_ADC_Start(&hadc1);
  /* USER CODE END 2 */
  while (1)
  {
	  uint8_t res;
	  char buff[64];
	  HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY);
	  res=HAL_ADC_GetValue(&hadc1);
	  sprintf(buff,"%f\r\n",(res*3.3)/4096);
	  HAL_UART_Transmit(&huart1,(uint8_t *)buff,strlen(buff),HAL_MAX_DELAY);
	  HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

HAL_ADC_PollForConversion()函数是HAL库提供的一个用于轮询ADC转换完成的函数。它的作用是等待ADC转换完成,并检查转换状态。

HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
  • hadc:ADC句柄,指向要使用的ADC设备。
  • Timeout:超时时间,以毫秒为单位。如果在指定的超时时间内转换未完成,函数将返回超时错误。

仅转换一次,之后ADC自动关闭

1.2.单通道连续采集

在这里插入图片描述

  /* USER CODE BEGIN 2 */
 HAL_ADC_Start(&hadc1);
  /* USER CODE END 2 */
  while (1)
  {
	  uint8_t res;
	  char buff[64];
	  HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY);
	  res=HAL_ADC_GetValue(&hadc1);
	  sprintf(buff,"%f\r\n",(res*3.3)/4096);
	  HAL_UART_Transmit(&huart1,(uint8_t *)buff,strlen(buff),HAL_MAX_DELAY);
	  HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

ADC只需开启一次,之后将一直转换

在HAL_UART_Transmit()函数中,HAL_MAX_DELAY作为第四个参数传递,用于指定等待数据传输完成的最长时间。即,在数据发送过程中,如果数据传输的时间超过了HAL_MAX_DELAY所代表的时间,函数才会返回。使用HAL_MAX_DELAY作为参数可以让函数在数据传输完成之前无限等待,直到数据完全发送或发生错误。这在某些情况下可能是有用的,例如当需要确保数据完整地发送到UART设备,而不考虑传输所需的时间。

1.2.多通道单次采集

触发一次,会转换所有选择的通道一次;等同于,只用调用一次HAL_ADC_Start(),就可转换所有选中通道一次

在这里插入图片描述

在这里插入图片描述

通道列表

在这里插入图片描述

  while (1)
  {
	  int res[3];
	  char buff[64];
	  for (int i=0;i<3;i++)
	  {
		if(HAL_OK==HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY))
		{res[i]=HAL_ADC_GetValue(&hadc1);}
	  }
	  sprintf(buff,"%f,%f,%f\r\n",(res[0]*3.3)/4095,(res[1]*3.3)/4095,(res[2]*3.3)/4095);
	  HAL_UART_Transmit(&huart1,(uint8_t *)buff,strlen(buff),HAL_MAX_DELAY);
	  HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

通过将 HAL_ADC_PollForConversion 的返回值与 HAL_OK 进行比较,可以检查 ADC 转换是否成功完成。如果返回值与 HAL_OK 相等,表示转换成功完成;如果返回值不等于 HAL_OK,则可能表示转换过程中发生了错误,需要根据具体的返回值进行错误处理或其他操作。

1.2.多通道连续采集(DMA)

在这里插入图片描述

多通道规则转换表:按照自己需求配置

在这里插入图片描述

ADC按照转换表依次采集,ADC每转换一次DMA就进行一次转运

在这里插入图片描述

/* USER CODE BEGIN PV */
uint16_t res[3];
/* USER CODE END PV */

定义一个元素类型为16位,元素个数为3的数组用来存放一轮ADC转换的结果

  /* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)res,6);
  /* USER CODE END 2 */

HAL_ADC_Start_DMA 函数用于启动ADC的DMA转换,(uint32_t *)res 表示要传输数据的源地址,6 表示要传输的数据长度,它的计算单位是字节,DMA每次转运半字(2个字节),总共3个通道,最终算的6个字节。

  while (1)
  {
	  
	  char buff[64];
	  sprintf(buff,"%f,%f,%f\r\n",(res[0]*3.3)/4095,(res[1]*3.3)/4095,(res[2]*3.3)/4095);
	  HAL_UART_Transmit(&huart1,(uint8_t *)buff,strlen(buff),HAL_MAX_DELAY);
	  HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

多通道轮询模式可以参考这篇博客: STM32CubeMX配置ADC采样

2.双重模式

2.1. 单通道单次采集

2.2.单通道连续采集

2.2.多通道单次采集

2.2.多通道连续采集

3.三重模式

3.1. 单通道单次采集

3.2.单通道连续采集

3.2.多通道单次采集

3.2.多通道连续采集

补充


  1. 参考链接:https://blog.csdn.net/wallace89/article/details/117048846 ↩︎

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值