삽질 기반의 공학/ELECTRONIC

001. 전압센서, 회로와 코드를 보면서 원리를 짚어가기

반응형

서론

 

오늘 제가 연구해본 것은 아두이노 모듈 중 하나인 DM-425입니다.

DM-425는 전압 측정을 위해 제작된 모듈형 센서인데요.

특히 크기가 매우 작은 초소형 모듈이라 소규모 프로젝트 개발에 쓰기 좋습니다.

 


전압센서 자세히 살펴보기

DM-425의 사양은 이러합니다.

DM-425

MIN

MAX

입력 전압 범위

0V (DC)

25V (DC)

전압 측정 범위

0.02445V (DC)

25V (DC)

전압 아날로그 분해능

0.00489 V

해당 모듈에 0V에서 25V사이의 전원을 공급해주면 정상 측정이 가능하며

약 0.02V 부터 25V까지의 전압을 약 0.004V 단위로 분해하여 측정이 가능합니다.

총 단자는 5개로 이루어져 있으며 각각의 단자가 하는 기능은 아래와 같습니다.

부위

단자명

기능

하단

-

모듈의 접지 (Ground, -)

+

모듈의 입력 전원 (Voltage-In, +)

(해당 모듈은 전원이 필요 없음)

S

모듈의 출력 신호 (Signal)

상단

VCC

전압을 측정할 전기의 +극

GND

전압을 측정할 전기의 접지(-극)

핀 연결은 아래와 같이 해줍니다.

 


코드를 통해 원리 알기

 

/*
 * Date 2019.11.08    Maker : Hanul(KimJiHun)
 */
int voltPin = 14; //14 pin = A0 pin
double voltRead();

void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.print(voltRead()); Serial.println(" V");
  delay(1000);
}

double voltRead(){
  double ADC = analogRead(voltPin);
  double Vin = (ADC * 5.0) / 1024.0;
  double result = Vin / (7500.0/(30000.0+7500.0));
  return result;
}

위의 코드는 전압 측정 센서에서 아날로그 값을 받고 전압 계산식으로 처리해 시리얼 모니터로 1초 간격마다 출력해주는 코드입니다.

주목해야 할 부분은 바로 전압 계산식으로 처리하는 부분입니다.

double voltRead(){
  double ADC = analogRead(voltPin);
  double Vin = (ADC * 5.0) / 1024.0;
  double result = Vin / (7500.0/(30000.0+7500.0));
  return result;
}

그 원리를 이해해보기 위해 이 모듈 속에 숨어있는 내부 회로를 꺼내보겠습니다.

위의 회로도를 보니 계산식에 쓰여져 있었던 7500.0과 30000.0의 의미가 내부 회로에 있는 저항의 값이였다는 것을 알수가 있습니다.

  double ADC = analogRead(voltPin);
  double Vin = (Vout * 5.0) / 1024.0;
  double volt = Vin / (7500.0/(30000.0+7500.0));

 

일단 analogRead()함수로 센서의 값을 읽는 것은 알겠는데

왜 이렇게 계산식이 만들어 졌을까요?

우선 위에 있는 회로인 전압 분배기, 또는 전압 분배 회로를 먼저 알아야 합니다.

Vin으로 전원이 들어가면 저항을 거쳐서 R1의 인가된 전압은 버려지고 R2에 인가되는 전압이 Vout으로 나가게 됩니다. 모양새가 아까 보았던 내부 회로와 비슷하죠?

이 회로에서 Vout을 구하는 식은 다음과 같습니다.

Vout = Vin / (7500.0/(30000.0+7500.0));
Vout = Vin / (R2/(R1+R2));

위의 코드에도 동일한 식이 들어간 것으로 보아 전압 분배기의 방식을 이용한 전압 센서임이 틀림 없습니다.

사실 대부분의 전압 센서들이 전압 분배기의 방식을 채택하여 사용하고 있죠.

그럼 이제 Vin이 어떻게 구해지는지 알아야 합니다. 저 식에 대입하기 위해서 말이죠.

 

예를 들어 Vin에 5V가 인가되었다고 생각해봅시다. 아까 센서의 회로도를 보았을 때 내부 회로의 저항 비는 30:7.5 였고 여기에 좌측에 5를 넣어주면 우측엔 1이 나옵니다.

위의 있는 회로의 전압 분배 법칙에 의하면 VIN에서 출발한 전원은 5분의 1 전압만이 VOUT으로 나오게 되는 겁니다. 5V를 인가할 시 1V가 나오게 되는 것이죠.

그럼 다시 원래의 전압 값을 복구하려면 5를 곱해주면 됩니다. 다시 1V에 5를 곱하면 5V가 나오는 것처럼 말이죠.

이렇게 Vout을 역이용하여 Vin을 측정 할 수 있는 것입니다.

여기서 끝이 아닙니다. 이렇게 값을 받고 5를 곱해주었더라도 아두이노 특성상 본 그대로의 값을 받기는 힘듭니다.

그 이유는 아두이노의 분해능이 10비트(=1024)이기 때문입니다.

그 말은 즉슨, 아두이노는 모든 데이터를 10비트 단위로 끊어 읽기 때문이라는 것입니다.

(만약 입력의 최대치인 5V를 읽으면 10비트의 최대치인 1024로 읽습니다.)

그렇기에 5를 곱해준 값을 1024로 다시 나누어 주어야 합니다.

그래야 ADC 값(10비트)가 아닌 저 식에 대입할 수 있는 Voltage 값이 나오겠죠.

 

Voltage 값을 구하면 이것이 입력받은 값 Vin 값이 되는 것이며, 위 식에 대입하면 Vout이 나오게 됩니다.

그렇게 해서 나오는 값은 아래와 같습니다.

double Vin = (ADC * 5.0) / 1024.0;
double result = Vin / (7500.0/(30000.0+7500.0));

 

그리고 함수였기 때문에 최종 값을 리턴해주었죠.

 

return result;

이렇게 보니 센서를 이해하기 수월 하셨나요?

다음 장에는 더 많은 경우의 수를 두고 직접 전압 측정 센서를 제작해보고 실사용 해보면서 모듈과는 어떤 차이점이 있을지 실험 해보겠습니다.

감사합니다.

반응형