STM32WB55 ADC para obtener el valor de voltaje

Manual de referencia: da el método de cálculo y el canal de muestreo de voltaje de referencia interno ADC1_IN0 El
Inserte la descripción de la imagen aquí
manual de datos da la dirección del valor de calibración, aquí el manual de datos 3.6v está escrito incorrectamente,
prevalecerá el manual de referencia 3.0v.
Inserte la descripción de la imagen aquí
Resultados de medición reales

Valor de milivoltios a la derecha

McuAdc.c

#include <stdio.h>
#include <stdint.h>


#include "McuAdc.h"

ADC_HandleTypeDef hadc1;
uint32_t adcInitErr = 0;
/* Variables for ADC conversion data computation to physical values */
uint16_t   uhADCxConvertedData_Voltage_mVolt = 0;  /* Value of voltage calculated from ADC conversion data (unit: mV) */

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

  /** Common config 
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.NbrOfDiscConversion = 1;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    
    
		adcInitErr |= 1;
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_VREFINT;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    
    
		adcInitErr |= 1;
  }
  /* Run the ADC calibration */
//  if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK)
//  {
    
    
//    /* Calibration Error */
//    Error_Handler();
//  }
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
    
    

  if(adcHandle->Instance==ADC1)
  {
    
    
  /* USER CODE BEGIN ADC1_MspInit 0 */

  /* USER CODE END ADC1_MspInit 0 */
    /* ADC1 clock enable */
    __HAL_RCC_ADC_CLK_ENABLE();

    /* ADC1 interrupt Init */
    HAL_NVIC_SetPriority(ADC1_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(ADC1_IRQn);
  /* USER CODE BEGIN ADC1_MspInit 1 */

  /* USER CODE END ADC1_MspInit 1 */
  }
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{
    
    

  if(adcHandle->Instance==ADC1)
  {
    
    
  /* USER CODE BEGIN ADC1_MspDeInit 0 */

  /* USER CODE END ADC1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_ADC_CLK_DISABLE();

    /* ADC1 interrupt Deinit */
    HAL_NVIC_DisableIRQ(ADC1_IRQn);
  /* USER CODE BEGIN ADC1_MspDeInit 1 */

  /* USER CODE END ADC1_MspDeInit 1 */
  }
} 

/**
  * @brief : 采集电池电压
  */
void GetBatAdc(void)
{
    
    
  /* 读取芯片内部参考电压校准值 */
  __IO uint16_t VREFINT_CAL = *(__IO uint16_t *)(0x1FFF75AA);
	
  /* Variables for ADC conversion data */
  __IO uint16_t uhADCxConvertedData = 0; /* ADC group regular conversion data */
  
	/* Start ADC group regular conversion */
  if (HAL_ADC_Start(&hadc1) != HAL_OK)
  {
    
    
		adcInitErr |= 4;
    /* ADC conversion start error */
//    Error_Handler();
  }

    /* Wait till conversion is done */
    if (HAL_ADC_PollForConversion(&hadc1, 20) != HAL_OK)
    {
    
    
			adcInitErr |= 8;
      /* End Of Conversion flag not set on time */
//      Error_Handler();
    }
    else
    {
    
    
      /* Retrieve ADC conversion data */
      uhADCxConvertedData = HAL_ADC_GetValue(&hadc1);
      
      /* Computation of ADC conversions raw data to physical values           */
      /* using helper macro.                                                  */
      uhADCxConvertedData_Voltage_mVolt = 3000 * VREFINT_CAL / uhADCxConvertedData;
    }
}

void ShowAdc(void)
{
    
    
	GetBatAdc();
	printf("[err:0x%x]--> Adc:[%d]\n",adcInitErr,uhADCxConvertedData_Voltage_mVolt);
}

McuAdc.h

#ifndef __MCU_ADC_H_
#define __MCU_ADC_H_

#include "stm32wbxx_hal.h"

extern ADC_HandleTypeDef hadc1;

extern void ADC_Init(void);
extern void GetBatAdc(void);
extern void ShowAdc(void);
#endif /* __MCU_ADC_H_ */

Supongo que te gusta

Origin blog.csdn.net/qq_28851611/article/details/108115900
Recomendado
Clasificación