ACS712 전류센서는  Hall Effect(전류가 흐르는 도체에 자기장이 가해지면 전위차가 발생하는 현상)를 활용하여 전류의 세기를 측정하는 센서로서 교류/직류에 관계없이 측정가능하며 순방향 또는 역방향 양쪽으로 측정 가능하다. 그리고 모듈은 측정 범위에 따라  5A용, 20A,30A용 세가지 종류가 있다.

 

 

 

 

ACS712 전류센서 구조 및 사양  

 

 

ACS712 전류센서는 측정된 전류값을 전압값으로 출력하는데 전류가 흐르지 않는 제로상태에는 VCC기준전압의 중간값이 OUT단자에 출력되지만 전류량이 증가하면 다음과 같은 민감도에 따라 OUT단자의 전압이 변한다.

 

 

즉 30A용 모듈이고 VCC 기준 전압이 5V일 경우 전류가 흐르지 않는 제로상태에는 2.5V이지만 순방향 전류량이 증가하여 30A가 되면 OUT단자의 전압이 4.48V( 2.5V + ( 66 mV/A * 30A) ) 까지 올라가고 역방향 전류량이 증가하여 -30A이면 0.52V까지 감소한다. 즉 30A용 모듈일 경우 다음과 같은 모양의 그래프가 된다.     

 

 

그리고 출력 전압값은 온도에 따라 약간의 변화가 있다. 여기에서 주의 해야 할 점은 OUT출력 전압은 VCC 기준전압에 따라 변하는 것이므로 측정 전류값이 일정하다 해도 만약 VCC기준전압이 5V로 일정하지 않고 불안정하게 4.8V ~ 5.2V로 움직이게 되면  OUT출력값도 불안정하게 계속 변화된다는 것이다.    

 

아두이노와의 연결

 

위와 같이 전류 측정단자에 측정하고자 하는 지점의 케이블을 연결하고

VCC-GND에 5V를 공급하면서 OUT단자의 출력 전압을 아두이노 아날로그 입력핀(여기에서는 A0)으로 읽으면 된다.

 

 

샘플프로그램

 

  1. const int analogIn = A0; //아날로그 입력 PIN  
  2. int mVperAmp = 66; // 아날로그 입력 mV당 전류 값  
  3.                    // 5A 짜리는 185  
  4.                    // 20A 짜리는 100  
  5.                    // 30A 짜리는 66  
  6. int RawValue= 0;   // 아날로그 값 저장 변수  
  7. int ACSoffset = 2500; // 기준 값 0A일때 아날로그 값은 2500mV 이다.  
  8. double Voltage = 0;   // 계산된 아날로그 값  
  9. double Amps = 0;      // 실제 측정된 전류 값  
  10.   
  11. void setup(){   
  12.  Serial.begin(9600);  
  13. }  
  14.   
  15. void loop(){  
  16.   
  17.  RawValue = analogRead(analogIn);  
  18.  Voltage = (RawValue / 1024.0) * 5000;   
  19.  Amps = ((Voltage - ACSoffset) / mVperAmp);  
  20.    
  21.  Serial.print(Voltage/1000);   
  22.  Serial.print("\t");    
  23.  Serial.println(Amps);   
  24.  delay(100);   
  25.  }  

 

위 샘플프로그램으로 측정된 전류 값을 아두이노 IDE 시리얼플로터로 표시해 보면 다음과 같다. 즉 측정된 값을 그대로 사용하기에는 너무 변동이 심한 값이 나온다.

 

 

 

 

수정된 샘플프로그램

 

  1. const int analogIn = A0; //아날로그 입력 PIN  
  2. int mVperAmp = 66; // 아날로그 입력 mV당 전류 값  
  3.                    // 5A 짜리는 185  
  4.                    // 20A 짜리는 100  
  5.                    // 30A 짜리는 66  
  6. int RawValue= 0;   // 아날로그 값 저장 변수  
  7. int ACSoffset = 2500; // 기준 값 0A일때 아날로그 값은 2500mV 이다.  
  8. double Voltage = 0;   // 계산된 아날로그 값  
  9. double Amps = 0;      // 실제 측정된 전류 값  
  10. int cnt = 0;  
  11. double smoothAmps = 0;  
  12.   
  13. void setup(){   
  14.  Serial.begin(9600);  
  15. }  
  16.   
  17. void loop(){  
  18.   
  19.  RawValue = analogRead(analogIn);  
  20.  Voltage = (RawValue / 1024.0) * 5000;    
  21.  Amps = ((Voltage - ACSoffset) / mVperAmp);  
  22.  smoothAmps = Amps * 0.01 + smoothAmps * 0.99;   
  23.  if ( cnt++ > 100 ) {  
  24.     Serial.print(Voltage/1000);   
  25.     Serial.print("\t");    
  26.     Serial.println(smoothAmps);   
  27.     cnt = 0;  
  28.  }  
  29.  delay(1);  
  30.  }  

 

100 mSec마다 한번 측정하는 대신 1mSec마다측정하여 이에 대한 이동평균값을 구하고 이를 100 mSec마다 표시하는 방법으로 측정값을 구하면 다음과 같이 좀더 안정적인 값을 구할 수 있다.

 

 

+ Recent posts