|
|
![]() 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 ijÆÐ½ÃÅͰ¡ ¾øÀ¸¸é ½ºÀ§Ä¡ ¾øÀÌ ¼îÆ®½ÃÄѵµ µÈ´Ù. ÷ºÎÆÄÀÏ¿¡´Â tiny-oscope Æú´õ ¾È¿¡ hw_oscope.pde¿Í Arduino_O_Scope.pde°¡ µé¾î ÀÖ´Ù. processing¿¡¼ »ç¿ëÇÏ´Â ¼Ò½ºÆú´õ sketchbook > libraries > tiny-oscope ¸¦ ³Ö´Â´Ù. hw_oscope.pde´Â ¾ÆµàÀÌ³ë ±âÆÇ¿ë ¼Ò½ºÀÌ´Ù. ½º°ÙÄ¡¿¡¼ ÄÄÆÄÀÏÇÏ¿© ¾ÆµàÀÌ³ë ±âÆÇÀ¸·Î Æß¿þ¾î¸¦ ¾÷·ÎµåÇÑ´Ù. Arduino_O_scope.pde´Â ÇÁ·Î¼¼½Ì ¼Ò½ºÀÌ´Ù. ÄÄÆÄÀÏµÈ ÇÁ·Î¼¼½Ì : ![]() ÷ºÎÆÄÀÏ Oscope > Oscope-win32 > Æú´õ ¾ÈÀÇ oscope.exe¸¦ ½ÇÇàÇÏ¸é ½ºÄÚÇÁ°¡ ÀÛµ¿µÈ´Ù. °ø°³µÈ ÇÁ·Î¼¼½Ì ¼Ò½º´Â 0V¿Í 5V¿¡¼ ¼±ÀÌ ¾Èº¸À̹ǷÎ, °á±¹ ÇÁ·Î¼¼½ÌÀ» ¼öÁ¤ÇÏ¿´´Ù. ¼öÁ¤ÈÄ 0V ¿Í 5VÀÇ ½ÅÈ£ÀÇ ¶óÀÎÀÌ º¸ÀδÙ. Æ®¸®°Å ·¹º§µµ ÃʱⰪÀ» 0.5V·Î º¯°æÇÏ¿´´Ù. 0.5V·Î Æ®¸®°ÅµÈ ¿ÀÇÂµÈ 1VpkÀÇ ÀÔ·ÂÀâÀ½ÀÇ ½ÅÈ£ÆÄÇüÀÌ È¸é¿¡¼ È帣Áö ¾Ê°í Á¤ÁöµÈ´Ù. ¼öÁ¤µÈ ÇÁ·Î¼¼½Ì ¼Ò½º¿Í ÄÄÆÄÀÏµÈ ½ÇÇàÆÄÀÏ : ![]() À§ÀÇ ÇÁ·Î¼¼½Ì ¼Ò½º¸¦ ¹Ù²Ù·Á¸é, ¾ÆµàÀ̳ë ÇÁ·Î¼¼½Ì »ç¿ë¹ýÀ» ÂüÁ¶. 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 ![]() |
![]() ![]() ![]() ![]() | ![]() |
![]() |
![]() |