ADC 교정

이른바 교정


이상적인 ADC는 GND를 입력할 때 0, Vdd를 입력할 때 최대값입니다.하지만 실제 ADC는 오차가 있다.
0이 안 되는 오차를 편이 오차라고 하고 최대치가 안 되는 오차를 이득 오차라고 한다.
자세한 내용은 아래의 홈페이지를 보십시오.
https://ednjapan.com/edn/articles/1810/02/news018_4.html
이 문제를 수정하려면 GND를 연결할 때의 ADC 값과 Vdd를 연결할 때의 ADC 값을 저장한 다음 함수를 사용하여 0V와 Vdd로 수정하십시오.
校正後電圧 = \frac{Vdd*(ADC値 - GNDを接続したときのADC値)}{Vddを接続したときのADC値-GNDを接続したときのADC値}

Nulceo-F401 RE의 인스턴스


Nucleo-F401을 사용하여 실제로 시도해 보십시오.
STM32 CubeIDE에서 PA0을 GND에 연결하고 PA1을 Vdd에 연결하며 PA4를 가변 저항기의 출력에 연결합니다.가변 저항기의 양 끝은 Vdd와 GND를 연결하고 출력 범위는 0에서 3.3V로 바뀐다.


코드는 다음과 같습니다.
/* USER CODE BEGIN 0 */
uint32_t OffsetAcc = 0;
uint32_t GainAcc = 0;
uint32_t ADCValue;
float V;
/* USER CODE END 0 */
  /* USER CODE BEGIN 1 */
    ADC_ChannelConfTypeDef sConfig = {0};
  /* USER CODE END 1 */
  /* USER CODE BEGIN 2 */

  // Get Offset Accuracy
  // GND connect with ADC_IN0
  // Init sConfig for ADC_IN0 is in MX_ADC1_Init
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1,1000);
  OffsetAcc = HAL_ADC_GetValue(&hadc1);
  HAL_ADC_Stop(&hadc1);
  hadc1.Instance->SQR1 = 0;

  // Get Gain Accuracy
  // Vdd connect with ADC_IN1
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1,1000);
  GainAcc = HAL_ADC_GetValue(&hadc1);
  HAL_ADC_Stop(&hadc1);
  hadc1.Instance->SQR1 = 0;

  // Get ADC and convert to calibrated value
  // I connect the ADC port with ADC_IN4
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

  /* USER CODE END 2 */
    /* USER CODE BEGIN 3 */
      // Get ADC Value
      HAL_ADC_Start(&hadc1);
      HAL_ADC_PollForConversion(&hadc1,1000);
      ADCValue = HAL_ADC_GetValue(&hadc1);
      HAL_ADC_Stop(&hadc1);

      // Get calibrated Voltage
      V = 3.3F*((float)ADCValue - (float)OffsetAcc)/((float)GainAcc - (float)OffsetAcc);
      __NOP();
__NOP()에서 breakpoint를 설정합니다.

Expression에 관련 변수를 표시합니다.

실행 후 아래와 같다.

전원을 켤 때마다 이 교정을 하는 것이 가장 좋으나, 한 번 측정한 후에 이 값을 사용할 수도 있다.
각 판과 STM32에 의존하기 때문에 모든 판을 다 가는 것이 가장 좋다.
몇 개의 STM32 시리즈는 자동 교정 레지스터에 1비트만 설정하면 이 기능을 실현할 수 있다.STM32F401은 그 기능이 없기 때문에 스스로 진행해야 한다.
소스 코드는 GiitHub에 배치됩니다.
https://github.com/kotetsuy/STM32forWindowsDemos/tree/master/ADCCalibration

좋은 웹페이지 즐겨찾기