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








 게시판 검색





 
 
회원등록 비번분실


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

      거래은행 바로가기
 
 Sensor Applications
아듀이노 공개소스
작성자 avrtools™        
작성일 2008/09/23
첨부#2 AVR121.pdf (118KB) (Down:658)
Link#1 app_notes.asp?family_id=607 (Down:337)
ㆍ추천: 0  ㆍ조회: 5419   
  아듀이노 소프트방식 16Bit ADC
참조 : http://www.atmel.com/dyn/resources/prod_documents/doc8003.pdf
제목 : AVR121 - Enhancing ADC resolution by oversampling
저자 : omella  avr@atmel.com

목적
10 비트 분해능의 ADC로 만족할 수 없는, 16 비트 분해능의 측정값이 필요한 계측-제어 장비를 만들 때,
이 소스를 이용하면, AVR 기판에 고가의 ADC를 추가하지 않고도, 16 비트 분해능의 ADC를 만들 수 있습니다.

이 소스가 정말인지? M168-USB 아듀이노 호환기판에서, 아듀이노 소프트웨어로 개조하여 시험햇습니다. 
M18-USB 기판 소개 : http://www.avrtools.co.kr/technote7/board.php?board=tnshoppublic&command=body&no=44
  

시험결과
0V ~ 5V의 아날로그 전압을 A0 핀에서 검출하여, 통신포트로 16 비트 아날로그 값을 표시하는 기능으로
M168-USB 기판에서 USB 공급전원을, 5K 가변저항을 연결한 실측값은 6 mV ~ 4907 mV로 계측됩니다. 
실측에서 0 ~ 5000 mV로 나오지 않는 이유는, 가변저항의 특성은 출력이 0 ~ 100 %가 아니기 때문입니다.

변환속도는 1초에 3 ~12 번이며, 분해능은 1/5000로, 즉 0 ~ 5000 mV로 측정결과가, 정말 안정되게 나옵니다.  
일반적인 14 비트 이상의 적분형 ADC들은, 변환속도가 1초에 2~12 번이므로, 변환속도에서도 불편이 없습니다.
고가의 16비트 ADC와 아날로그 회로를 별도로 조립하지 않아도, 소스만으로 16비트 ADC가 구현됩니다.

다음 그림은 M16-USB 기판에서, 아듀이노 소프트웨어로 16 비트 ADC를 시험한 결과입니다.
16 비트 ADC 검출값이 4907 mV (즉 4.907V)로, 매번 일정하게 유지하는 매우 안정된 특성을 보여줍니다.
좌측 그림은 가변저항의 최대값을, 우측 그림은 분해능을 확인하기 위해, 가변저항을 가능한 적게 변경한 상태입니다. 

2 만원대의 하드웨어 기판에서 공개된 소스로 바로 만들수 있는, 16비트 ADC는 바로 아듀이노 기판입니다.
  
 
참고회로
아듀이노 기판의 0~5V 입력을 그대로 사용해도 되지만, 5V 이상이면 스코프 입력회로를 연결합니다.
입력 임피던스가 10K 이라도 측정에 문제가 없는 전원회로 측정용이면, 90.1K와 10K를 사용해도 됩니다.

 
스코프 프로브를 BNC 커넥터에 연결하여, AC - DC, 1:1 - 1:10과 1:1 - 1:2 - 1:4 수직진폭 전환기능이 있는 회로입니다.
만일 스코프 프로브를 쓰지 않고, 커넥터에 직접 연결하는 경우에는, 1/10 회로의 사용을 추천합니다.
회로를 간단하기위해 고정된 감쇄비를 사용하는 경우에는, 필요없는 스위치를 제거하고, 직접 연결하면 됩니다.

AVR121 응용자료 설명
ADC 분해능을 올리기 위한, 초과샘플링을 어떻게 사용하는가?
코드의 예는 ADC를 10 비트에서 16비트로, 분해능을 어떻게 올리는지 보여준다.
LSB가 움직이는 것을 보려면, 매번 ADC의 결과를 UART로 전송해도 좋다.   
 
1. 초과-표본화로 분해능을 올림
2. 대량살상(decimation)과 평균
3. 평균화로 잡음을 저감
 
AVR의 ADC는 기준전압을 AVCC, 2.56V, 1.1V 중에서 하나를 선택할 수 있다.
물론 기준전압을 낮출수록, 전압의 측정 정밀도는 올라간다, 
기준전압을 내부 2.56V를 사용한다면, 변환 결과를 2.5mV의 정확도로 주게된다. 
 
일방적으로 기준전압을 낮추어 측정정도를 올리면, 측정범위가 반대로 줄어들게 된다,
측정범위를 줄이지 않고, 측정정도를 올리려면, 분해능을 올리지 않으면 안된다.
이것을 다이나믹 레인지라고 하며, 얼마나 넓은 범위를 좋은 정도로 측정하는 능력을 말한다.
 
중첩 주파수(Nyquist Frequency)와 표본화 주파수(Sampling Frequency) 
일반적으로 표본화 주파수는 신호주파수의 2배 이상이어야 하며,
AVR의 10비트 ADCD의 클럭 주파수 50~200 KHz 중에서 200KHz로 변환을 한다면,

표본화 주파수는 ~15 Ksps가 되므로, 검출할수 있는 신호 주파수는 ~7.5 KHz로 제한된다.
AVR 데이터에서는 ADC 클럭이 1 MHz까지 가능하다고 한다.

표본화 법칙에 의하면, 표본화 주파수는 신호주파수의 두배 이상이어야 한다. 
표본화 주파수/2 이상의 주파수성분에서는, 중첩현상이 발생하여,
래 그림과 같은 가짜(Aliasing) 신호가 발생하기 때문이다.

 
이때 표본화 주파수의 1 /2에 상당하는 주파수를 중첩주파수 혹은 나이키스트 주파수라고 한다.
아날로그 신호를 ADC로 변환할 때, N개의 이산된 값(Discrete Value)으로 기록된다. 
주파수 분해능과의 관계는  표본화 주파수 = 나이키스트 주파수 * 2 와 △f = (fs / N) 으로 표현된다.
 
초과-표본화와 대량살상의 원리는 오히려 복잡하다. 그러나 반대로 사용방법은 쉽다.
초과-표본화는 많은 데이터를 필요로 하며, Freq(oversampling) = 4^n * Freq(nyquist) 로 부터,
n이 1 증가하면, 1 비트의 추가가 필요하다, 1 비트 분해능의 향상은 4배의 샘플링이 요구된다.

잡음(Noise)과 분해능(Resolution) 
1. 신호용 부품은 변환신호에 중대한 영향을 주지 않아야 한다.
2. 신호에는 약간의 잡음이 주어진다.
3. 잡음의 진폭은 1 LSB 이하 이어야만 한다.
 
변환과정에서 약간의 잡음이 신호에 섞여 들어온다. 잡음은 온도-잡음일 수도 있고,
CPU-코어로 부터, I/O 포트의 전환(switching)-잡음일 수도 있다. 전원 변동으로도 잡음이 발생한다.
중략,,, 어쨋든 분해능이 올라가면, 변환결과에 잡음이 증가되어 들어온다.
 
반대로, 커다란 2진수에 들어온 잡음은, 증가된 비트수(ENOB) 만큼 분산(spread)된다.
또한 표본화 주파수가 2배로 올라가면, 1 디짓트에 감영된 잡음은 3dB 정도 내려가고,
측정 분해능은 0.5 비트가 증가한다. 또한 평균횟수 만큼 흔들림과 잡음이 분할되어 줄어든다.
 
ADC 클럭 200KHz에서의 16비트 ADC의 특성
변환 정도 =16 비트,
분해능 =75 uV ,
샘플링 배수 = 4096, (64 x 64 =4096배 =12 비트를 추가하여, 22비트로 표본을 검출한다)
죽이는 비트 수 =6, (1/64 해서 하위 6 비트를 죽이면, 22 - 6 =16 비트가 결과로 남는다)
대량살상 결과 =32413,
전압 측정범위 =2.4729V,
ADC 변환속도 =3~48 회/초 (CLK/64 ~ CLK/2) 
 
 
 
실제 응용에서 10비트 ADC를 16비트 ADC로 사용하는 소스를 보여준다. 
소스에서, 오류를 제거하고 오차를 보상하는 방법을 추천한다.
 
아듀이노 16비트 ADC 소스
double accumulator = 0;  // 10-bit 샘플 연산용
double Vin = 0;               // 16-bit 부동소숫점 결과
short   temp = 0;             // 임시 저장 변수
short   samples = 0;        // 변환 횟수
 
// 10 비트 ADC 가로채기 함수
// ADC를 고속으로 초과표본을 읽는다
#pragma vector=ADC_vect
ISR(ADC_vect)
{
  accumulator += ADC;     // 1회 변환한 값을 계속해서 더한다
  samples++;                  // 몇 번 더햇는지 알 수 있도록, 표본수를 저장한다.
}
 
// CLK/64 ~ 2, (CK/64 일때 변환속도 = 3회/1초),
// 단일(Single ended) 입력으로, ADC0의 결과는 오른쪽으로 정렬 (Right adjusted)
void init_adc(void)
{
  // ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1);  // CLK/64                   
  ADCSRA =(1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADATE)|(0<<ADPS2)|(1<<ADPS1);       // CLK/4                    
  ADMUX = (0<<REFS1)|(0<<REFS0);                 // AREF =AVCC, ADC CH =0               
  ADCSRA |= ADSC;                // ADC 가로채기를 허용
}
 
// 오차 보상, 결과를 16 비트의 범위(scale)로 맞춤,
// 16 비트 결과를 반올림(Rounding up) 계산, 변수를 리셋
void over_sampled()                  // 초과 샘플링 표본값을 16비트로 처리
{
  noInterrupts();                         // 가로채기 금지   
  accumulator += 5150;                // Offset 오차를 보상 (ADC H/W의 고속처리 오차)
  accumulator *= 0.9993;              // Gain 오차를 보상 (ADC H/W의 고속처리 오차)

  temp =(int)accumulator %64;      // 1/64 나머지를 저장한다,
  accumulator /=64;                     // 1/64 =분해능을 16비트로 낮춘다 
  if(temp >=32) accumulator += 1;  // 만일 1/64 나머지가 32 보다 크면, 결과에 +1한다(반올림 =Round up)
  Vin =(accumulator *4.910) /65536;    // 0 ~ 5000 mV의 전압으로 변환한다
 
  samples     = 0;                     // 새로운 변환을 위해 표본수를 0으로 변경 
  accumulator = 0;                   // 새로운 변환을 위해 표본합계를 0으로 변경
  interrupts();                          // 새로운 변환을 위해 가로채기를 허가
}
                             
void setup()                           // 시험용 초기화
{
  Serial.begin(115200);             // 결과를 전송하는 통신포트를 초기화하고 시작
  Serial.println("M168-USB 16 bit ADC Software");
  init_adc();                            // ADC를 초기화하고 시작한다
}
 
void loop()                             // 시험용 주함수
{
  if (samples >4095)                  // end of 4096 samples?
  {
    over_sampled();                    // 22 비트 /6비트 =16비트로 변환한다.
    Serial.print(Vin, DEC);           // 16 비트 결과를 10진으로, 0 ~ 5000을 직렬포트에 송신
    Serial.println(" mV");             // 측정단위 mV를 표시하고, 줄을 바꾼다.
 
    digitalWrite(led_ind, HIGH);    // led on
    digitalWrite(led_ind, LOW);     // led off
  }
                                              // 여기에 사용자의 함수를 추가한다. 
}
 
10비트 ADC를 16비트로 만드는 소스, 잘 될까? 하던 생각을 말끔히 지우게 하는 이 방법은,,
무엇인가 새롭게 응용할 곳을 찾게 만듭니다, 한 마디로 AVR이 안타를 친 느낌입니다.
용도는 온도계,전압계, 압력계, 아날로그센서 인터페이스, 아날로그 데이터 로거 등등,, 많이 있습니다. 
 
이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
AVRTOOLS™
 
   
윗글 아듀이노 AC전원 THD 측정
아래글 아듀이노 초음파 모듈의 제작.
    N         제목    글쓴이 작성일 조회 추천
61 비접점식 QTouch 방식 근접검출 스위치 leeky 2016/01/21 (목) 565 0
60 Arduino 고속 오실로스코프 #3 avrtools™ 2012/03/29 (목) 17616 0
59 아날로그 8ch 데이터 로거 avrtools™ 2012/03/29 (목) 2724 0
58 Arduino DMX512 송신기 제작 avrtools™ 2012/03/15 (목) 2828 0
57 nRF24L01 무선모듈의 사용방법 avrtools™ 2012/03/07 (수) 5626 0
56 초음파 거리 측정기의 제작 avrtools™ 2011/09/18 (일) 4702 0
55 3축 가속도 센서 ADXL335 avrtools™ 2011/09/09 (금) 3242 0
54 Arduino Uno USBserial 펌웨어의 변경 avrtools™ 2011/08/27 (토) 2886 0
53 Arduino MIDI의 소개 avrtools™ 2011/08/19 (금) 3267 0
52 Arduino 고속 Oscillo Scope #2 avrtools™ 2011/08/12 (금) 2869 0
51 Arduino Uno 및 USB2serial Uno의 소개 [2] avrtools™ 2011/07/30 (토) 3128 0
50 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 7748 0
49 아듀이노 초음파 거리측정 및 응용 avrtools™ 2010/03/14 (일) 4034 0
48 M328-USB의 비밀 온도센서 avrtools™ 2010/01/02 (토) 3463 0
47 M168-mini로 만드는 USBasp avrtools™ 2009/10/10 (토) 5112 0
46 OBDuino ISO9141 소스의 설명 avrtools™ 2009/10/08 (목) 4017 0
45 아듀이노 0017 업그레이드 avrtools™ 2009/08/18 (화) 3544 0
44 Arduino 0015 업그레이드 avrtools™ 2009/06/01 (월) 3227 0
43 CC2500 Zigbee RF Modem #1 [4] avrtools™ 2008/11/20 (목) 6434 0
42 아듀이노 소프트웨어 Ver 0012 avrtools™ 2008/09/23 (화) 3896 0
41 Arduino 소프트웨어 설치방법 avrtools™ 2008/08/31 (일) 5431 0
40 아듀이노 PC 카메라 제작 avrtools™ 2008/10/28 (화) 7026 0
39 아듀이노 AVR-ISP V2의 제작 [6] avrtools™ 2008/10/22 (수) 8058 0
38 아듀이노 J1850-PWM 스캐너 avrtools™ 2008/10/15 (수) 4416 0
37 아듀이노 MPGduino의 제작 avrtools™ 2008/10/11 (토) 4733 0
36 아듀이노 OBD-II PID 처리함수 avrtools™ 2008/10/12 (일) 5332 0
35 아듀이노 OBD-II PID 송수신 함수 avrtools™ 2008/10/09 (목) 9430 0
34 아듀이노 ODB-II 스캐너 제작 [9] avrtools™ 2008/10/04 (토) 16793 0
33 아듀이노 AC전원 THD 측정 [2] avrtools™ 2008/09/30 (화) 6584 0
32 아듀이노 소프트방식 16Bit ADC avrtools™ 2008/09/23 (화) 5419 0
31 아듀이노 초음파 모듈의 제작. avrtools™ 2008/09/22 (월) 4689 0
30 아듀이노 Wii 프로세싱 avrtools™ 2008/09/20 (토) 4009 0
29 아듀이노 초음파 거리측정 avrtools™ 2008/09/20 (토) 5908 0
28 아듀이노 8x5 초소형 전광판 avrtools™ 2008/09/11 (목) 4524 0
27 아듀이노 4선식 터치패널 avrtools™ 2008/09/10 (수) 4544 0
26 아듀이노 2색 8x8 LED avrtools™ 2008/09/10 (수) 4751 0
25 아듀이노 24x6 LED 전광판 avrtools™ 2008/09/10 (수) 5273 0
24 아듀이노 8x8 LED 프로세싱 avrtools™ 2008/09/10 (수) 4004 0
23 아듀이노 32x16 RGB 전광판 avrtools™ 2008/09/06 (토) 13527 0
22 아듀이노 맥박검출기 avrtools™ 2008/09/03 (수) 9264 0
21 아듀이노 적외선 거리센서 avrtools™ 2008/09/01 (월) 5736 0
20 아듀이노 DMX 수신장치 [7] avrtools™ 2008/08/31 (일) 6595 0
19 아듀이노 AVR-ISP 만들기 avrtools™ 2008/08/30 (토) 4028 0
18 아듀이노 POV #3 avrtools™ 2008/08/30 (토) 3343 0
17 아듀이노 POV #2 avrtools™ 2008/08/30 (토) 3148 0
16 AVR 병렬포트 굽기장치 avrtools™ 2008/08/30 (토) 5056 0
15 아듀이노 DMX 송신기 avrtools™ 2008/08/28 (목) 4988 0
14 아듀이노 부트로더의 개조 [1] avrtools™ 2008/08/28 (목) 5667 0
13 아듀이노 병렬포트 굽기장치 avrtools™ 2008/08/26 (화) 4084 0
12 아듀이노 POV #1 avrtools™ 2008/08/26 (화) 3387 0
11 아듀이노 MIDI 드럼 leeky 2008/08/24 (일) 4621 0
10 아듀이노 SD/MMC 카드 avrtools™ 2008/08/24 (일) 9657 0
9 아듀이노 MIDI 플륫 avrtools™ 2008/08/24 (일) 3462 0
8 아듀이노 RGB LED avrtools™ 2008/08/23 (토) 4901 0
7 아듀이노 USB 오실로스코프 [2] leeky 2008/08/21 (목) 6286 0
6 가속도계 ADXL202 응용소스 avrtools™ 2008/08/20 (수) 4773 0
5 아듀이노 가속도센서 avrtools™ 2008/08/18 (월) 4744 0
4 아듀이노 RC서보 제어 avrtools™ 2008/08/17 (일) 5077 0
3 아듀이노 910-ISP 만들기 avrtools™ 2008/08/16 (토) 4590 0
2 아듀이노 온도센서, XBee 송수신 avrtools™ 2008/08/15 (금) 7344 0
1 아듀이노 기본명령 avrtools™ 2008/08/07 (목) 6420 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