这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32WBA55ADC采集电池电压任务2

共1条 1/1 1 跳转至

STM32WBA55ADC采集电池电压任务2

工程师
2025-01-09 20:31:15   被打赏 1 分(兑奖)     打赏

在STM32WBA55微控制器上执行ADC模数转换器采集电池电压的任务我分了几个步骤进行。

ADC理解、配置ADC模块、选择正确的通道、启动转换、读取转换结果以及可能需要的滤波或处理步骤。


一、ADC理解

STM32WBA55包含一个12位ADC模数转换器。

ADC具有多个通道,可以测量来自不同信号源的模拟信号,并将其转换为数字信号以供微控制器处理。

STM32WBA55的ADC还支持多种特性和功能,高精度、低功耗、硬件过采样等,可以满足多种应用场景的需求。

STM32WBA55的MCU供电电压为3.3V,且VREF+与VDDA相连,VREF-与地相连,ADC的输入电压范围通常为0V至3.3V,ADC模块的参考电压与MCU的供电电压一致,所以ADC的参考电压为3.3V。

ADC的特性:

image.png

ADC精度:

image.png

ADC连接示意

工作原理: ADC在模拟信号转化为数字信号需要经过采样、保持、量化和编码。采样和保持在采样保持电路中完成,而量化和编码步骤则在ADC中完成。

image.png



二、 配置ADC与硬件连接


1736425317869.jpg

连接引脚:

image.png

连接实物图:

1736431238480.png

使用STM32CubeMX通过调用HAL库来完成。主要的功能配置是选择ADC的通道号,端口,分辨率、采样时间、扫描模式等。


三.代码:

		if (HAL_ADC_Start(&hadc4) != HAL_OK)  
    {  
      /* ADC conversion start error */  
      Error_Handler();  
    }  
			/* Wait for ADC conversion completed */  
    if (HAL_ADC_PollForConversion(&hadc4, 10) != HAL_OK)  
    {  
      /* End Of Conversion flag not set on time */  
      Error_Handler();  
    } 

		ADC_Data = HAL_ADC_GetValue(&hadc4);  
		voltage=ADC_Data*3.3/4096;  
 
		HAL_Delay(1000);
		printf(" Hello, World! \r\n");  
		printf(" www.eepw.com.cn\r\n");  
		printf(" ADC_Data = %5d\r\n",ADC_Data); 
		printf(" voltage = %1.3fv\r\n",voltage); 
  }
  
  初始化:
  
  void MX_ADC4_Init(void)
{

  /* USER CODE BEGIN ADC4_Init 0 */

  /* USER CODE END ADC4_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC4_Init 1 */

  /* USER CODE END ADC4_Init 1 */

  /** Common config
  */
  hadc4.Instance = ADC4;
  hadc4.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
  hadc4.Init.Resolution = ADC_RESOLUTION_12B;
  hadc4.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc4.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc4.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc4.Init.LowPowerAutoPowerOff = DISABLE;
  hadc4.Init.LowPowerAutonomousDPD = ADC_LP_AUTONOMOUS_DPD_DISABLE;
  hadc4.Init.LowPowerAutoWait = DISABLE;
  hadc4.Init.ContinuousConvMode = DISABLE;
  hadc4.Init.NbrOfConversion = 1;
  hadc4.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc4.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc4.Init.DMAContinuousRequests = DISABLE;
  hadc4.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_LOW;
  hadc4.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  hadc4.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_79CYCLES_5;
  hadc4.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_79CYCLES_5;
  hadc4.Init.OversamplingMode = ENABLE;
  hadc4.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16;
  hadc4.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4;
  hadc4.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
  if (HAL_ADC_Init(&hadc4) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
  if (HAL_ADC_ConfigChannel(&hadc4, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC4_Init 2 */

  /* USER CODE END ADC4_Init 2 */

}


四、 输出结果:

image.png









共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]