Comment Bitte beachten Sie:
  • Alle Autoren akzeptieren mit dem Upload ihres Werkes die PhySX-Nutzungsbedingungen !
  • Sämtliche urheberrechtlich geschützte Medien, d.h. nicht-selbst erstellte Bilder, Medien und Videos werden kommentarlos gelöscht!

Aufnahme von U-I-Kennlinien von Dioden mit dem Arduino

Aus PhySX - Physikalische Schulexperimente Wiki
Wechseln zu: Navigation, Suche
Aufnahme von U-I-Kennlinien von Dioden mit dem Arduino
KennlinienArduino2.jpg
Kurzbeschreibung
Spannung - Strom - Kennlinien verschiedener LEDs
Kategorien
Digitales Messen, Elektrizitätslehre
Einordnung in den Lehrplan
Sonstiges
Durchführungsform Demoexperiment
Anzahl Experimente in dieser Unterkategorie 2
Anspruch des Aufbaus leicht
Informationen
Name: Tobias Ludwig, Lilly Pyras
Kontakt: \text{lilly.pyras}@\text{physik.hu-berlin}
Uni: Humboldt-Universität zu Berlin
This box: view  talk  edit  

Didaktischer Teil

Digitales Messen setzt ein Messewerterfassungssystem voraus. Neben den etablierten Systemen der Lehrmittelhersteller stellen kostengünstige Mikrocontrollerplatinen wie der Arduino Uno eine Möglichkeit dar, physikalische Messwerte im Physikunterricht zu erfassen.

Die für die Erfassung von Kennlinien notwendigen Größen von Stromstärke und Spannungen können ebenso gut mit einem Arduino Uni gemessen werden. Die visuelle Auswertung erfolgt in diesem Beispiel mit dem Pony Plot.

Versuchsanleitung

Die digitalen Messwerterfassungssystemen der Lehrmittelhersteller bieten die Möglichkeit, U-I Kennlinien automatisiert zu erfassen. Die Grundeinstellungen lassen sich häufig in den dazugehörigen Softwarepakten einfach auswählen.
Der Arduino Uno bietet a priori keine unmittelbare Möglichkeit eine Spannungsrampe "zu fahren" und dabei die Messung der Stromstärke gleichzeitig aufzunehmen. Grund dafür ist die fehlende Möglichkeit digitale Signale in Analoge umzuwandeln, die Gegenrichtung ist problemlos möglich.Dennoch gibt es mehrere Möglichkeiten die gewünschte Messung durchzuführen.

1. Halbautomatisiert: Die Schaltung wird durch ein Potentiometer ergänzt, welches manuell geregelt werden kann. Die Spannung wird also "mit der Hand" verändert. Der Arduino Uno nimmt dann Wertepaar von Spannung und Stromstärke auf.

2. Automatisiert: Einige digitale Pins des Arduino Unos verfügen über die Möglichkeit der Pulsweitensimulation (PWM). Um kleine Spannungen zu realisieren werden die digitalen PWM Signale über einen Tiefpassfilter derart geglättet, dass eine nahezu konstante Gleichspannung in 256 Schritten erzeugt werden kann. Die während der so ausgegebene Spannung gemessene Stromstärke kann anschließend als Wertepaar ausgegeben werden.

Aufbau

Halbautomatisiert mit Potentiometer
Die vom Arduino bereitgestellte Gleichspannung von 5 V wird über ein Potentiometer (10 kΩ, linear) so aufgeteilt, dass Werte von U1 = 0…5 V abgegriffen werden können. Diese Spannung wird über einen analogen Eingang des Boards gemessen (hier: Pin A0, vgl Abb. 1). Der Spannungsabfall über den Widerstand R=100 Ω ermöglicht die Bestimmung der Stromstärke durch diese Masche des Stromkreises über I=\frac{U_1-U_2}{R}. U2 wird ebenfalls über einen analogen Eingang des Arduinos gemessen (hier A1). Dies entspricht auch dem Strom, der durch die LED fließt. Trägt man nun I über U2 auf, erhält man eine U-I-Kennlinie für das Bauteil.

Spannungsteiler Schaltplan.png
Abb. 1: Schaltplan der halbautomatisierten Messung

Automatisierte Schaltung mit Pulsweitenmodulation (PWM)
Zur Spannungssteuerung werden zwei Ausgänge verwendet, die PWM steuern können, hier Pin D3 und D11. Die werden durch einen Tiefpassfilter geglättet, sodass ein Spannungsanstieg modelliert werden kann. Am analogen Pin A0 wird die Ausgangsspannung U_out des Tiefpassfilters gemessen. Die Stromstärke durch das zu vermessende Bauteil wird am analogen Pin A1 über den Spannungsabfall an R3 gemessen:I=\frac{Uout-U_2}{R} siehe Abb. 2. Diese Funktionalität wird über ein Arduino-Skript an der seriellen Schnittstelle bereitgestellt. Die Wertpaare für Stromstärke und Spannung können mit dem offenes Programm pony plot eingelesen und graphisch dargestellt werden. Dieser Plotter wurde speziell auf die Bedürfnisse des Physikunterrichts hin programmiert.

Autom Schaltplan.png
Abb. 2: Schaltplan der automatisierten Messung durch PWM

Durchführung

Bei dem halbautomatisierten Aufbau kann die Spannung über das Potentiometer geregelt werden. Zur Regelung der Spannung mit PMW wird ein kurzes Programm auf dem Arduino ausgeführt. Im Pony Plot können die Messwerte dargestellt werden. Download Source Pony Plot, Version 0.4.7
Datei für den Arduino: Datei:IVcurve pony.zip
Plotter in Processing: Datei:Arduino plotter multi.zip

Ergebnisse

Grafik PonyPlot.png
Abb. 3: Stromstärke in Abhängigkeit der Spannung bei verschiedenen Widerständen

Auswertung

Bei dem Vergleich von Glühlampe, linearem Widerstand, roter und blauer LED werden die unterschiedlichen Arten von Widerständen deutlich. Während die Steigung der Widerstandsdaten nicht verändert nehmen die der LED ab einem bestimmten Wert rasch zu. Die Stromstärke über der Glühbirne steigt zu Beginn schnell und flacht danach etwas ab.


Code

Download Source Pony Plot, Version 0.4.7
Datei für den Arduino: Datei:IVcurve pony.zip
Plotter in Processing: Datei:Arduino plotter multi.zip

IV_Curve Code für Arduino:

/* 
von Ferdinand Streicher 19.12.2018
basierend auf 
https://www.instructables.com/id/Measuring-the-IV-Curve-of-Semiconductors-With-an-A/
von rgco
*/


//Messung des Stroms in Abhängigkeit der Spannung mit zwei Anschlüssen. Besonders nützlich für LEDs
//Verbinde den RC-Tiefpassfilter mit dem Timer-Ausgang an D11 und D3, R = 100Ohm, C = 100muF, tau = 10ms
//Ausgabe des Filters an A0
//100Ohm Widerstand vom Filter zum Plus-Anschluss des untersuchten Geräts
//Plus Anschluss auch an A1 


void setup() {
  Serial.begin(9600);
  
  Serial.println();
  Serial.println(F("start:"));
  //Serial.println(F("title:UI-Kennlinien"));
  //Serial.println(F("subtitle:Showing magic"));
  Serial.println(F("setMaxY:20"));
  Serial.println(F("setMinY:0"));
  Serial.println(F("setMinX:0"));
  Serial.println(F("setMaxX:5"));
  Serial.println(F("setYFormat:#.###"));
  Serial.println(F("setXFormat:#.#"));
  Serial.println(F("setXAxisLabel:Spannung in Volt"));
  Serial.println(F("setYAxisLabel:Strom in Milliampere"));
  Serial.println(F("setPointColor:0,50,255"));
  Serial.println(F("setXDataLength:256"));
  
  Serial.println(F("button:B:Blaue LED:0,0,255"));
  Serial.println(F("button:R:Rote LED:255,0,0"));
  Serial.println(F("button:L:Gluehlampe:34,127,48"));
  Serial.println(F("button:r:Widerstand:0,0,0"));
  
  pinMode(11,OUTPUT); // PWM out
  pinMode(3,OUTPUT);  // PWM out
  pinMode(A0,INPUT);  // analog input
  pinMode(A1,INPUT);  // analog input
  TCCR2A = B10100011; //schnelle PWM an A and B
  TCCR2B = B00000001; //Keine Voreinstellung für Timer2
}

float Rseries=100;

void measure(byte val, byte nrep) {
  unsigned int v0=0;
  unsigned int v1=0;
  OCR2A=val;
  OCR2B=val;
  delay(30);
  for(byte i=0; i<nrep; i++){
    v0+=analogRead(A0);
    v1+=analogRead(A1);
    delay(5);
  }
  float volt0 = 5.0 * v0 / 1024.0 /nrep;
  float volt1 = 5.0 * v1 / 1024.0 /nrep;
  float ampere = 1000.0*(volt0-volt1)/Rseries;
  if (ampere<=0) ampere = 0;

  Serial.print(volt1);
  Serial.print(" ");
  Serial.println(ampere);
}

char command=0;
void loop() {
  if (command!=0) {
    switch (command) {
      case 'R' : // Rote LED
        Serial.println(F("activeGraph:0"));
        Serial.println(F("setPointColor:255,0,0"));
        Serial.println(F("setLineWidth:0"));
        break;
      case 'B' : // Blaue LED
        Serial.println(F("activeGraph:2"));
        Serial.println(F("setPointColor:0,0,255"));
        Serial.println(F("setLineWidth:0"));
        break;
      case 'L' : // Glühlampe
        Serial.println(F("activeGraph:5"));
        Serial.println(F("setPointColor:34,127,48"));
        Serial.println(F("setLineWidth:0"));
        break;
      case 'r' : // Widerstand
        Serial.println(F("activeGraph:6"));
        Serial.println(F("setPointColor:0,0,0"));
        Serial.println(F("setLineWidth:0"));
        break;
    }
    // starte eigentliche Messung 256 Messpunkte von 0...255
    for (int i=0;i<256;i++) {
      measure(i,32);
    }
    command =0;
  }
  // Lese Kommando von der seriellen Schnittstelle
  if(Serial.available()){
    command=Serial.read();
  } 
}

Siehe auch

Die Darstellung wurde mit dem Programm Pony Plot erzeugt.