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








 게시판 검색





 
 
회원등록 비번분실


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

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2016/02/02
첨부#1 Elektor-ads1115-src.zip (7KB) (Down:107)
ㆍ추천: 0  ㆍ조회: 397   
  Arduino 정밀 전력계의 ADC
참조 : Elektor ADS1115 eBoB  
제목 : Practical 4-channel ADC [140169]

정밀 전력계 ADC 모듈과 연결하는 Elektor의 아듀이노 LCD 실드140009
 
Arduino의 rxd (D0)과 txd (D1)은 계속 Serial Port로 사용한다.
LCD 표시 선택용 누름 단추는 S1 = D8, S2 =D9로 연결한다.
 
내부 기준전압이 있는 저소비전력의 16비트 A/D 변환기 ADS1115를 사용한다.
이 칩의 주변기기를 확장하는 BoB(조각 기판) 모듈을 설계하기로 결정했다.
일반적인 전방증폭기(front end)는 느리다(1KHz 미만) 그러나 정밀한 데이터 수집 장치이다.
 
16비트 ADC변환 모듈의 BoB 규격은 4 채널로 시작했다.
아날로그 입력채널들은 과전류와 과전압으로 부터 저항하여 보호된다.

실제의 BoB 모듈은 핀 헤더로 MPU 장치에서 쉽게 추가할 수 있도록 설계되었다.
 

Elektor BoB 14069-1 모듈의 기판 설계
   
 
 
ADS1115를 사용한 140169-1 BOB 모듈의 16 비트 4 채널 ADC 회로도

 
R5의 저항 4개 중 1개를 선택하여 ADC의 I2c 주소를 설정한다.
I2C 주소를 0x48로 설정하려면, ADDR 핀의 R5를 GND와 연결한다.

Ain0 과 Ain1은 측정 전류 입력이다.
Ain2와 Ain3은 측정 전압 입력이다.
ADC의 입력 Ain0과 Ain1은 전류의 전류검출 회로의 출력으로 연결한다.
ADC의 입력 Ain2와 Ain3은 전압의 전압검출 회로의 출력으로 연결한다.
ADC의 출력 /RDY = D8, /SYNC =D9, SCL =A4, SDA =A5로 연결한다.

전류 측정은 교류 전용일 때, 저렴한 CT를 사용할 수 있다. 
교류신호 이므로 코일로 된 PT나 CT를 사용하면, 간단히 저항 감쇄기로 연결할 수 있다.
좌측은 저가형 (USD 1.00~2.00)이며, 우측은 코어가 열리는 STC-013-xx (USB 8.00)이다.

   

1000 : 1 출력인 이 CT는 전선을 CT의 중심에 넣고 교류 5A를 흘려주면, 출력에 5mA가 발생된다.
CT의 원리상 2차 전류를 흘려주어야 하므로, 추천 값인 10~100 옴의 부하저항을 병렬로 연결한다.

100 옴 저항의 출력전압은 100 옴 x 5 mA = 0.5 Vac = 0.707 Vpk 이므로 1.0 Vmax 측정기로 연결이 된다.
만일 PT나 CT 없이 교류를 측정하려면, 뒷부분에 나오는 절연 IC를 사용해야 한다.

LCD 표시 (Display Factors)
유효전압 Vrms[V]
 
 
유효 전류 Irms[A]
 
 
유효 전력 Real[W]
 
 
피상 전력 Apparent[VA]
 
 
교류역율 Power-factor
 

Elktor의 140169-1 BoB는 높은 정도와 넓은 측정 범위의 교류/직류 겸용 전력계이다.
계측장비는 아듀이노 Uno와 Shield를 사용하여 설명하였다.
Class-II 절연을 제공한다. 그리고 LCD로 몇개의 측정값을 직접 표시한다.
 
사용된 LCD 모듈에 연결된 아듀이노의 디지털 출력 핀은 다음과 같다.
LCD의 B0, B1, B2, B3은 4비트 전송 방식이므로 연결하지 않는다. 

아듀이노 포트 => LCD 모듈
GND => R/W (쓰기 전용으로 R/W는 GND로 바로 연결한다.)
D2 => RS (RS는 제어 명령일 때 high)
D3 => E (Enabe은 B4~B7의 4비트를 LCD로 보낸다)
D4 => B4
D5 => B5
D6 => B6
D7 => B7

전력계의 ADC
이것은 역시 DVM 이나 오실로스코프 처럼 연결된 전기신호의 출력을 측정한다.
14049-1 기판은 860 sps의 속도로 전류와 전압을 sample 한다.

이 프로젝트는 고전압 교류(최대 500 Vrms) 혹은 직류(최대 300V)를 안전하게 측정한다
고마운 고품질의 절연 증폭기로 아날로그 혹은 디지털은 Class-II로 절연(4 KV 이상)된다. 

퍌요 부품
4 채널 ADC ADS1115 BoB 모듈 = 14069-1 , 
4 채널 1KHz LPF BoB 모듈 = 140169-2, 
아듀이노 실드 140009 (LCD와 누름 스위치 및 IO 커넥터를 장착)

아듀이노 Uno. (위의 실드와 맞는 제품)

ADS1115 BoB(조각 기판)은 16 비트 4 채널 I2C AD 변환기를 탑재하였다. 
이것은 비교적 느린(1KHz 이하) 일반적인 front end에서 완벽하다.
그러나 정밀한 자료 수집장치이다. 우리는 작은 칩의 까다로운 납땜이 된 BoB가 있다. 
확대경과 납땜기 없이 빵판에서 쓸 수 있다.
 
ADS1115는 보조로 4개의 종속된 주소가 있는 I2C 칩이다.
그러므로 기판위의 설정저항 R5~R8은 0옴으로 실장된다.
이 저항들은 적어도 1개는 주소지정을 위해 장착되어야 한다, 초기값은 R5 이다.
종속된 주소를 선택하는 자료는 ADS1115 부품규격에서 찾을 수 있다.
기판은 2V 부터 5.5V 까지의 전원 전압을 허용한다. 

16 비트 data logger 코드 프로젝트에서 당신의 편의를 위해 우리가 복사한,
어떤 기본적인 코드는 아듀이노의 linking library 설명에서 찾을 수 있다.
140409 Power Meter V1.1 : 전력계 140409-1의 상위 버전 1.1에서 추가된 정보을 보라.

하나의 프로젝트(ADS1115-BoB 140169-91)는 실용적인 4 채널 ADC다.  
그러나 어떤 응용들은 느린 샘플 속도의 A/D 변환도 적절하다. 
이 경우에 최대 샘플 속도는 860 Hz 이다. 첫번째 제안은 전력계다.

절연 회로
직류는 DVM과 증폭된 전압과 전류를 2 개의 값으로 측정할 수 있다.
당신도 아듀이노가 있다면 21 USD로 소비전력을 측정할 수 있다.
절연된 직류 전압과 전류는 안전하게 측정할 수 있다.
절연이 안된 교류나 직류는 간단한 절연 증폭기를 만드는 방법이 있다.
 
이들 중 하나가 TI사의 절연 증폭기 AMC1100 이다.
최소 대역폭은 60 KHz 이고 전기충격(galvanic) 절연(isolation)은 4250 Vpk이다.
이 증폭기를 사용하여 class-II 급의 절연과 매우 안전하게 회로를 만들려고 한다.
 
이것은 8 핀 SMD 외형(package)이다. 물론 절연 증폭기는 두개의 전원이 필요하다,
하나는 입력 측이고 다른 하나는 출력 측이다. 절연전압 발생기와 비안정 표준 전원을 사용한다. 
출력측에는 일반적인 class-II의 규격이 아닌 저렴한 전압 안정기가 필요하다  

전류 입력은 0.01 옴 이므로 25 Apk 입력은 0.25 Vpk,  front end 증폭도는 1 이므로 0.25Vpk
절연 증폭기 이득은 8배 이므로 2 Vpk로 ADC로 입력된다.
이때 JP1을 사용하면 x10 배로 2.5 Apk, 실효값으로는 1.768 Arms다.
 
입력측의 절연을 해결하는 방법은 절연 증폭기 IC 회로를 쓴 설계를 이용하는 것이다.
입력전류는 4 단자 전류검출 (shunt) 저항 2W 2R01 (0.01옴 = 10m옴)을 사용한다.
여기서는 Ohmite 사의 FC4L64R010FER을 사용하고 있다.(2 단자는 전류용, 2 단자는 검출용)
간단하게 전류를 측정하는 방법은 저항을 직렬로 연결하고 저항의 전압을 측정한다.

가능한 작은 shunt로 회로의 영향을 시험해야 한다.
전류 입력 범위로 최대 측정 범위가 결정된다. 전력 손실이 적은 것은 다른 이유이다.
만일 매우 작은 저항을 사용하면, shunt를 통과하는 전압은 반드시 증폭해야 한다.

전류 검출  front end (AD8639)와 절연 증폭기(AMC1100 '00 @100 pcs Digkey).


절연 증폭기 IC2는 switched capacitor 회로의 차동 입력이 있다.
출력 잡음은 더 이상의 자료 없이 3.1 mV(rms)로 규정되었다.

만일 최대 대역폭으로 이 규격이라면 사전에 ADC에서 제한되는 잡음은 더 낮아야 한다.  
어쨋든 4 채널 필터는 Elektor-labs에 있는 140169-2 필터의 1Khz의 대역폭으로 설계되었다.
절연 증폭기의 입력 신호는 최대 250 mV로 제한되어야 한다.

AMC1100 증폭도는 8배, 그래서 ADC 입력의 최대 값은 0.25V x 8배 = 2 V 이다.
필터의 S/N은 645, 필터는 √60으로 필터 배율이 높다, 그래서 factor는  5000으로 제한했다.  
작은 신호를 측정하려면 front end 절연 증폭기의 감도 설정 JP1을 x100으로 올린다.

IC1은 자동 영점이 있는 reail to rail 증폭기인 AD8639 이다.
입력 offset는 통상 3 μV 이고 최대 9 μV다.
최대 offset 변동(drift)은 0.06 μV로 DC 측정에서는 놀라운 선택이다.
대역폭은 1.35 MHz로 이 증폭기의 대역폭은 최대 이득으로 선택되었을 때, 10 kHz 보다 넓다.
우리의 응용에는 충분하다.

IC1은 차동입력 증폭도 1 + 2 x (R6+R7) /RG의 증폭도로 설정되었다.
JP1을 쓰지 않으면 증폭도는 1 이다. (R1을 통과하는 전압으로 IC1A와 IC1B의 사이의 출력)
만일 R4를 선택하면 증폭도는 10, R5를 선택하면 증폭도는 100 이다.
 
만일 IC의 출력 전압이 최대 2 V라면, (JP1은 빼면 x1, 좌측 x10, 우측 x100 )
최대 입력 전류의 범위를 설정하는 JP1의 정현파는 17.1A, 1.77A, 0.177A로 된다.
정현파에서 신호의 최대 입력  rms 값은 peak 값보다다 낮아 진다.  
측정될 수 있는 잡음수준 때문에 종속되는 최소 전류는 종속되고 ADC는 0.1 W 이하로 측정된다.
이 경우 ADC 신호는 -50 dB로 내려간 지점에 머무른다. (증폭이 안된다)

먼저 전달한 것 처럼, 역시 회로는 DVM과 같이 높은 전압을 안전하게 측정할 수 있다.
AMC1100의 차동 출력은 단일 입력의 출력 보다 충분하지 않다.
차동 증폭기 IC4 (다른 AD8639)는 차동신호를 단일 입력으로 변환한다.

common mode는 두 입력이 같이 묶인 연결. 두입력이 묶이지 않은 연결은 differential mode.
거의 0V로 내려가는 AMC1100의 출력에서 common mode offset는 5V 전원일 때 2.55V 이다.
출력 offset는 두 입력의 전압 차가 없을 때의 출력 전압이며 0mV가 이상적이다.
그러므로 2.55V의 출력은 common mode offset이 아니라 설계목표로 만들어진 가상접지의 출력이다.  


몇 mV 정도인 IC4의 offset 출력은 AMC1100의 두 입력의 전위 차에 따라 개별적인 작은 offset로 될 것이다.
입력 offset는 통상(typcal) 0.2mV 그리고 최대 1.5mV 이다. 출력 offset는 언제나 12mV 보다 작아야 한다.
 
drift는 온도에 따라 변동된 출력 offset로 gain drift와 input offset drift로 부터 발생한다.
AMC100의 drift는 최대 10 μV/ °C이므로 AMC1100의 입력 offset는 최대 10 μV/ °C 이다.
그러므로 AMC1100의 출력 offset은 온도변화에도 안정하다.
전류를 검출하는 AD8639의 common mode 입력전압 범위는 전원 5V에서 .1V ~ 3V 이다. 

AMC1100의 전압을 분할하는 R21/R22 (R25/R26)는 2.55 Vpk 보다 낮아야 하므로 1.275 Vrms다.
우리의 AMC1100의 출력 신호는 최대 약 2.5 Vpk로 측정되었다.

IC4의 최대 입력 전압은 1.9V 이상으로 할수 없다. (1.275 VDC + 교류입력의 최대전압/2).
이 것은 AD8639의 common mode 범위 이내이므로 저당하다.
대부분의 IC는 단일 전원 5V를 공급한다.
IC4는 offset 출력 전압이 없이 교류 신호를 처리하기 위해 -전원이 필요하다

IC6의 출력은 -신호를 처리할 수 있어야 한다.
IC6는 저손실 전압 안정기(low drop regulator)다.
IC6의 GND로 연결된 제너 다이오드로 가상 접지(vertual GND)를 만들었다.  

전압안정기(5V LDO)와 가상접지(1.8V ZD)를 통합한 전원회로

 
우리는 1.8V의 제너 다이오드 D7을 사용했다.(전류는 50 uA 이다)
과전압에도 D7은 충분하며, 거의 80mA 까지 흘릴 수 있다.
제너 다이오드 D7과 입력 역극성 보호 다이오드는 D8이 추가되어,
입력 전원전압은 최소 10 V, 완벽하게는 12 V가 필요하다.

Class-II 절연전압 발생기 (ADum6000 단가 6,600원 @1000 pcs Digikey)
 

절연 측의 전원 공급은 IC 방식 절연전원 ADuM6000으로 만들었다
ADuM6000은 5V 혹은 3.3V 출력의 절연 DC-DC 변환전원이다. (VIORM은 846 Vpk)
이것은 집적된 안정기로 5V 입력으로 3.3V 혹은 5V를 전송한다.
그러나 3.3V 입력으로 3.3V는 안된다. (우리는 5V를 사용한다)
더 상세한 정보는 부품자료 혹은 응용자료를 참조하라.

IC1의 common mode 범위는 shunt로 부터 나오는 신호를 방해한다.
shunt 저항 R1은 +2V가 공급된다. (시작품은 1.9V로 측정되었다)
LED D5를 가상접지 전압을 만드는 기준 다이오드로 사용했다.
그러나 +2V로 표기했다. D5는 LED 이므로 절연측의 전원공급을 표시한다.
+2V는 전압 측정을 위한 분압 저항 R1..R16으로 연결되었다.
 
shunt 저항과 분압 저항은 같은 커넥터 K1~K4로 연결된다. 
우리는 기판 위의 K1~K4 단자는 기계와 전기 접촉성능이 좋은 나사 고정식을 사용했다.
장점은 굵은 전선을 연결하기 용이하고 나사를 잠그는 드라이버가 필요없다.

전압 검출용 절연 증폭기(AMC1100)
 

최대 전압이 흐르는 R14, R15, R16은 최대 전압 규격의 과전류 보호기(fuse)를 통해 연결된다.
과전류 보호기 (fuse)는 500 Vac와 300 Vdc의 정격을 사용했다.
최대 500 Vac의 경우 전압은 R16에 흐르는 전압은 약 58 mV이다.
소프트웨어 계산 함수는 전압과 전류로 2개가 필요하다.
 
ADS1115-BOB 모듈의 제어는 아듀이노 Uno 위에 얹는 실드 140009-91의 K2로 연결된다.
 

7핀 2개로 분리된 문자 LCD는 잘 사용되지 않는 방식이다. (수정이 필요하다.)
P1은 LCD의 명암(contrast)를 조절하는 가변저항이다. 고정값 저항으로 연결해도 된다.

이 실드는 14 판 EEC 커넥터 K2가 있고 BoB 모듈의 커넥터 K5로 연결된다.
실드와의 연결에서 ADS1115 GPIO 핀의 I2c의 연결만 필요하다.
 
Arduino 구형은 SCL과 SDA를 A4와 A5로 연결하고, (위 기판은 수정이 필요)
Arduino 신형은 SCL과 SDA를 별도로 있는 SCL과 SDA로 연결 한다. (그대로 사용)

K2 (14 PIN) 적색이 사용된 핀이다.
(SW-1) A0 =1,  2 = A1 (SW-22)
           A2 =3,  4 = A3
(SCL)  A4 =5,  6 = A5  (SDA)
           D4 =7,  8 = D5
           D6 =9, 10 = D7
(/RDY) D8 =11, 12 = D9 (/SYNC)
         RST =13, 14 = GND 

Arduino 전력계 V1.1
Luc Lemmens가 전력계의 소스코드를 개발하는 동안, 
A/D 변환기의 연속 작동에서 최대 샘플속도 860Hz 문제에 부딪혔다.

ADS1115는 하나의 A/D 변환기만 있다. 역시 전압과 전류의 동시 측정에서 최대 샘플 속도는 불가능하다.
이 경우 내부의 채널 선택기는 처리중에 최소한 2번의 샘플을 위해 2개의 채널을 전환해야 한다.
우리는 연결된 장치의 소비전력이 일정한 상수임을 당연하게 여긴다.

소프트웨어에서 입력신호의 교류-직류를 자동으로 구분하는 영점 통과(zero crossing) 검출기

VS+는 ADS1115의 Ain2 입력, VS-는 ADS1115의 Ai3 입력과 병렬로 연결한다.
ZC 출력은 /SYNC이며, 피측정 전압의 Zero-Cross 출력이다. D9로 연결한다.

전압과 전류의 연속된 측정이 아닌, 두번에 전압-전류의 측정을 완료할 수 있다.
아날로그 회로의 집합점(common reference)을 기준으로 두개의 입력을 측정해야 한다.
이것은 입력 전압의 영점 통과(zero crossing)를 검출을 할 수 있다.  
이 zero cross 신호로 부터 바쁘게 처리하지 않고, 측정을 깨끗히 처리할 수 있다.

실행코드는 SYNC 입력 핀의 high 100ms, low 100ms 대기하면서,
high -> low로의 변화가 읽혀지면 zero-crosing이 된 것으로 판단하고 AC를 표시한다. 
만일 이 회로를 쓰고 싶지 않다면 하드웨어를 생략하고, 소스 코드를 개조해야 한다.

영점통과 검출회로는 LM311 아날로그 비교기를 사용한다.
이 출력은 접지가 분리된 open collector 이다.
교류 신호 검출에서 많은 부품없이, 대칭전원을 사용하면서 단일 로직 레벨을 발생할 수 있다.
물론 pull-up 저항 R27이 필요하고, pulse 안정도를 위해 정궤환 R35/R36를 추가했다.
 
이 비교기의 출력은 /SYNC 핀으로 연결된다. (Elektor 전력계 모듈의 커넥터 K5의 12 번핀)
가장 정확한 영점통과 검출은 덤출 출력이 +에서 -로 갈 때이다.
IC7의 출력이 low로 머무르면 hysteresis는 없다. 비반전 입력 핀은 GND 레벨로 지속된다.
비교기의 출력이 high 일때만, 직류 레벨 5 mV가 비반전 입력 핀으로 주어진다.

유효전력과 피상전력의 계산에서, 반드시 영점통과 검출로 샘플링을 시작할 필요는 없다.
주 전원의 주기안에서 같은 지점에서 두개의 측정을 시작하면 관계가 없다.
절연 증폭기의 잡음을 제거하는 RC-필터 (R34/C33)는 비교기의 반전입력핀에 직렬로 들어간다.  

실제의 영점통과의 편차로 부터 위상 지연이 확대된다.
60 Hz의 매우 낮은 차단 주파수는 가능한 많은 잡음에서 필터를 선택한다.
IC7의 출력은 이제 낮은 입력 전압이므로 안정하다.
전압 분할기 R14~R16은 전압을 5868로 분할되고 이 전압은 절연 증폭기에서 8 배로 증폭된다.
mV로 작동하는 비교기의 입력은 기대하지 않는다.
2 Vrms 이하의 레벨은 비교기릐 출력을 반전하는데 충분하지 않다.

아날로그 출력의 잡음
차동 증폭기는 캐패시터 C29, C32로 전원결합을 방지한다. 대역폭은 6 KHz 이다.
C29와 C30의 공통모드 억제는 최대한 이상적으로 유지되어야 한다.
불행히도 표준 0805 표준으로는 5% 오차 이하로 정밀하게 만들기 어렵다.  

스위칭 잔여물의 출력 필터는 common mode 막대(choke) 코일 L1을 추가했다   
필터는 전류 3 A의 규격으로  작은 내부저항 (2x 50 mΩ) 값을 선택했다.
commom mode filer는 한선에 한개를 연결하는 필터, 묶여진 GND는 필터를 넣을 수 없다.
diferent mode filter는 두선에 두개를 연결하는 필터 (2개의 필터는 상호 인덕턴스 M으로 결합)

D7의 다른 용도인 제너 다이오드 특성으로는 -로 표시된 전원을 발생하는데 사용된다.
전압 안정기 BZT52C2V0-7-F는 약 70 mA의 소비 전류에서 2.8 V의 전압강하를 갖는다.
이제 K7 전원의 전압 범위는 9~12 V이다.
우리의 시작품 14040901의 전압 강하는 D8 양단에서 0.23 V이다. 

2.048V 이상이 될 수 있는 절연 증폭기 (IC2/IC3)의 출력은 계속 최대값을 갖는다.
AD1115의 입력 전압 범위를 +/-4.096 V로 맞추었다. 아래 쪽은 최대 입력범위를 조금 초과한다
그래서 감도를 잃었다. 우리의 첫번째 시작품에서 출력은 2.5V 이상의 최대값을 갖는다.
그러나 이 새로운 1.1 버전의 시작품은 2.3V를 조금 넘는 최대값을 보인다.
명백하게 AMD1100의 포화점은 완전한 오차범위를 가지고 있다. 

주전원 혹은 고압장치를 전력측정할 때, ADS1115를 사용하는 것이 가장 좋은 선택은 아니다.
문제는 860 Hz의 느린 샘플 속도이다.
 
하나의 50 Hz에서 다음 샘플은 17.2 °도를 뜻한다. 60 Hz의 이것은 25° 보다 크다.
이후로 ADS1115의 내부 클럭은 조절이 불가능하며, 17.2°의 창으로 샘플이 획득되었다.
전압과 전류를 위한 새로운 샘플링이 시작되더라도 비동기 상태로 머무른다,
영점통과 검출 후라도 실제의 샘플링의 시작은 매번 같지 않았다.
우리는 이 문제의 해결법을 찾았다.

전력 역율은 부하가 순수한 저항 성분이라면 값은 1.00을 표시할 것이다. (가끔 아닐 수도 있다.)
샘플 속도는 860 Hz로 불규칙(random)하게 보이지 않는다. 이는 50Hz와 60 Hz의 공통 분모이다.
50 Hz의 2.5 주기 안에서 43 샘플로 확정되고, 43 샘플은 60Hz의 3.0 주기와 정확히 일치한다.
 
소프트웨어는 172 번의 샘플로 유효전력, 피상전력과 전력역율의 평균을 계산한다.
만일 비교기 신호가 없다면 소프트웨어는 직류 전압에 맞도록 계산하고 표시한다,

실험을 위해, TI사는 12 비트 분해능 ADC도 있다. ADS1015의 샘플 속도는 3300 Hz다.
고속 샘플 속도(읽은 다음 많은 측정값을 계산할 때)는 Arduino Uno에서는 역시 까다롭다.  
(많은 계산은 나중에 한다면, ADC는 고속으로 측정값 읽고 저장하는 용도로는 12 비트가 더 좋다)

부품 목록 (Bill of materials) 
R1 = 0Ω01, 2 W, 1 % (Ohmite FC4L64R010FER)
R2,R3 = 22 Ω, 0W25, 5 %, SMD 0805
R4,R31,R33 = 2k20, 0W125, 1 %, SMD 0805
R5 = 200 Ω, 0W125, 1 %, SMD 0805
R6,R8,R34,R37 = 5k6, 0W125, 1 %, SMD 0805
R7,R9 = 4k3, 0W125, 1 %, SMD 0805
R10,R11,R17,R18 = 12 Ω, 0W125, 1 %, SMD 0805
R12,R13,R19,R20,R29,R30 = 47 Ω, 125 mW, 1 %, SMD 0805
R14,R15 = 220 kΩ, 1W5, 1 %, 500 V, SMD 2512
R16 = 75 Ω, 0W125, 1 %,SMD 0805
R21-R28,R36 = 100 kΩ, 0W125, SMD 0805
R32 = 39 kΩ, 0W125, 5 %, SMD 0805
R35 = 100 Ω, 1 %, 0W125, SMD 0805

C1,C2 = 1 nF, 50 V, 5 %, SMD 0805, C0G/NP0
C3,C7,C11,C14,C23,C24,C34,C35 = 100 nF, 50 V, 10 %, SMD 0805, X7R
C4,C15,C17,C19,C21 = 10 μF, 10 V, 10 %, SMD 0805
C5 = 100 μF, 6V3, 20 %, SMD Case A (1206), tantalum
C6,C10 = 330 pF, 50 V, 5 %, SMD 0805, C0G/NP0
C8,C9,C12,C13 = 100 nF, 50 V, 10 %, SMD 1206, X7R
C16,C18,C20,C22,C28 = 100 nF, 25 V, 10 %, SMD 0603, X7R
C25,C26 = 4μ7, 6V3, 10 %, SMD Case R (0805), tantalum
C27 = 10 μF, 25 V, +80/-20%, SMD 1206, Y5V
C29-C32 = 470 pF. 50 V, 5 %, SMD 0805, C0G/NP0
C33 = 470 nF, 16 V, 10 %, SMD 0805, X7R

L1 = ACM4520-231-2P-T, SMD Common Mode Choke 3 A, 2x50mΩ, 230Ω@100MHz

D1,D2,D4 = HSMS-2822-TR1G, SMD SOT-23
D3 = SP0502BAHTG, SMD SOT-23
D5,D6 = Led green, SMD 0805
D7 = BZT52C2V0-7-F, SMD SOD-123 (Zener 2V/0W5)
D8 = PMEG2010AEH, 20 V/1 A, SMD SOD-123F
IC1,IC4 = AD8639ARZ, SMD SOIC-8
IC2,IC3 = AMC1100DUB, SMD Gullwing-8 (SOP-8)
IC5 = ADuM6000ARWZ, SMD RW-16 (SOIC_W-16)
IC6 = NCP5501DT50G, SMD DPAK3
IC7 = LM311D, SMD SOIC-8

K1-K4 = 6.35 mm Terminal, Faston, Screw, hole 3.3 mm
K5 = 14way header (2x7), straight
K6,JP1 = 3way pinheader SIL, pitch 2.54 mm
K7 = 2way pinheader SIL, pitch 2.54 mm
MOD1 = 2 x receptacle through hole (5way), pitch 2.54 mm
F1 = Fuse Clip, PCB, 32 A, 600 V (6.3 x 32 mm)
F1 = 10 A fuse, 500 VAC/300 VDC, antisurge, 6.3 x 32 mm

Main PCB = 140409-1 v1.1
ADC PCB = ADS1115 BoB
Filter PCB = 140169-2 BoB
 

시험 소스
이 시험 코드의 실행은 Arduino Sketch와 다음 4개의 Library들이 필요하다.
4 개의 library 파일들은 모두 소스폴더 안에 함께 있어야 한다. (참조 : 첨부파일 #1)

 
// Elektor사의 개발과제 130485
// 목적 : ADS1115의 드라이버 soft_i2c.h, ads1x1x.h를 시험한다.
// 저자 : CPV 29/04/2014

// soft_12c.h를 포함하는 것은 soft_12c.cxx를 소스에 추가한다. soft_i2c는 비트돌림 방식의 함수이다.
#include "soft_i2c.h"

// 소스에 포함할 외부 소스를 지정한다. ""xxxx.h"로 지정하면 같은 폴더에 있는 xxx.cxx를 읽는다. 
#include "ads1x1x.h"

// ADC1115 주소를 my_adc로 설정한다. ADS1115 설정에서 최초로 호출해야 한다.
ADS1x1x_config_t my_adc;  // 특별히 my_adc를 설정하지 않으면 초기값인 0x48 이다.
int sda_pin = A4;  // I2C의 SDA로 사용할 핀을 지정해야 한다
int scl_pin = A5;  // I2C의 SCL로 사용할 핀을 지정해야 한다.

// I2C 버스에서 사용하는 전송지연 시간은 5us 이다.
void soft_i2c_delay(void){
  delayMicroseconds(5);
}

// soft_i2c는 소프트웨어 bit shift 조작으로 I2C의 바이트 값을 처리한다.
// 다음 9개의 I2C 함수 호츨은 각 함수에 설정된 이름을 사용해야 soft_i2c.h가 작동된다. 
// I2C 버스에 연결된 SDA 핀의 입출력 방향을 설정한다.
void soft_i2c_sda_mode(uint8_t value){  

  if (value==0) pinMode(sda_pin,INPUT); // INPUT이 0 이면 SDA 핀을 입력으로 바꾸고 pull-up한다.
  else pinMode(sda_pin,OUTPUT); 
// INPUT이 1 이면 SDA 핀을 출력으로 바꾼다.
}
// I2C 버스의 SDA 핀의 비트 레벨을 쓴다
void soft_i2c_sda_write(uint8_t value){
  digitalWrite(sda_pin,value);  // value에 들은 값을 SDA 핀의 비트 레벨로 출력한다 
}
//  I2C 버스의 SDA 핀의 비트 레벨을 읽는다
uint8_t soft_i2c_sda_read(void){  // 외부에서 변수uint8 soft_i2c_sda_read()로 호출한다, 
  return digitalRead(sda_pin);  // 읽은 값은 변수unit8에 저장하고 주함수로 돌아간다.
}
//  I2C 버스의 SCL 핀의 비트 레벨을 쓴다. (SCL은 I2C의 clock 핀으로 읽을 필요가 없다)
void soft_i2c_scl_write(uint8_t value){
  digitalWrite(scl_pin,value);  // value 값을 SCL 핀의 비트 레벨로 출력한다
}
// I2C 버스에 연결된 ADS1115로 쓰기시작 주소를 설정한다
uint8_t ADS1x1x_i2c_start_write(uint8_t i2c_address){
  return soft_i2c_start_write(i2c_address);  // i2c_address 값을 I2C 쓰기시작  주소로 설정한다.
}
// I2C 버스로 직전에 설정된 start 주소로 1 바이트를 쓴다.
uint8_t ADS1x1x_i2c_write(uint8_t x){
  return soft_i2c_write(x);  // I2C 버스로 x에 들어있는 1 바이트 값을 쓴다.
}
// I2C 버스로 연결된 ADS1115의 지정된 주소의 2 바이트를 읽는다
uint8_t ADS1x1x_i2c_start_read(uint8_t i2c_address, uint16_t bytes_to_read){
  return soft_i2c_start_read(i2c_address, bytes_to_read);  // 읽은 값은 bytes_to_read로 저장하고 나간다
}
// I2C 버스에 연결된 ADS1115의 변환 값을 읽는다.
uint8_t ADS1x1x_i2c_read(void){
  return soft_i2c_read(); 
// I2C 버스에서 읽은 값 1 바이트를 직접 가지고 주함수로 나간다 
}
// I2C 버스의 주소 my_adc로 연결된 ADS1115의 작동을 정지
uint8_t ADS1x1x_i2c_stop(void){
  soft_i2c_stop(); 
  return 0;  // I2C 장치를 정지 시키고, 0을 가지고 주함수로 나간다
}


// 초기화 함수 (리셋 이후에 1회만 실행된다)  
void setup(void){
  Serial.begin(115200);  // 직렬포트 전송속도를 115200 bps로 설정
  Serial.println("130485 ADS1115 ADC board");  // 직렬포트로 장치이름을 송신, 바꾸어도 된다. 
  Serial.println("(c) Elektor, 29/04/2014");  // 직렬포트로 설계날짜를 송신, 바꾸어도 된다.
  Serial.println("");
 
  // ADS1115의 제어버스를  I2C로 연결하는 SDA와 SCL 핀을 출력으로 설정.
  pinMode(sda_pin,OUTPUT);  // SDA (A5)를 출력으로 설정
  pinMode(scl_pin,OUTPUT);   // SCL (A4)를 출력으로 설정

  // ADC 초기화. I2C 주소 0x48, 16비트 ADC, 단일 입력, PGA는 4.096V로 설정 
  if (ADS1x1x_init(&my_adc,ADS1115,ADS1x1x_I2C_ADDRESS_ADDR_TO_GND,MUX_SINGLE_0,PGA_4096)==0){
    Serial.println("Could not initialise ADC structure.");  // 초기화를 실패하면 직렬포트로오류를 전송한다.
  }
}

// 주함수에서는 모든 가능한 입력을 처리한다 (ADC를 설정하고 전압으로 변환하여 직렬포트로 전송한다.
void loop(void){
  for (unsigned int input=0; input<0x8000; input+=0x1000){  // 입력 채널을 설정하는 변수를 0으로 리셋한다.

    // 변환을 시작하기 전에 채널변수에 들은 값으로 ADC 채널을 설정한다.
    ADS1x1x_set_multiplexer(&my_adc,(ADS1x1x_mux_t)input);  // 아날로그 채널 0~7 까지 순서대로 선택
    ADS1x1x_start_conversion(&my_adc);  // 선택된 채널의 입력신호를 AD 변환한다.
   
    // 샘플링 속도는 1초당 128번 이다. 샘플링 주기는 7.8 ms이다.
    delay(8);  // 7.8ms 지연
   
    // AD 변환결과를 읽어서 전압으로 변환한다. 16 비트 adc 값 x FS 전압 /15 비트 = 측정된 전압[V] 이다.
    Serial.println((float)ADS1x1x_read(&my_adc)*4.096/32767.0); 
    //Serial.println(ADS1x1x_read(&my_adc)); // 앞쪽의 remarks를 풀면 ADC 결과값을 표시한다.
  }

  Serial.println("---");  // ADC 채널 1 부터 7 까지 8 채널을 표시하고 나면 ---을 표시하고 채널 0 부터 재시작 
  delay(500);  // 한바퀴 돌고 0.5초를 대기하고 처음으로 돌아 간다. (채널이 0으로 리셋된다)
}

실행 소스
ads1115_power_meter.ino와 필요한 library는 다음과 같이 소스 파일의 폴더에 있어야 한다.
 
 
내부 변수 (Internal Variables) :
실행소스의 내부변수는 전력측정에 필요한 값을 모두 저장하고 있다
float inst_power; // 측정 전력
float sum_inst_power; // 전력의 합계
float real_power; // 유효 전력
float inst_voltage; // 측정 전압
float square_voltage; // 전압^2
float sum_square_voltage; // 전압^2 합계
float mean_square_voltage; // 평균 전압
float root_mean_square_voltage; // rms 전압
float inst_current; // 측정 전류
float square_current; // 전류^2
float sum_square_current; // 전류^2 합계
float mean_square_current; // 평균 전류
float root_mean_square_current; // rms 전류
float apparent_power; // 피상 전력 
float power_factor; // 전력 역율
unsigned int current_factor; // 전류 역율
unsigned int voltage_factor; // 전압 역율


전압과 전류의 교정
S1을 누르고 전원을 켜면 calibration 모드로 된다.
LCD에 0V input 이라고 표시되고,
S1을 누르라는 표시가 되면, S1을 누른다.
Ain2와 Ain3에 연결된 입력전압을 voltage_offse에 저장한다.
LCD에는 V offset 값이 표시된다.

LCD에  input Voltage라고 표시되고 S1을 누르라고 표시된다.
입력전압을 연결하고 S1을 누른다.  입력된 전압이 표시된다.
 
S1과 S2를 동시에 누르면 전류 Calibaration 모드로 된다.
LCD에 0A input 이라고 표시되고,
S1을 누르라는 표시가 되면, S1을 누른다.

LCD에 A offset와 input I가 표시된다.
S1을 누르면 전류 factor 값이 +10 씩 증가하고,
S2를 누르면 factor 값이 -10 씩 감소된다.
교정된 값들은 EEPROM으로 저장된다.
 
실행 소스
Elektor 14069-1의 Arduino 스켓치 ads1115_power_meter.ino는 판매용으로 비공개입니다.
전력계의 실행소스의 문의, 제품개발 및 기술지도는 관리자의 전화나 이메일로 연락하십시요.
 

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
 AVRTOOLS™
   
윗글 Arduino 전극식 수분센서의 분석과 제작
아래글 Arduino 정밀 전력계의 LPF
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 151 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 215 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 239 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 292 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 277 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 343 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 311 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 280 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 474 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 378 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 234 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 304 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 397 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 343 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 221 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 361 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 309 0
9 Arduino DUE based DDS Synthesizer avrtools™ 2016/01/24 (일) 187 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 324 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1617 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2462 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 2013 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 418 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 339 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3590 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2568 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