PROJEKTOVANJE I IZRADA VIŠEKANALNOG KONTROLERA ZA PROGRAMIBILNI LED IZVOR DIPLOMSKI RAD IZ FIZIČKE ELEKTRONIKE UVOD • Spektralno modulisani LED izvori sa različitim spektralnim doprinosima, namenjeni kalibraciji.

Download Report

Transcript PROJEKTOVANJE I IZRADA VIŠEKANALNOG KONTROLERA ZA PROGRAMIBILNI LED IZVOR DIPLOMSKI RAD IZ FIZIČKE ELEKTRONIKE UVOD • Spektralno modulisani LED izvori sa različitim spektralnim doprinosima, namenjeni kalibraciji.

PROJEKTOVANJE I IZRADA VIŠEKANALNOG KONTROLERA ZA PROGRAMIBILNI LED IZVOR

DIPLOMSKI RAD IZ FIZIČKE ELEKTRONIKE

UVOD

• Spektralno modulisani LED izvori sa različitim spektralnim doprinosima, namenjeni kalibraciji optičkih detektora.

• Podesiti doprinose pojedinačnih LED u ukupnom spektru.

• Podešavanje pomoću odgovarajuće struje.

• Dobijanje željenog spektra pomoću LED različitih karakteristika.

• Za kalibraciju optičkih radijacionih pirometara, spektar će imati oblik Plankovog zakona zračenja.

• Sumiranje unutar integrišuće sfere.

Zadatak

• Kontrolisani pulsni izvor struje od 10mA do 100mA.

• Kontrolisani odnos signal-pauza za svaki kanal zasebno.

• Period od maksimalno 70𝜇𝑠.

• Za 15 kanala, na svakom kanalu minimum 5V.

PWM

Tehnika dobijanja analognih rezultata digitalno.

• 1 – 5V, 0 – 0V.

• Simuliramo napone u rasponu od 0V do 5V menjajući odnos signal-pauza.

• Velika frekvencija  stabilni napon.

BLOK ŠEMA UREĐAJA

Arduino daje najviše 40mA  moramo da povećamo struju  strujni izvori za svaki kanal.

ARDUINO

• ATMega 16MHz • 15 pina za PWM • USB kontroler • Napajanje zasebno ili preko USB

PWM LED TESTER

Nylon konektori 2.54mm, 4x8-pol Difuzne 3mm LED I=2mA Paralelni otporni niz 8x470Ω

LED PANEL I NIZ LED ZA TESTIRANJE

Kontaktna letvica 2x15 sa jumper-ima DIP ZIF Kontaktna letvica 1x15 Kontaktna letvica 1x15 • • • 5mm LED 20mA (u praksi 40mA) 2.1V pad napona 3 diode u red i 7 paralelno  250mA i 6.3V

STRUJNI IZVORI

• 𝐼 𝐿 = 4.4𝑉 𝑅 𝐸 , 𝑉 𝑐𝑐 • Menjamo 𝑅 𝐸 = 12𝑉  varira 𝑉 𝑐  𝐼 𝐿 • Pregrevanje 2N2218A (250MHz) • Test BC140, BC142, BD135 • Dobijene vrednosti: <10mA i >200mA, >6.3V

POTENCIOMETRI

• 𝑃 max = 0.25𝐴 2 ∙ 10Ω = 0.625𝑊 • 𝑅 𝐸 = 4.4𝑉 𝐼 𝐿  𝑅 𝐸 10 mA = 440Ω , 𝑅 𝐸 • Fino i grubo podešavanje jačine struje.

100 mA = 44Ω

PCB

KUĆIŠTE I RASPORED KOMPONENATA

PROGRAMIRANJE

• Kontrola odnosa signal-pauza preko računara za svaki kanal zasebno.

• Baud Rate = 9600b/s.

Određivanje COM porta Unos vrednosti za PWM u % String u Int Između 0 i 100 Pretvaranje u 8-bit Int u String Kreiranje stringa sa deliteljima Slanje na COM port Prijava greške Mapiranje pinova Menjanje frekvencije Čitanje sa serijskog Deljenje stringa String u int PWM

ARDUINO PWM

analogWrite(pin, vrednost) • Podrazumevane PWM frekvencije: 490Hz i 976Hz • Menjamo vrednosti 5 tajmera. Prescaler 1 daje najveću frekvencu: 31.25kHz i 62.5kHz

int myEraser = 7; // 111 se koristi za brisanje // postavljamo prescaler za timer 1 na 0 TCCR1B &= ~myEraser; // upisujemo novu vrednost int myPrescaler = 1; TCCR1B |= myPrescaler; // upisujemo prescaler

Provera na osciloskopu: desno pinovi 4 i 13, levo ostali pinovi.

ARDUINO - PROGRAMIRANJE

char inputBuffer[100]; // For incoming serial data String s; int pwm[15]; // 0 – 255 String pod; int ledPin[] = {2,3,4,5,6,7,44,45,46,8,9,10,11,12,13}; // maps Arduino pins void setup() { Serial.begin(9600); // Opens serial port, sets data rate to 9600 bit/s.

int myEraser = 7; // sets integer that erases timers TCCR0B &= ~myEraser; // erase timer 0 TCCR1B &= ~myEraser; // erase timer 1 TCCR2B &= ~myEraser; // erase timer 2 TCCR3B &= ~myEraser; // erase timer 3 TCCR4B &= ~myEraser; // erase timer 4 TCCR5B &= ~myEraser; // erase timer 5 // Write timers values int myPrescaler = 1; // chose max frequency // write into timers TCCR0B |= myPrescaler; // 62kHz, it affects timing functions by reducing them 62 times TCCR1B |= myPrescaler; // 31kHz TCCR2B |= myPrescaler; // 31kHz TCCR3B |= myPrescaler; // 31kHz TCCR4B |= myPrescaler; // 31kHz TCCR5B |= myPrescaler; // 31kHz } void loop() { if (Serial.available() > 0) { // writes while there is something to read from serial Serial.readBytes(inputBuffer, Serial.available()); // reads from serial into inputBuffer array Serial.print(inputBuffer); // writes what has been read from serial Serial.print("END"); // puts an END at the end of read string } delay(20000); // for default timer 0, enough is this value divided by 62 set it to 20k pod = String(inputBuffer); // PWM starts here, for all pins for (int x=0; x<15; x++){ pwm[x]=splitString(pod,',',x).toInt(); // Uses function splitString to splits string using comma as delimeter pinMode(ledPin[x], OUTPUT); analogWrite(ledPin[x],pwm[x]); // PWM on maped pin delay(100); // we must give it some time to execute all this } } // define splitString function String splitString(String s, char parser, int index){ String rs='\0'; // empty char int parserIndex = index; int parserCnt=0; while(index>=parserCnt){ rFromIndex = rToIndex+1; rToIndex = s.indexOf(parser,rFromIndex); if(index == parserCnt){ if(rToIndex == 0 || rToIndex == -1){ return '\0'; } return s.substring(rFromIndex,rToIndex); } else{ parserCnt++; } } return rs; }

JAVA FORMA

PWM LED br. poklapaju se sa onima na kućištu.

• Arduino Pin odgovaraju rednom br.

PWM pina na boardu.

• Unosimo vrednosti od 0 do 100. Ukoliko unesemo vrednost van ovog opsega, izaći će prozor koji prijavljuje grešku.

• Pritiskom na dugme „Apply“, procenti se pretvaraju u 8-bitne vrednosti (od 0 do 255), što se i ispisuje za svaki pin. Takođe se šalje informacija na USB i ispisuje koji je COM port odredio operativni sistem za Arduino.

JAVA KOD

package arduinoserialtest; import javax.swing.JOptionPane; import jssc.SerialPort; import jssc.SerialPortEvent; import jssc.SerialPortEventListener; import jssc.SerialPortException; import jssc.SerialPortList; public class NewJDialog extends javax.swing.JDialog { jssc.SerialPort serialPort; String izabraniPort = ""; String tmp=""; String primljeno=""; int percent[]; String percents[]; int bin[]; String bins[]; String percentInput; String zaSlanje = ""; public NewJDialog() { initComponents();} class SerialPortReader implements SerialPortEventListener { public void serialEvent(SerialPortEvent event) { if (event.getEventValue() == 0) { return;} //Read from serial until the END is received if (event.isRXCHAR()) {try { byte buffer[] = serialPort.readBytes(event.getEventValue()); tmp = tmp + new String(buffer); if (new String(buffer).indexOf("END") > -1) { primljeno = tmp.split("END")[0]; tmp = ""; //clear what has been read}} catch (SerialPortException ex) { // System.out.println(ex);}}}} private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { try { // detect com port for Arduino String[] portNames = SerialPortList.getPortNames(); if (portNames == null) { System.out.println("sout"); //print if nothing is detected return;} // Print out working COM port for (int i = 0; i < portNames.length; i++) { // System.out.println("port: " + portNames[i].toString()); izabraniPort = portNames[i].toString(); comport.setText(izabraniPort); // write com port into textbox}} serialPort = new SerialPort(izabraniPort); serialPort.openPort(); serialPort.setParams(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, false, false); // speed is 9600 to match Arduino, false statements at the end exist so that Arduino does not get reset each time there is a read int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask serialPort.setEventsMask(mask);//Set mask serialPort.addEventListener(new SerialPortReader()); // Catch port

// Calculations percent = new int[16]; // define array length percents = new String[16]; // define array length bin = new int[16]; bins = new String[16]; // get string values from textboxes percents[1] = percentInput1.getText(); percents[2] = percentInput2.getText(); percents[3] = percentInput3.getText(); percents[4] = percentInput4.getText(); percents[5] = percentInput5.getText(); percents[6] = percentInput6.getText(); percents[7] = percentInput7.getText(); percents[8] = percentInput8.getText(); percents[9] = percentInput9.getText(); percents[10] = percentInput10.getText(); percents[11] = percentInput11.getText(); percents[12] = percentInput12.getText(); percents[13] = percentInput13.getText(); percents[14] = percentInput14.getText(); percents[15] = percentInput15.getText(); // Do for all 15 fields zaSlanje = ""; for (int x=1; x<=15; x++) { percent[x] = Integer.parseInt(percents[x]); // set int values bin[x] = (int) Math.round(2.55 * percent[x]); //convert percent to 8-bit value bins[x] = Integer.toString(bin[x]); //convert to string zaSlanje = zaSlanje + bins[x] + ","; // Check if values are withing percent range 100", "Error"); if (percent[x] < 0 || percent[x] > 100) { // Error input report with message box System.out.println("Error"); NewJDialog.infoBox("Input values must be between 0 and } } // System.out.println(zaSlanje + "\n"); //test weather it sends proper values // Display 8-bit values in label bitvalue1.setText(bins[1]); bitvalue2.setText(bins[2]); bitvalue3.setText(bins[3]); bitvalue4.setText(bins[4]); bitvalue5.setText(bins[5]); bitvalue6.setText(bins[6]); bitvalue7.setText(bins[7]); bitvalue8.setText(bins[8]); bitvalue9.setText(bins[9]); bitvalue10.setText(bins[10]); bitvalue11.setText(bins[11]); bitvalue12.setText(bins[12]); bitvalue13.setText(bins[13]); bitvalue14.setText(bins[14]); bitvalue15.setText(bins[15]); //serialPort.writeString(text.getText()); // Set String to send over // String zaSlanje = "100,0,100,0,100,0,100,0,100,0,100,0,100,0,100,"; serialPort.writeString(zaSlanje); System.out.println("Sending String" + zaSlanje); try { Thread.sleep(500); } catch (InterruptedException ex) { } // System.out.println("primljeno: " + primljeno); // print what is received over serial serialPort.closePort(); } catch (SerialPortException ex) { System.out.println("greska: " + ex); } }

POVEZIVANJE LED I MERENJE JAČINE STRUJE

• Moguće je priključiti po 3 LED na svakom kanalu.

• A – merenje struje, V – pada napona.

• Za tačnu amplitudu struje, podesiti signal na 1.