로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 공개소스
작성자 avrtools™        
작성일 2008/09/30
첨부#1 arduino-thd-v1.2.pde (9KB) (Down:1127)
첨부#2 dft_5th_thd.hex (24KB) (Down:1022)
Link#1 picthd.htm (Down:308)
ㆍ추천: 0  ㆍ조회: 6494   
  아듀이노 AC전원 THD 측정
참조 : http://www.kmitl.ac.th/~kswichit%20/PICTHD/picthd.htm
제목 : PIC Harmonic Distortion Meter
저자 : Wichit Sirichote, kswichit@kmitl.ac.th

THD는 Total Harmonic Distortion의 약자이며, 측정신호에 포함된 고조파의 비율(%)이다.
THD는 전원전압의 THD 보다 소비전류의 THD가 크므로, 대부분 전류THD를 측정합니다.
 
참조 자료는, 18F2550 기판으로 만드는 교류전압의 품질을 측정하는 계측기이다. 
18F2550과 16x2 LCD를 사용한 DFT 방식의 THD Meter의 사진이다.
 
 
 
소프트 웨어에서 DFT 방식으로 THD를 구하려면, 저장된 교류전압에서 기본주파수와 제3고조파를 계산합니다.
DFT는 ADC로 변환된  주파수표본에 포함된, 여러개의 정현파(단일주파수) 성분을 추출하는 방법입니다.
THD는 기본주파수(fundamental frequency)에 대한 제3고조파(3rd harmonics frequency)의 비율입니다.

정현파(sine wave)는 THD가 약 3% 이하이며,      구형파(square wave)는 약 33%입니다. 
 

THD란 무엇인가? 
정현파 공급전압을 사용하는 전기장치에서, 소비하는 전류도 정현파라면 0%의 THD값이 측정됩니다.
전류파형은 필라멘트 전구같은 저항부하가 아닌 경우에, 전류파형은 정현파가 아닐 수 있습니다.
 
SMPS 입력전류 파형과 THD
 
 
UPS 입력전류 파형과 THD
 
 
INVERTER 입력전류 파형과 THD
 
 
수동필터방식 THD 측정회로 예
이전에 사용하던 아날로그 방식의 THD 측정회로들은, 아날로그 필터로 기본파의 전압을 제거하고 남은,
전체 고조파의 전압을 수동으로 계산한 결과를, 메터의 눈금에 인쇄하여 측정하는 방법을 사용합니다. 
 
저주파 왜율계도 역시 THD 측정기이다.  측정원리는 신호에 섞여 있는 기본주파수를 Null Filter로 제거하면,
나머지는 모두 고조파 성분이므로, 먼저 전체의 신호를 측정하고, SW를 THD로 전환하여 고조파를 측정한다음
고조파신호 전압 / (전체신호 전압-고조파신호 전압) 으로 계산하여 THD를 구하는 방식이다.
 
 
 
능동필터 방식 THD 측정회로 예
Null Filter를 이용한 능동필터 방식으로 기본파를 제거하고 남은 고조파를 측정하는 회로
이 회로의 단점은 필터의 주파수를 정확하게 맞추기 어렵다는 문제가 있으나, 이를 극복하기 위해서,
정확한 시험주파수를 넣고, 가변저항을 돌려서, 가장 낮은 출력이 되도록 설정한 다음, THD 측정을 한다.

 
교류 220V 전압의 THD를 측정할 필요는 없으며, 오히려 전류의 THD를 측정해야 합니다.
그러므로, 전원과 교류부하의 사이에 전류검출용 저항을 직렬로 연결하면, (예 SMPS의 입력전류),
SMPS에서 소비되는 입력전류로 직렬로 연결한 저항에 발생하는 교류전압을 측정합니다,

M168-USB로 제작한 THD 측정기 
시중에서 판매하는 THD 측정기는 가격도 만만치 않치만, 최소 측정값이 10A 급으로,
1W ~ 10W 급의 LED 전구의 부하전류에 포함된 THD를 측정하기 매우 불편합니다.

그래서, 아듀이노 호환기판 M168-USB로, DFT 방식의 디지털 THD 측정기를  제작햇습니다.
아듀이노 기판의 가격은 매우 저렴하고, 소프트웨어는 수정과 굽기에 편리한 점이 많이 있습니다.
 
M18-USB 기판 소개 : http://www.avrtools.co.kr/technote7/board.php?board=tnshoppublic&command=body&no=44


 
기본파 1st 220V, 제3고조파 3rd 0.1%로 THD가 0.0 %인 아주 깨끗한 정현파로 시험한 결과입니다..
LCD에 표시된 4번째 데이터 ofs 80.0은, 음성카드 정현파 출력에 포함된 직류성분이 50 %이므로,
이 직류성분을 소프트웨어로 제거하기 위해 ADC 포트 6번에 연결한, offest용 가변저항 값입니다.


전압을 측정할때는 위쪽의 Voltage 출력을 아듀이노 기판의 A7 입력에 연결합니다.
전류를 측정할때는 아래쪽의 Current 출력을 아듀이노 기판의 A7 입력에 연결합니다.
THD는 대부분 전압측정이 필요없으므로, 아래쪽의 Current 출력 회로만 제작하면 됩니다. 

 
회로에 연결하는 전압은 220V 이며, 전류는 100mA 입니다. (220V 0.1A @최대) 
만일, 측정전류를 0.2A @최대로 올리려면, R2, R3 모두 2개를 모두 4개로 변경합니다.
측정전류를 10 배로 올리려면, R2, R3을 100옴 x 2개를 10 옴 x 2개로 변경합니다.
전류검출 저항 R2, R3은 가급적, 저가의 무유도 저항인 1~5W MPR 저항을 사용하십시요.  

아듀이노 THD 측정기 소스
교류파형을 측정하는 회로는, 브릿지 정류기로 전파정류한 최대 5V의 교류전압을,
아듀이노 기판의 MPU에 내장된 10 비트 ADC 입력포트에 연결하고, 
입력된 교류파형의 전압은, 아듀이노 기판의 ADC로 최대한 빠르게 읽어서 저장합니다.

ADC 가로채기 함수
int acc;
// 10 비트 ADC 가로채기 함수, 지정된 CH에서 ADC 결과를 읽는다
#pragma vector=ADC_vect
ISR(ADC_vect)
{
  acc =ADCL;   // save adc value
  acc |=(int)ADCH << 8;
}
 
ADC초기화 함수
// 단일(Single ended) 입력으로, ADC0의 결과는 오른쪽으로 정렬 (Right adjusted)
void init_adc()
{
  ADCSRA =(1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADATE)|(0<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);
  ADMUX = 0x07;        // AREF =AVCC, ADC CH =7               
  ADCSRA |= ADSC;   // ADC 가로채기를 허용
}
 
ADC 측정값 저장 함수
int adc[32];
void save_adc()
{
  int i;
  for(i =0; (acc <offset && i <64); i++)  // skip - signal
  for(i=0; (acc >offset && i <32); i++)   // get + signal only
  {
    adc[i] =acc -offset;
    delayMicroseconds(260);         // 120Hz/32 =8333us/32 =260.4us
  }
}

LCD표시 함수
아듀이노 4비트 LCD라이브러리를 그대로 사용한다.
연결방법은 아듀이노 4비트 LCD 응용소스를 참조하십시요.
  1 GND  --- GND
  2 +5V  --- VCC
  3 Vadj ---명암조정저항---GND


  4 RS ---- D12
  5 RW  --- GND
  6 ENB --- D2

 11 D4 --- D7
 12 D5 --- D8
 13 D6 --- D9
 14 D7 --- D10


 15 BL- --- GND
 16 BL+ --- VCC

 
#include <LCD4Bit.h>         // 라이브러리를 부른다.
LCD4Bit lcd =LCD4Bit(2);    // 2줄 LCD를 사용한다. (4줄 LCD도 임시로 작동 가능)

 
부동소수점을 ascii 코드로 변환
<Stdio.h> 라이브러리의  sprintf (buff, "THD %.1f " var); 를 사용하려 햇으나,
아듀이노 0012 버전의 미해결 문제로, 직접 풀어서 만든 사용자 함수.
%.1f 는 부동소숫점을 ascii로 바꾸는 형식이 xxx.x 라는 parameter.
 
void lcd_4asc(float var)
{
  int val, rem, zero =0;
  val =(int)(10 *var);
  if (val >9999) val =9999;  // max =999.9
  rem =val; 
 
  if (rem >999)
  {
    val =(val /1000);       // get 1000's
    rem =(rem %1000);       // save 100's
    lcd.print('0' +val);    // 1000's를 ascii로 LCD에 표시
  }
  else
  {
    lcd.print(' ');        // if zero
    zero =1;
  }
 
  if (rem >99)
  {
    val =(rem /100);        // get 100's
    rem =(rem %100);        // save 10's
    lcd.print('0' +val);    // 100's를 ascii로 LCD에 표시
  }
  else if (zero ==1) lcd.print(' ');    // if 2nd zero
  else lcd.print('0');    // if 1st zero
 
  if (rem >9)
  {
    val =(rem /10);         // get 10's
    rem =(rem %10);         // save 1's
    lcd.print('0' +val);    // 10's를 ascii로 LCD에 표시
  }
  else lcd.print('0');    // if zero
  lcd.print('.');           // .을 PC로 송신
  lcd.print(rem +'0');      // 1's를 ascii로 LCD에 표시
}

2줄 LCD 표시 함수
void lcd_thd()
{
  lcd.cursorTo(1, 0);      // 2번째 줄, 첫자리에 표시를 시작한다.
  lcd.printIn("1st ");     // 기본파의 전압을 표시
  lcd_4asc(sin_1st);       // xxx.를 LCD에 표시 (  sprintf(buf, "%.1f", sin_1st);
 
  lcd.printIn("  3rd ");   // 3고조파의 전압을 표시
  lcd_4asc(sin_3rd);       // xxx.x를 LCD에 표시
 
  lcd.cursorTo(2, 0);      // 2번째 줄, 첫자리에 표시를 시작한다.
  lcd.printIn("THD ");     // THD %를 표시
  lcd_4asc(THD);           // xxx.x를 LCD에 표시
  lcd.print('%');          // %를 LCD에 표시
 
  lcd.printIn(" ofs ");    // offset 전압을 표시
  lcd_4asc((float)offset); // xxx.x를 LCD에 표시
}
 
LCD 초기화 함수
void setup()
{
  lcd.init();                   // LCD 초기화
  delay(100);                   // delay 100ms
 
  lcd.cursorTo(1, 0);           // 1번째 줄, 첫자리에 표시를 시작한다.
  lcd.printIn("THD Meter V1.0      "); // LCD에 문자를 표시한다
  lcd.cursorTo(2, 0);          // 2번째 줄, 첫자리에 표시를 시작한다.
  lcd.printIn("      avrtools.co.kr"); // LCD에 문자를 표시한다
 
  digitalWrite(led, on);        // led =on
  delay(2000);                   // 2초를 기다린다.
  digitalWrite(led, off);       // led =off
  lcd.clear();                        // LCD를 지운다
 
  Serial.begin(115200);         // 통신포트 속도 = 115200 bps
  Serial.println("THD Meter V1.0");  // 장치이름을 표시한다
  init_adc();          // ADC를 가로채기 방식으로 초기화 
}

주함수
아날로그 전용포트 A6과 A7을 아날로그 고속입력으로 사용한다.
A6은 offset 설정용 가변저항, A7은 THD를 측정하는 신호를 연결한다.
측정결과는 직렬포트를 통해, PC의 USB로 전송하고, 2줄 LCD에도 표시한다.
 
void loop()
{
  ADMUX =6;            // offset for input waveform     
  delay(10);           // delay 10ms
  offset =acc;         // adc ch 6 =offset voltage
 
  ADMUX =7;            // adc ch7 = input voltage
  delay(10);           // delay 10ms

  save_adc();          // read_adc & save_adc    
  calc_thd();                // calculate THD for display
 
  digitalWrite(led, on);     // led =on
  tx_thd();                  // 1st, 3rd 전압과 THD %를 표시
  digitalWrite(led, off);    // led =off
 
  lcd_thd();                 // thd display to LCD 
}
// end of 3rd harmonis distortion meter v1.2

시험용 입력 파형 
PC용 음성카드를 이용하여, 정현파, 삼각파, 구형파를 발생하는 소프트웨어입니다.
이 장치로 시험한 결과, 정현파는 0.2% 이하, 삼각파는 16.8%, 구형파는 33%로 측정됩니다.

  
 
주의 : 30일 평가판을 구해서 사용해 보니, 측정값이 이상하게 원리하고 틀리게 나와서 고민하다가,
스코프로 파형을 보고 알았습니다. 이 소프트웨어는 출력파형에 직류성분이 50% 포함되어 있습니다.
바로가기 : http://www.ymec.com/products/dssf3e/index.htm  <--- 이 소프트웨어는 엉터리입니다.
 
해결방법으로, 가변저항을 ADC 6번에 연결한 offset값을, 교류파형의 검출레벨로 사용하고,
120Hz/32의 시간간격으로 측정하는, 32개의 교류전압 측정값을 offset 값으로 감산합니다.

LCD의 2번째 끝에 나오는 ofs 80.0 이라는 값이, ADC 6번에 연결된 offset 가변저항의 위치값입니다.
정상적인 교류파형을 전파정류하여 측정할 경우에는, ADC 6번의 offset 설정값을 0으로 맞추면 됩니다.
 
offset 설정은 MEGA168 내장 ADC의 검출시작 전압을 조정하는 역할로 사용하면,
신호에 포함된 잡음으로 부터, DFT의 ADC 표본검출시 오동작이 안되도록 해 주는 역할이 있습니다.
결국 고가로 판매하는 일본의 엉터리 소프트웨어 덕분에, 좋은 기능이 하나 더 추가되엇습니다.

결국 인터넷을 뒤져서, 성능좋고 무료로 배포하는 좋은 PC용 사운드카드용 소프트웨어를 찾았습니다.
참조 : http://www.zeitnitz.de/Christian/Scope/Scope_en.html <---이 소프트웨어 무료이며, 성능 좋습니다.
 
  

DFT방식 THD 측정원리
DFT는 Discrete Fourier Transform의 약자이며, 구형파는 모든 정현파의 합성파라는 원리로 부터,
ADC로 측정한 교류파형이 저장된 값에 포함된, 각각의 정현파형을 분리하여 THD를 측정하는 원리이다.
이산값(Discrete Value)은 짧은 간격으로 표본의 변동값을 ADC로 측정하여 저장한 값을 말한다.
 
THD의 가장 큰 문제는 제3 고조파이며, 기본파 다음으로 진폭이 큰 파형이 제3 고조파이다.
물론, 수동형 부하의 경우에 적용되며, 능동형 부하인 인버터+모터 등의 부하는 제5 고조파가 크다.
THD = ((V3+V5+V7+V9,,,) / V1) * 100 [%] 이며, 3rd HD는 (V3 / V1) * 100 [%] 이다.
                                      ∝
주기적인 파형은 F(t) = A0 + ∑   (Bγ sin νωt + C γ cos νωt) 으로 표현되며, 
                                      γ=1
A0는 직류성분이다. 직류성분이 없는 교류파형은 A0가 0 이다, 그러므로 A0는 생략이 가능하다.
하나의 고조파 진폭(교류전압이 주기적으로 상하로 움직인 높이)은 다음 공식으로 부터 계산이 가능하다.
 
하나의 고조파 진폭 Av를 구하는 계산방법은, 해당된 고조파 진폭의 실효값(Vrms)을 계산한다.
즉 Av는 Bv와 Cv의 길이로된 직사각형에서, 원점에서 Bv와 Cv가 만나는 꼭지점까지의 거리이다.
또한 주기적인 파형에서, Bv와 Cv는 다음과 같이 계산이 가능하다. (1/2 주기만 측정한 경우)

 
 
측정간격 t를 2배하는 이유는 0~180도의 값에 180~360도의 값을 더하는 것이며, 반주기의 파형이 같은 경우이다.
그러므로 입력전압의 파형을 1/2 주기만 측정해서, x2 하면 같은 결과를 구할 수 있다.
60Hz의 반주기인 120Hz를 32번 검출하여 저장하고, DFT 공식으로 60 Hz와 180Hz의 성분을 계산한다.

 
 
t는 60 Hz를 64번 검출하므로 60 Hz /64 =0.000260 이다, T는 기본파의 주기 60Hz로 16.666 ms 이다,
Bv와 Cv를 계산하는 앞부분은 결국 상수이므로, 220V (rms) 입력에서, ADC의 측정값이 1000 이면,
float scale =(sqrt(2) *2 *220) /1000; // 2.828427 *220 /1000 = 0.622253 으로 정의 할 수 있다.

0 ~ 180도 즉 1/2 주기의 sin파(1st)와 제3 고조파(3rd) 파형   
  
0 ~ 180도 즉 1/2 주기의 cos파(1st)와 제3 고조파(3rd) 파형   
  

DFT 연산의 준비
일정한 주기로 반복되는, 교류전류의 입력파형을 ADC로 측정하여 저장한 32개의 변수 adc[i]
기본파의 0~180도 sin과 cos값을 32 단계의 각도로, 미리 저장해 놓은 삼각함수표 sine[i]와 cosine[i]
3고조파의 0~180도 sine과 cos값을 32 단계의 각도로, 미리 저장해 놓은 삼각함수표 sinex3[i]와 cosinex3[i]

각주파수의 각도에 해당하는 전압을 추출하고 정적분값을 저장한다 
저장된 adc[i]와 같은 위치의 sine[i]를 각각 곱해서, 축차가산한 sin_1st 값,
저장된 adc[i]와 같은 위치의 cosine[i]를 각각 곱해서, 축차가산한 cos_1st 값,
저장된 adc[i]와 같은 위치의 sinex3[i]를 각각 곱해서, 축차가산한 sin_3rd 값,
저장된 adc[i]와 같은 위치의 cosinex3[i]를 각각 곱해서, 축차가산한 cos_3rd 값을 준비한다고.
 
주파수의 위상성분을 제거하고 남는 절대값은 진폭이다.
기본파 진폭(rms)은 sqrt((sin_1st *sin_1st) +(cos_1st *cos_1st))로 계산하여 sin_1st에 결과를 저장.
3고조파 진폭(rms)은 sqrt((sin_3rd *sin_3rd) +(cos_3rd *cos_3rd))로 계산하여 sin_3rd에 결과를 저장한다.

진폭 x 기준시간  = 실효값(rms)이다 
직류 1인 진폭을 1초동안 검출하고 위의 연산을 하면, 결과는 1V x 1초 = 1 [Volt/sec = V rms] 이다.
교류 정현파의 진폭 x 시간 = 면적(rms) 즉 실효전압은, 파형율에 따라서 다르지만, 1보다 적을 수 밖에 없다. 
 
THD를 계산한다
추출된 기본파와 3고조파의 실효전압(rms)으로 부터, 3rd HD = (sin_3rd / sin_1st) *100 [%]로 계산할 수 있다.
Total HD를 추출하려면, ((입력전압- 기본파전압)/기본파전압) *100 [%]으로 계산할 수 도있다.

32점 기본파 sine 함수표
const float sine[] = { 
0.000000000, 0.098016374, 0.195088811, 0.290282466, 0.382680585, 0.471393340, 0.555566390, 0.634389115,
0.707102423, 0.773006055, 0.831465332, 0.881917269, 0.923875995, 0.956937428, 0.980783176, 0.995183594,
1.000000000, 0.995186010, 0.980787986, 0.956944585, 0.923885429, 0.881928891, 0.831479029, 0.773021695,
0.707119856, 0.634408173, 0.555586888, 0.471415082, 0.382703362, 0.290306057, 0.195112991, 0.098040908,
};
 
32점 기본파 cos 함수표
const float cosine[]= {
-1.000000000,  0.995184802,  0.980785581,  0.9569410070,  0.923880712,  0.881923080,  0.83147218, 0.773013875,
 0.707111139,  0.634398644,  0.555576639,  0.4714042110,  0.382691974,  0.290294261,  0.195100901, 0.098028641,
 0.000012327, -0.098004106, -0.195076721, -0.290270669, -0.382669197, -0.471382468, -0.555556140, -0.634379586,
-0.707093707, -0.772998234, -0.831458483, -0.881911458, -0.923871277, -0.95693385, -0.980780771, -0.995182385,
};
 
32점 제3고조파 sine 함수표
const float sinex3[]= { 
 0.000000000,  0.290282466,  0.555566390,  0.773006055,   0.923875995,   0.995183594,  0.980787986,  0.881928891,
 0.707119856,  0.471415082,  0.195112991, -0.097991839, -0.382657808, -0.634370058, -0.831451635, -0.956930271,
-0.999999999, -0.956951741, -0.831492725, -0.634427230, -0.382726139, -0.098065443, 0.195040451,  0.471349854,
 0.707067556,   0.881894025,  0.980773555,   0.995190841,  0.923904296,   0.773052973, 0.555627884, 0.290353241,
};
 
32점 제3고조파 cos 함수표
const float cosinex3[]= {
-1.000000000,  0.956941007,   0.831472180,  0.634398644,  0.382691974,   0.098028641, -0.195076721, -0.471382468,
-0.707093707, -0.881911458, -0.980780771, -0.995187218, -0.923890146, -0.773029514, -0.555597137, -0.290317853,
-0.0000369804, 0.290247077,  0.555535641,   0.772982594,   0.923861842,  0.995179968,  0.980795199,   0.881946322,
 0.707146004,   0.471447695,  0.195149260,  -0.097955036, -0.382623642, -0.634341470, -0.831431088, -0.956919535,
};
 
8333us 동안 검출한 32개의 ADC 값에서, 기본파와 제3 고조파의 진폭을 추출한다.
float sin_1st;          // 기본파 sine
float sin_3rd;          // 3고조파 sine
float cos_1st;          // 기본파 cos
float cos_3rd;          // 3고조파 cos
float THD;              // THD (0~100 %)    
 
// 2.828427 *220 /1000 = 0.62225396 for adc *sin[x] *scale =1023 @max
float scale =(sqrt(2) *2 *220) /1000;    // input range for 220V rms, 결과 1.0 V를 622 Vpk로 변환 

Scale Factor 소스를 보고, 이미  눈치를 챗으리라 알고 있지만, 만일 전류값으로 결과를 바꾸려면,
220을 100 이나 1000으로 변경하면, 100 mA나 1000 mA 계량값으로 변환할 수 있음을 알 수 있다.

THD 추출 함수
void calc_thd()
{
  char i;
  //var_view(adc, 32); // adc[0] ~ adc[31]을 PC로 송신.(시험용)
  sin_1st =0;          // 기본파 sine 
  sin_3rd =0;          // 3고조파 sine
  cos_1st =0;          // 기본파 cos 
  cos_3rd =0;          // 3고조파 cos
  
  // 0~180도를 32 구간으로 나누어, 기본파와 3고조파를 계산                   
  for(i =0; i <32; i++)       
  {
    sin_1st +=sine[i] *adc[i] *scale;       // adc * 기본파 sin *scale
    cos_1st +=cosine[i] *adc[i] *scale;     // adc * 기본파 cos *scale
    sin_3rd +=sinex3[i] *adc[i] *scale;     // adc *3고조파 sin *scale
    cos_3rd +=cosinex3[i] *adc[i] *scale;   // adc *3고조파 cos *scale
  }
 
  sin_1st =sqrt((sin_1st *sin_1st) +(cos_1st *cos_1st)); // 기본파 sin^2 + cos^2의 평방근 =rms
  sin_1st =(4 *0.000260 /0.016666) *sin_1st;  // 기본파의 rms 전압 =V1 x ((4xTs) / (1/60))
 
  sin_3rd =sqrt((sin_3rd *sin_3rd) +(cos_3rd *cos_3rd)); // 3고조파의 sin^2 + cos^2의 평방근 =rms
  sin_3rd =(4 *0.000260 /0.016666) *sin_3rd;   // 3고조파의 rms 전압 =V3 x ((4xTs) / (1/60))
  THD =sin_3rd *100 /sin_1st;               // 3고조파/기본파를 %로 계산
}
 
추출된 1st Volt, 2nd Volt, THD를 통신포트로 PC에 전송한다.
void tx_thd()
{
  int buf;
 
  // 기본파의 전압을 표시
  Serial.print("1st ");
  Serial.print(sin_1st, DEC); // 1st xxx.를 PC로 송신
  Serial.print(".");          // .을 PC로 송신
  buf =(10 *sin_1st) -10 *(int)sin_1st;  // 소숫점
  Serial.print(buf, DEC);     // .x를 PC로 송신
 
  // 3고조파의 전압을 표시
  Serial.print("V 3rd ");
  Serial.print(sin_3rd, DEC); // 3rd xxx.를 PC로 송신
  Serial.print(".");          // .을 PC로 송신
  buf =(10 *sin_3rd) -10 *(int)sin_3rd;  // 소숫점
  Serial.print(buf, DEC);     // .x를 PC로 송신
 
  // THD %를 표시
  Serial.print("V THD ");
  Serial.print(THD, DEC);     // THD xxx.를 PC로 송신
  Serial.print(".");          // .을 PC로 송신
  buf =(10 *THD) -10 *(int)THD;  // 소숫점
  Serial.print(buf, DEC);     // .x를 PC로 송신
  Serial.println("%");        // %를 PC로 송신
}

아듀이노에서 수신되는 THD 값
 
 
직렬포트를 사용하는 디버그용 함수
PC의 USB로 연결된 가상직렬 포트로 전송하는 변수에 저장된 측정 값.
void var_view(int *var, int num)
{
  int i;
  for (i =0; i <num; i++)          // 송신할 변수의 갯수는 num이다.
  {
    Serial.print(var[i], DEC);     // 변수를 PC로 송신
    Serial.print(' ');             // spacce를 PC로 송신
  }
  Serial.println(' ');             // CR을 PC로 송신
}

 
소스 : 아듀이노 응용소스는 첨부파일 arduino-thd-v1.2.pde를 받으십시요.

문제점

1st 기본파와 3rd 고조파만 검출하므로, 인버터 부하같은 5th 고조파가 더 큰 경우에 오차가 커진다.
해결방법으로, 표본검출 시간을 현재보다 1/2~1/3로 짧게해서, 5~7차 고조파 까지 검출하면 더욱 좋다

최종적으로 M168-USB 기판과 20x2 LCD에 3rd와 5th 고조파를 모두 표시하도록 수정하엿다.
좌측부터 3rd 고조파 전압, 5th 고조파 전압, 2번째 줄은 THD %, 마지막으로 입력전압을 표시한다.
시작품은 20x4 LCD를 사용하였으나, 20x2 LCD모듈을 소스 수정없이 그대로 사용할 수 있다.

  
이 장치의 소스는 디버깅 중입니다, 펌웨어 dft-5th-thd.hex는 첨부파일 #2를 받으십시요.
이 자료의 무단복제 및 사이트의 바로가기 없는 무단 게시를 일절 금합니다.
 
이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA

AVRTOOLS™
   
이름아이콘 경우
2009-10-21 14:02
ADC에서 궁금한 것이 있습니다
AC전압을 받는데 이글은 보면 제로크로스를 하지 않는 것 같은데
AC전압을 32등분 한다고 해도 ADC할때 어디서 ADC를 할지 모르는데
정확한 데이터가 나올수있나요?
   
이름아이콘 avrtools™
2009-10-21 18:10
소스를 잘 보세요, 검출부분에 기능이 들어 잇습니다.
THD 원리상, ADC 변환속도는 빠를 수록 검출이 더 잘 됩니다.
   
 
윗글 아듀이노 ODB-II 스캐너 제작
아래글 아듀이노 소프트방식 16Bit ADC
    N         제목    글쓴이 작성일 조회 추천
61 비접점식 QTouch 방식 근접검출 스위치 leeky 2016/01/21 (목) 521 0
60 Arduino 고속 오실로스코프 #3 avrtools™ 2012/03/29 (목) 17557 0
59 아날로그 8ch 데이터 로거 avrtools™ 2012/03/29 (목) 2683 0
58 Arduino DMX512 송신기 제작 avrtools™ 2012/03/15 (목) 2787 0
57 nRF24L01 무선모듈의 사용방법 avrtools™ 2012/03/07 (수) 5541 0
56 초음파 거리 측정기의 제작 avrtools™ 2011/09/18 (일) 4635 0
55 3축 가속도 센서 ADXL335 avrtools™ 2011/09/09 (금) 3186 0
54 Arduino Uno USBserial 펌웨어의 변경 avrtools™ 2011/08/27 (토) 2849 0
53 Arduino MIDI의 소개 avrtools™ 2011/08/19 (금) 3215 0
52 Arduino 고속 Oscillo Scope #2 avrtools™ 2011/08/12 (금) 2827 0
51 Arduino Uno 및 USB2serial Uno의 소개 [2] avrtools™ 2011/07/30 (토) 3083 0
50 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 7679 0
49 아듀이노 초음파 거리측정 및 응용 avrtools™ 2010/03/14 (일) 3992 0
48 M328-USB의 비밀 온도센서 avrtools™ 2010/01/02 (토) 3424 0
47 M168-mini로 만드는 USBasp avrtools™ 2009/10/10 (토) 5044 0
46 OBDuino ISO9141 소스의 설명 avrtools™ 2009/10/08 (목) 3964 0
45 아듀이노 0017 업그레이드 avrtools™ 2009/08/18 (화) 3491 0
44 Arduino 0015 업그레이드 avrtools™ 2009/06/01 (월) 3189 0
43 CC2500 Zigbee RF Modem #1 [4] avrtools™ 2008/11/20 (목) 6361 0
42 아듀이노 소프트웨어 Ver 0012 avrtools™ 2008/09/23 (화) 3857 0
41 Arduino 소프트웨어 설치방법 avrtools™ 2008/08/31 (일) 5379 0
40 아듀이노 PC 카메라 제작 avrtools™ 2008/10/28 (화) 6968 0
39 아듀이노 AVR-ISP V2의 제작 [6] avrtools™ 2008/10/22 (수) 7956 0
38 아듀이노 J1850-PWM 스캐너 avrtools™ 2008/10/15 (수) 4380 0
37 아듀이노 MPGduino의 제작 avrtools™ 2008/10/11 (토) 4667 0
36 아듀이노 OBD-II PID 처리함수 avrtools™ 2008/10/12 (일) 5287 0
35 아듀이노 OBD-II PID 송수신 함수 avrtools™ 2008/10/09 (목) 9363 0
34 아듀이노 ODB-II 스캐너 제작 [9] avrtools™ 2008/10/04 (토) 16635 0
33 아듀이노 AC전원 THD 측정 [2] avrtools™ 2008/09/30 (화) 6494 0
32 아듀이노 소프트방식 16Bit ADC avrtools™ 2008/09/23 (화) 5361 0
31 아듀이노 초음파 모듈의 제작. avrtools™ 2008/09/22 (월) 4629 0
30 아듀이노 Wii 프로세싱 avrtools™ 2008/09/20 (토) 3965 0
29 아듀이노 초음파 거리측정 avrtools™ 2008/09/20 (토) 5860 0
28 아듀이노 8x5 초소형 전광판 avrtools™ 2008/09/11 (목) 4468 0
27 아듀이노 4선식 터치패널 avrtools™ 2008/09/10 (수) 4497 0
26 아듀이노 2색 8x8 LED avrtools™ 2008/09/10 (수) 4689 0
25 아듀이노 24x6 LED 전광판 avrtools™ 2008/09/10 (수) 5217 0
24 아듀이노 8x8 LED 프로세싱 avrtools™ 2008/09/10 (수) 3966 0
23 아듀이노 32x16 RGB 전광판 avrtools™ 2008/09/06 (토) 13476 0
22 아듀이노 맥박검출기 avrtools™ 2008/09/03 (수) 9200 0
21 아듀이노 적외선 거리센서 avrtools™ 2008/09/01 (월) 5680 0
20 아듀이노 DMX 수신장치 [7] avrtools™ 2008/08/31 (일) 6527 0
19 아듀이노 AVR-ISP 만들기 avrtools™ 2008/08/30 (토) 3998 0
18 아듀이노 POV #3 avrtools™ 2008/08/30 (토) 3310 0
17 아듀이노 POV #2 avrtools™ 2008/08/30 (토) 3122 0
16 AVR 병렬포트 굽기장치 avrtools™ 2008/08/30 (토) 4999 0
15 아듀이노 DMX 송신기 avrtools™ 2008/08/28 (목) 4949 0
14 아듀이노 부트로더의 개조 [1] avrtools™ 2008/08/28 (목) 5623 0
13 아듀이노 병렬포트 굽기장치 avrtools™ 2008/08/26 (화) 4053 0
12 아듀이노 POV #1 avrtools™ 2008/08/26 (화) 3355 0
11 아듀이노 MIDI 드럼 leeky 2008/08/24 (일) 4563 0
10 아듀이노 SD/MMC 카드 avrtools™ 2008/08/24 (일) 9601 0
9 아듀이노 MIDI 플륫 avrtools™ 2008/08/24 (일) 3418 0
8 아듀이노 RGB LED avrtools™ 2008/08/23 (토) 4858 0
7 아듀이노 USB 오실로스코프 [2] leeky 2008/08/21 (목) 6232 0
6 가속도계 ADXL202 응용소스 avrtools™ 2008/08/20 (수) 4724 0
5 아듀이노 가속도센서 avrtools™ 2008/08/18 (월) 4674 0
4 아듀이노 RC서보 제어 avrtools™ 2008/08/17 (일) 5024 0
3 아듀이노 910-ISP 만들기 avrtools™ 2008/08/16 (토) 4538 0
2 아듀이노 온도센서, XBee 송수신 avrtools™ 2008/08/15 (금) 7262 0
1 아듀이노 기본명령 avrtools™ 2008/08/07 (목) 6360 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0