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
Reference
이 문제에 관하여(ADC 교정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kotetsu_yama/items/d31da1e7ef6a4d21b097
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
校正後電圧 = \frac{Vdd*(ADC値 - GNDを接続したときのADC値)}{Vddを接続したときのADC値-GNDを接続したときのADC値}
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
Reference
이 문제에 관하여(ADC 교정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kotetsu_yama/items/d31da1e7ef6a4d21b097텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)