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








 게시판 검색





 
 
회원등록 비번분실


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

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2012/03/29
첨부#1 tiny-oscope.zip (2KB) (Down:112)
ㆍ추천: 0  ㆍ조회: 462   
  8채널 12비트 ADC MCP3208 오실로스코프
MCP3208 오실로스코프
만일 아듀이노에 내장된 10비트 ADC의 한계를 넘는 더 좋은 분해능과 처리속도가 필요하다면?
그렇습니다. MCP3208을 사용하면, 이 문제를 해결할 수 있습니다.

(좌측은 아날로그를 신호와 연결하는 핀, 우측은 적색은 아듀이노 기판의 연결 핀입니다)
참고 : D13 에 연결된 아듀이노 기판의 내장 LED는 SPI 작동에 문제가 없으므로 그대로 둔다. 
   
 
MCP3208-8 ADC는 12 비트 adc로 8 ch의 아날로그 입력과
100 kHz의 샘플링 속도로 축차비교형(SAR CDAC) ADC로 SPI 인터페이스를 가지고 있습니다.

VREF 핀에 5.5V 외에 4.096V를 인가하면 최대입력 범위(FS)이 4.095V로 되므로
12 비트 ADC에서 읽은 0~4095를 그대로 mV로 사용이 가능합니다.
VREF에 2.048V를 연결하면 0~2.047V 아날로그 입력을 0~2047 mV 읽을 수 있습니다.
 
MCP3208 DIP을 못사고, SOP16 패키지를 2,000원에 구입, 변환기판은 IC보다 비싼 3,000원에 샀습니다. ^^;
 
 
30x14 핀 빵판을 명함통에 넣으니 쏙 들어 가네요, 바닥에서 절연이 잘 되어 좋을것 같습니다.
이번에 사용한 기판은 M328-nmini V2.0 과 USB2serial V2.0 으로 UNO방식의 아듀이노 기판. 
 
MCP3208을 0~5V 1CH 오실로스코프로 시험하는 소스
이 소스는 아래의 프로세싱으로 연동하여 오실로스코프로 만들어 본 것입니다.
아듀이노 기판에 이 스케치를 컴파일한 다음, 업로드하여 펌웨어로 굽는다.

// 참조 : http://arduino.cc/playground/Code/MCP3208
// hw_oscope.pde
// Arduin-O-Scope (a tiny oscilloscope project)용으로 avrtools.co.kr 에서 개조
// 2012. 3. 29.

 
#define SEL 10   // SPI로 사용할 핀의 정의, 라이브러리는 사용하지 않는다. 
#define DOUT 11  // MOSI
#define DIN  12  // MISO
#define SCK  13  // Clock
int read_value;

 
void setup(){ 
 pinMode(SEL, OUTPUT);  // SPI 에 사용할 핀의 입출력을 설정 
 pinMode(DOUT, OUTPUT);
 pinMode(DIN, INPUT);
 pinMode(SCK, OUTPUT);
 
 digitalWrite(SEL,HIGH);  // SPI를 사용하기 전에 먼저 정지시킨다. 
 digitalWrite(DOUT,LOW);
 digitalWrite(SCK,LOW);

 Serial.begin(115200);
}

 
int read_adc(int channel){  // channel 변수로 들어온 값으로 mcp3208의 채널을 선택한다.
  int adc_value = 0;
  byte command_bits = B11000000;
// MCP3208의 명령비트  start, mode, chn (3), dont care (3)
 
  command_bits|=((channel-1)<<3);   // mcp3208의 채널을 계산 
  digitalWrite(SEL,LOW); //  cs 핀을 low로 한다.

  for (int i=7; i>=3; i--){   // 이제 mcp3208의 채널을 선택한다
    digitalWrite(DOUT,command_bits&1<<i);
    digitalWrite(SCK,HIGH);   // cycle clock = SCK 펄스를 만든다.
    digitalWrite(SCK,LOW);   
  }

 
  digitalWrite(SCK,HIGH);    //  2개의 SCK 펄스를 만든다.
  digitalWrite(SCK,LOW);
  digitalWrite(SCK,HIGH); 
  digitalWrite(SCK,LOW);

 
  for (int i=11; i>=0; i--){     // 선택된 채널의 아날로그 값을 읽는다.
    adc_value+=digitalRead(DIN)<<i;  
    digitalWrite(SCK,HIGH);  // cycle clock = SCK 펄스를 만든다.
    digitalWrite(SCK,LOW);
  }
  digitalWrite(SEL, HIGH); // mcp3208의 cs 핀을 high로 한다.
  return adc_value;  // 읽은 값을 주함수로 가지고 나간다.
}

 
// CH1 이외의 입력을 읽으려면 아래의 함수를 수정한다.
void loop() {
 read_value = read_adc(1); 
 // Serial.write((read_value >>8) & 0xFF);  // 상위 8 비트 송신
 // Serial.write(read_value &0xFF);  // 하위 8 비트 송신
 Serial.write((read_value >>4) & 0xFF); // 12 비트를 8비트로 개조하여 송신
 // 마지막 1줄을, Serial.println(read_value,DEC); 로 바꾸면 ASCII 값으로 PC에서 쉽게 볼 수 있다.


아듀이노 프로세싱 소스
// 참조 사이트 : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1233536778
// Arduino Forum › General › Exhibition ›
// Arduin-O-Scope (a tiny oscilloscope project)
// 저자 : Autor : estiers
 
import processing.serial.*;
Serial inPort;                           // the port to read from
int BAUD_RATE = 115200;                  // set baud rate here, needs to be the same value as in the arduino code
int BUFFER_SIZE=200;                     // data buffer size
int GRIDS=10;                            // number of grids to draw
int inVal;                               // y-data read in from the arduino
int lastVal;                             // old value of y-data
int[] yVals = new int[BUFFER_SIZE];      // y-data buffer, scaled to the screen size
int[] xVals = new int[BUFFER_SIZE];      // x-data buffer, scaled to the screen size
int trigger;                             // trigger, when the incoming data passes this value a frame starts
int timeOut;                             // if no trigger is detected by timeOut samples, plot what is at input port
int i;                                   // counter
boolean blinker;                         // blinks a light on each frame update so you know when program is running   
boolean noTrigger;                       // true until trigger is detected
boolean noTimeOut;                       // true until timeout runs out if no trigger is found first

void setup(){
 // 적색으로 된 숫자 2 는 아듀이노에 사용된 직렬포트의 순서이다. (나타난 포트순서로 0, 1, 2, 3,,,,을 설정)
 // 아듀이노 com 포트에 즉 com3, com4, com5가 있고, 그중에 com5를 사용한다면 2로 설정.                                        
  inPort = new Serial(this, Serial.list()[2], BAUD_RATE);   
  size(600, 400);                                           
  background(0);
  stroke(255);
  trigger=100;
  timeOut=2*BUFFER_SIZE;
}
 
void draw()
{
  // dump any old data sent while program wasn't running or was busy
  inPort.clear();
 
  // wait for trigger event or timeout
  noTrigger=true;
  noTimeOut=true;
  lastVal=1023;
  i=0;
  while(noTrigger & noTimeOut){
     if (inPort.available()>1){                                    // wait for a byte to appear on serial port
         inVal=(inPort.read());                                    // read the byte
         if((inVal>trigger)&(lastVal<=trigger)) noTrigger=false;   // check for trigger event
         lastVal=inVal;
         i++;
         if (i>timeOut) noTimeOut=false;                           // check for timeout event
      }
      else{
        delay(1);
      }
  }
 
  // collect a frame of data
  i=0;
  while(i<BUFFER_SIZE){                                            // read a buffer full of date                 
    if (inPort.available()>1){
          inVal=( inPort.read());
          yVals[i]=height-((height)*inVal)/254;                    // scale data to screen height
          xVals[i]=(width*i)/BUFFER_SIZE;                          // scale x-value to screen width
          i++;
      }
      else{
        delay(1);
      }
  }
 
  // draw grid lines
  background(0);
  stroke(0,64,0);
  for(i=1;i<GRIDS;i++){
    line((width*i)/GRIDS,0,(width*i)/GRIDS,height);
    line(0,(height*i)/GRIDS,width,(height*i)/GRIDS);
  }
 
  // draw trigger level
  stroke(128,0,128);
  line(0,height-(height*trigger)/254,width,height-(height*trigger)/254);
 
  // draw scope trace
  stroke(255,255,0);
  for (i=1;i<BUFFER_SIZE;i++){
    line(xVals[i-1],yVals[i-1],xVals[i],yVals[i]);
  }
 
  // draw a dot that changes state each screen update
  // if this isnt blinking, something is wrong
  stroke(255);
  if (blinker) ellipse(10,10,5,5);
  blinker=!blinker;
 
  // draw a green dot if trigger event fired frame
  if (!noTrigger){
    stroke(0,255,0);
    ellipse(20,10,5,5);
  }
  // draw a red dot if timeout event fired frame
  if (!noTimeOut){
    stroke(255,0,0);
    ellipse(30,10,5,5);
  }
 
  // this delay seems to be needed to let the system handle random events
  delay(10);
}
// move the trigger level to wherever the user clicks the mouse
void mousePressed() {
  trigger=(height-mouseY)*255/height;
}

이 프로세싱 소스를 프로세싱 편집창에 넣고 작동시키면 오실로스코프로 표시된다.
 
 
MCP3208의 AIN0의 입력에 M328-mini V2.0 기판의 3.3V 전압을 측정한 예.
황색은 측정전압, 보라색은 마우스로 눌러서 설정한 트리거 전압이다.

이 프로세싱의 성능은 1 바이트만 파형 데이터로 사용하므로 빠르다.
또한 마우스로 트리거 레벨을 변경하면, 좌우로 흐르는 파형을 정지시켜 볼 수도 있다.
트리거가 되면 좌측 상단의 작은 트리거 표시가 깜빡이는 변화도 있다. 
그외에 0.5V 눈금이 있어, 진짜 오실로스코프를 사용하는 화면과 같다. 멋지다. !!!
 
-2.5V ~ +2.5V의 교류파형을 측정할 때는 아래의 회로를 추가해야 한다. 


OP AMP는 LM358, LM2904, TL082, TL062 등등 단전원 Dual OP Amp는 대부분 사용할 수 있다.
OP Amp의 전원 +VC 8번 핀은 5V에 연결하고, -VC 4번핀은 GND로 연결한다.
 
10K 가변저항은 스코프의 0V 레벨의 표시위치를 바꾸는 DC OFFSET ADJ 이다.
중간의 스위치는 AC-DC를 전환하는 스위치이며, 470nF 캐패시터가 없으면 스위치 없이 쇼트시켜도 된다.

첨부파일에는 tiny-oscope 폴더 안에 hw_oscope.pde와 Arduino_O_Scope.pde가 들어 있다.
processing에서 사용하는 소스폴더 sketchbook > libraries > tiny-oscope 를 넣는다.
hw_oscope.pde는 아듀이노 기판용 소스이다. 스겟치에서 컴파일하여 아듀이노 기판으로 펌웨어를 업로드한다.
 
Arduino_O_scope.pde는 프로세싱 소스이다. 컴파일된 프로세싱 : Oscope-win32.zip(297KB)
첨부파일 Oscope > Oscope-win32 > 폴더 안의 oscope.exe를 실행하면 스코프가 작동된다.

공개된 프로세싱 소스는 0V와 5V에서 선이 안보이므로, 결국 프로세싱을 수정하였다.
  

수정후 0V 와 5V의 신호의 라인이 보인다. 트리거 레벨도 초기값을 0.5V로 변경하였다.
0.5V로 트리거된 오픈된 1Vpk의 입력잡음의 신호파형이 화면에서 흐르지 않고 정지된다.
수정된 프로세싱 소스와 컴파일된 실행파일 :  sw_oscope.zip(596.7KB)
 
위의 프로세싱 소스를 바꾸려면, 아듀이노 프로세싱 사용법을 참조.
http://www.avrtools.co.kr/technote7/board.php?board=download&command=body&no=122

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
 AVRTOOLS™

   
윗글 Arduino로 만드는 mySpectral 분광기
아래글 교류저항 (impedance) 측정 AD5933
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 177 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 258 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 291 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 351 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 334 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 402 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 375 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 322 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 531 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 458 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 275 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 356 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 518 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 389 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 266 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 486 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 360 0
9 Arduino DUE based DDS Synthesizer avrtools™ 2016/01/24 (일) 219 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 384 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1654 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2528 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 2067 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 462 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 415 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3630 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2615 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