PROJEKTOVANJE I IZRADA VIŠEKANALNOG KONTROLERA ZA PROGRAMIBILNI LED IZVORDIPLOMSKI 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
• Za 15 kanala, na svakom kanalu minimum 5V.
PWM
Tehnika dobijanja analognihrezultata digitalno.
• 1 – 5V, 0 – 0V.
• Simuliramo napone u rasponuod 0V do 5V menjajući odnossignal-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
Paralelni otporni niz
8x470Ω
Nylon konektori 2.54mm, 4x8-pol
Difuzne 3mm LED I=2mA
LED PANEL I NIZ LED ZA TESTIRANJE
DIPZIF
Kontaktna letvica 1x15
Kontaktna letvica 1x15
Kontaktna letvica 2x15sa jumper-ima
• 5mm LED 20mA (u praksi 40mA)
• 2.1V pad napona• 3 diode u red i 7 paralelno
250mA i 6.3V
STRUJNI IZVORI
• ,
• Menjamo varira
• Pregrevanje 2N2218A (250MHz)
• Test BC140, BC142, BD135
• Dobijene vrednosti: <10mA i >200mA, >6.3V
POTENCIOMETRI
• ,
• Fino i grubo podešavanje jačine struje.
100 200 300 400 500
0.1
0.2
0.3
0.4
0.5
0.6
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 %
Između 0 i 100
Prijava greške
Pretvaranje u 8-bit
Kreiranje stringa sa
deliteljima
String u Int
Int u String
Slanje na COM port
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 dajenajveću frekvencu: 31.25kHz i 62.5kHz
int myEraser = 7; // 111 se koristi za brisanje// postavljamo prescaler za timer 1 na 0TCCR1B &= ~myEraser;// upisujemo novu vrednostint myPrescaler = 1;TCCR1B |= myPrescaler; // upisujemo prescaler
Provera na osciloskopu: desno pinovi 4 i 13, levo ostali pinovi.
ARDUINO - PROGRAMIRANJEchar 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 saonima na kućištu.
• Arduino Pin odgovaraju rednom br.PWM pina na boardu.
• Unosimo vrednosti od 0 do 100. Ukolikounesemo vrednost van ovog opsega, izaćiće prozor koji prijavljuje grešku.
• Pritiskom na dugme „Apply“, procenti sepretvaraju u 8-bitne vrednosti (od 0 do255), š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 KODpackage 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 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 100", "Error");
// 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.