Pfad: Home => AVR-DE => Anwendungen => Experimentell = > LED-Scanner   This page in english: Flag EN Logo
LED-Scanner AVR-Anwendungen

LED-Scanner mit ATmega48A


Experimentell! Unerprobt! Unvollständig!

LED-Scanner mit RS232-Interface

Die Vorwaertsspannung von LEDs Die Vorwärtsspannung von LEDs ist keine Linearfunktion des LED-Stroms. Wenn Du die Vorwärtsspannung nicht so genau brauchst, verwende einfach 2 V für eine 3- oder 5-mm-LED oder 3.4 V für eine weiße 10-mm-LED. Das haut meistens recht gut hin. Manchmal aber auch nicht, wie das Diagramm zeigt.

Wenn Du es genauer brauchst, dann messe einfach den Strom und die Spannung ein einziges Mal und hoffe, dass die 349 anderen LEDs auch so sind. Wie die beiden ersten LED-Sorten zeigen, gibt es dabei recht hohe Unterschiede.

Wenn Du die Vorwärtsspannung noch genauer brauchst, z. B. wenn Deine LEDs gestapelt sind und sich Fehler addieren, dann kann sich die echte Spannung recht weit von der so berechneten Spannung unterscheiden, je nach Deinen verwendeten Einzeldaten.

Und: wenn sich der Strom durch Deine LEDs verändert und dynamisch wird, dann ist Deine statische Näherung ehedem falsch und grob irreführend.

Und: wenn Du genaue Daten für alle 350 LEDs brauchst, dann wird das Einzelmessen sowieso langweilig.

Das hier ist geplant:
  1. Ein PWM-Generator variiert den Strom durch die LED, der Maximalstrom ist auf 40 mA festgezurrt (variierbar), so dass auch extrem hohe LED-Ströme getestet werden können.
  2. Zwei ADC-Kanäle messen zwei Parameter:
    1. den LED-Strom, und
    2. die Vorwärtsspannung der LED.
  3. Beide Werte werden in dezimale ASCII-Zeichenketten verwandelt und über das RS232-Interface an einen Computer oder Laptop gesendet.
Die Zeichnungen sind als LibreOffice-Draw-Datei hier und die Berechnungen als LibreOffice-Calc-Datei hier verfügbar.

Top Hardware Aufbau Anwendung Software Algorithmen

1 Hardware

1.1 Schaltung

Schaltbild des LED-Scanners Das ist die komplette Schaltung.

Die Schaltung benutzt den PWM-Ausgangspin OC0A von Timer/Counter TC0. Der Pin treibt einen NPN- und einen PNP-Transistor an, die wechselweise den Elko von 470 µF entladen und laden. Die 470 µF wurden ausgewählt, um die Welligkeit der Spannung am Elko durch die PWM unterhalb von 0,01 Volt zu halten. Der Entlade- und Ladestrom des Kondensators sind recht hoch (177 mA zu Beginn, 85 mA bei 50% PWM), um LED-Ströme von bis zu 40 mA zu ermöglichen. Die beiden Widerstände sollten daher bis zu 1 Watt aushalten können. Ströme dieser Größenordnungen überschreiten das, was ein einzelner AVR-Pin liefern kann (max. 40 mA) und was ein Kleinleistungstransistor an Strom schalten kann (100 mA), daher die etwas größeren Transistortypen.

Der Elko treibt die Anode der Test-LED direkt an, der Strom durch die LED wird durch den 24 Ω-Widerstand zwischen Kathode und Ground abgebremst. Die Spannung an diesem Widerstand wird mit dem ADC0-Pin gemessen und der LED-Strom daraus bestimmt. Der Widerstand sollte daher ein 1%-Typ sein. Da die Maximalspannung am Widerstand bei 1,1 V liegt, kann es ein 250- oder 400 mW-Typ sein.

Die beiden Widerstände mit 24k und 10k, beide mit 1% Genauigkeit, teilen die Spannung an der Anode der LED (Vorwärtsspannung plus Spannung aus dem Strom an der Kathode) herunter, so dass der ADC1 mit maximal 1,1 Volt interner Referenzspannung gemessen werden kann.

Der Controller wird mit einem 2,4576 MHz-Quarz getaktet, woraus der UART-Taktgenerator im ATmega48A die 9.600 oder 19.200 Baud erzeugt, mit denen das UART sendet und empfängt, und mit dem der PWM-Generator das 9,6 kHz-Signal zum Entladen/Laden des Elkos erzeugt.

Das ISP6-Interface ermöglicht das Programmieren des Controller in der fertigen Schaltung.

Der MAX232 wandelt die +5V-Signale des Controllers auf die +/-12Volt der RS232-Schnittstelle um (und zurück). Das Interface kann Daten senden und empfangen und beherrscht auch die Flusskontrolle via RTS/CTS-Handshake.

Die DB9-Buchse kann direkt mit dem DS9-Stecker des RS232-Interfaces verbunden werden.

1.2 Design der Hardware

Hardware-Design mit dem Tabellenblatt Die Hardware wurde mit dieser LibreOffice-Calc-Tabelle entworfen. Dieses simuliert die PWM und erlaubt das Herumspielen mit den folgenden Parametern:
  1. der Taktfrequenz,
  2. den beiden Lade- und Entlade-Widerständen Rpwm,
  3. dem Elko,
  4. dem Widerstand zum Strommessen,
  5. der PWM-Stellung als 8-Bit-Zahl.
Das Tabellenblatt simuliert die PWM-Lade- und -Entlade-Vorgänge am Elko in der Spalte Vc1. Da die Spannung in der Anfangsphase noch weit unterhalb von VCE = 0,2 V des Transistors BD439 liegt, beginnt das Entladen erst etwas später, wenn der Elko entsprechend aufgeladen ist.

Die Zeile 12 des Blattes zeigt die Maxima, nachdem die Berechnung das Gleichgewicht erreicht hat. Der Strom in Ampere durch die LED ist in der Spalte "Id" zu sehen (zu Beginn natürlich noch Null), die Spannung aus der Strommessung in der Spalte "VImeas".

Auswahl der zu simulierenden LED Dieser Teil des Tabellenblatts ermöglicht die Auswahl der zu simulierenden LED. Jeder LED-Typ ist mit drei Parametern a, b und c vertreten, die die quadratische Kurve
Vfwd = a * I2 + b * I + c (mit dem Strom in mA)

bilden. Die Spalten H bis N des Tabellenblatts nähern den Strom durch die LED bei der Elkospannung an. Der resultierende LED-Strom korrespondiert mit der Elkospannung, etwas beeinflusst durch den Strom-Messwiderstand. Der resultierende LED-Strom in Spalte O (in mA) wird in die Spannungsberechnung des Elko zurückgeführt.

Das Tabellenblatt liefert die folgenden Characteristika der verschiedenen LEDs. Der maximale LED-Strom von 40 mA wurde in den folgenden Simulationen eingestellt (welches in unterschiedlichen PWM-Stufen resultiert, abhängig vom Vfwd bei 40 mA).

Simulation einer weissen 10mm-LED, Typ 1 Dies hier ist eine weisse 10mm-LED als Beispiel. Sie hat ein Vfwd von 3.38 V bei 40 mA. Dieser LED-Typ hat die höchste Spannung und determiniert die Höchstspannung, die ADC1 messen können muss.

Was man auch sieht, ist dass weniger als 50 ms nötig sind, bis sich das Lade-/Entlade-Gleichgewicht eingestellt hat.

Simulation einer zweiten weissen 10mm-LED, Typ 2 Das ist ein anderer Typ von weissen 10mm-LEDs mit kleinerem Vfwd bei 40 mA Strom. Wie man sehen kann, braucht die PWM nun drei Einheiten weniger, weil Vfwd um 0,1 V kleiner ist.

Simulation einer 2-mA-LED Noch deutlich niedriger ist das PWM-Verhältnis bei einer 2-mA-LED: nur noch 199 sind nötig. Ich würde allerdings bei dieser LED empfehlen, den Maximalstrom auf 10 mA abzusenken.

Simulation einer roten 7-Segment-LED Ein noch niedrigeres PWM-Verhältnis ist nötig, um eine 7-Segment-LED mit 40 mA anzutreiben (was auch irgendwie wehtut).

Davon kann man sehen, dass die Maschinerie die gesamte Bandbreite von Spannungen und Strömen beherrscht. Mit dem Teil kann man jede Sorte von LEDs ausmessen.

1.3 Weitere Varianten

Was wenn Du gestapelte LEDs ausmessen willst? Kein Problem:
  1. Verbinde den Emitter des PNP-Transistors mit der höheren Spannung, schließe an die Basis über einen Widerstand einen NPN-Kleinleistungstransistor an und treibe den aus dem softwaremäßig invertierten OC0B-Signal (Stichwort: invertiertes PWM-Signal) an PD5, alle Software-Ausgaben auf OC0A mit dem gleichen Wert auch in OC0B schreiben (invertierter Gleichtakt).
  2. Ändere die beiden Rpwm-Widerstände so, dass bei Deiner Betriebsspannung die Lade- und Entladeströme (Spalte G der Tabellenkalkulation) bei ca. 180 mA liegen.
  3. Passe die Spannungsfestigkeit des Elkos an die erhöhte Spannung an.
  4. Ändere den Spannungsteiler am ADC1-Eingang so, dass die erhöhte Spannung mit der Referenzspannung von 1,1 V messbar wird.
  5. Ändere die Software entsprechend (insb. den Faktor zur Spannungsmessung, wenn die Spannung mehr als 9,9 Volt ist: füge das Tausender-Digit zur Spannungs-Umwandlung hinzu, gegenenfalls mit Null-Unterdrückung, ähnlich wie bei der Strom-Umwandlung).
Bei der Umkonfigurierung ist die Tabellenkalkulations-Seite "pwm" gerne behilflich. Einfach jede zweite Spannung auf die hohe Betriebsspannung, minus 0,2 V CE-Sättigungs-Spannung, umstellen und die Messwiderstände auf der Seite "adc-conversion" entsprechend umkonfigurieren.

2 Aufbau

Aufbau des ATmega48A, des ISP6 und der PWM Hier ist der ATmega48A, das ISP6-Interface und die PWM auf einem Breadboard aufgebaut.

Die PWM arbeitet mit 9k6, die LED ist etwas an Hier wurde der ATmega48A auf den externen Quarz umgestellt und mit dem Programm programmiert. Die LED ist bei einem PWM von 150 schwach am Leuchten (beachte, dass meine Rpwm höhere 39Ω haben), und die PWM-Frequenz ist bei 9,600 kHz, wie ausgelegt.

Die serielle Schnittstelle noch dazu gebaut Und das ist die serielle Schnittstelle noch dazu gebaut.

Top Hardware Aufbau Anwendung Software Algorithmen

3 Betrieb

TBD

Top Hardware Aufbau Anwendung Software Algorithmen

4 Software

4.1 Quellcode

TBD

4.2 Fuse-Einstellungen

Fuse-Einstellungen des ATmega48A Diese Fuses müssen umgestellt werden:
  1. Der externe Quarz ist als Taktquelle einzustellen.
  2. Die CKDIV8-Fuse muss gelöscht werden.
Das ist schon alles.

Top Hardware Aufbau Anwendung Software Algorithmen

5 Algorithmen

TBD

5.1 Ermittlung der Einstellzeit der PWM

Nachdem beim Scannen der Vergleichswert um eine Einheit erhöht wird, braucht die PWM eine gewisse Zeit, um sich an den neuen Wert anzupassen. Während dieser Zeit gemessene Strom- und Spannungswerte müssen verworfen werden.

Wechsel des PWM-Wertes Um diese Zeit zu ermitteln, gibt es im LibreOffice-Spreadsheet die Tabelle "pwm-change". Mit ihr können Wechsel des PWM-Wertes simuliert werden.

Hier ist ein Wechsel von 200 zu 201 bei einer weißen 10-mm-LED simuliert. Wie man sieht, braucht die PWM etwa 25 ms, um den geänderten Wert anzunehmen. Wie man an den beiden Kurven auch sieht, prägt sich der PWM-Takt mit seiner Welligkeit auch gehörig durch. Es macht daher Sinn, Strom und Spannung je 64 mal zu messen und aufzusummieren, um damit aus dem PWM-Chaos einen Mittelwert zu bilden. Wer das Chaos nachhaltiger verringern möchte, nimmt einfach einen 1-mF- oder 2,2-mF-Elko statt des 470µF. Das verlängert zwar auch den Einschwingvorgang, aber da ist genügend Spielraum, wie die folgende Berechnung zeigt.

Wie man in den Spalten E bis G der Tabellenkalkulation "adc" sieht, braucht eine Messkampagne für den gesamten Messvorgang ca. 227,5 ms. Das ist vor allem der länglichen Abholung der Messwerte in der ADC-ISR (siehe Quellcode) zu verdanken, die den Messzyklus ziemlich verlängert. Wer es schneller braucht, kann die ADC-Taktrate mit niedrigeren ADC-Vorteilerwerten entsprechend erhöhen. Auf jeden Fall reicht die Verzögerung durch die ADC also aus, die Ergebnisse der ersten Messkampage zu verwerfen und nur die Ergebnisse der zweiten Messkampage zu verwenden.

Fängt man den Scan mit PWM=130 an und durchläuft ihn bis 255, also ohne Stop wegen Überschreitung des Begrenzungsstroms, dann dauert der gesamte Messvorgang ca. 57 Sekunden, also weniger als eine Minute.

Damit alle Bytes einer Messkampage gesendet werden können, muss die Baudrate der seriellen Schnittstelle so hoch sein, dass sie kürzer als die Messkampagne bleibt. Wie man an der Berechnung sieht, ist dafür eine Baudrate von 286 Baud nötig. Das sollte also mit 9k6 bequem gehen.

5.2 Umwandlung von Strom und Spannung

Für die Umwandlung der aufsummierten ADC-Werte für Strom und Spannung wird ein wenig Grips benötigt.

ADC-Werte fuer Strom und Spannung in Ganzzahlen Diese Seite der LibreOffice-Calc-Datei vereinfacht diese Berechnung. Die Berechnung des Stroms geht wie folgt:
  1. Der ADC-Wandler arbeitet mit einer Referenzspannung von 1,1 V. Ein ADC-Resultat von 1.023 tritt bei einer Spannung von 1,1 * 1.023 / 1.024 = 1,0989 Volt am ADC0 auf.
  2. Mit einem Messwiderstand von 24Ω bedeutet das 45,79 mA durch die LED.
  3. Die Auflösung des ADC liegt folglich bei 44.72 µA pro Schritt, was zu einer Auflösung von 0,01 mA beim angezeigten Wert führt. Tatsächlich ist die Auflösung noch etwas höher, weil 64 einzelne Messwerte aufsummiert werden und nicht nur eine einzelne Messung erfolgt.
  4. Um den Strom zu einem ganzzahligen Wert mit dem Format "12.34 mA" umzuwandeln, müssen wir ihn mit 100 malnehmen.
  5. Die Anzeige des Maximalwerts sollte daher als "45,79" erfolgen, mit dem Ganzzahlwert von 4.579 (Dezimalkomma nach der zweiten Ziffer einfügen).
  6. Der ADC wird 64-mal messen und aufsummieren. Beim Maximalwert von 1.023 beläuft sich die Summe dann auf 64 * 1.023 = 65.472.
  7. Wir müssen daher die ADC-Summe mit 45,78857 * 100 / 65.742 multiplizieren, was 0,0699361 ergibt. Um das als Ganzzahlwert zu kriegen, multiplizieren wir mit 65.536 und kriegen 4.853 als Multiplikator. Natürlich müssen wir die 65.536 später im Ergebnis wieder wegstreichen, um das Resultat zu kriegen.
Das bedeutet: wenn die Messung des ADC eine Eins ergibt, summiert sich das auf 64 auf. Multipliziert mit 4.583 kriegen wir 293.312, dividiert durch 65.536 sind das dann 4,475, in der Tabellenkalkulation rundet sich das dann auf 4 ab. Die Software rundet etwas anders, addiert 0,55 zum Resultat und rundet auf 5 auf. Aber das ist alles nur funktionelle Kosmetik.

Die Spannungsberechnung geht ähnlich. Da sich zur Vorwärtsspannung der LED auch noch die Spannung hinzu addiert, die an dem Strommess-Widerstand am ADC0-Eingang abfällt, wird diese aus der ADC0-Messung als Spannung berechnet und vom Spannungswert abgezogen. Die Spannungswandlung der ADC0-Messungen geht mit dem Multiplikationsfaktor von 1.100 und führt zu dem mV-Beitrag der Strommessung.

Exportieren der Wandlungsfaktoren in den Quellcode Der links abgebildete Teil der Tabellenkalkulation ermöglicht es, diese Faktoren in den Assembler-Quellcode zu exportieren. Nur den gelben Teil markieren, mit Strg-C in die Zwischenablage und mit Strg-V in den Quellcode übertragen.

Multiplication 16*16-bit Alle Wandlungen multiplizieren die ADC-Summe (16-Bit-Zahl) mit Faktoren, die ebenfalls 16-Bit-Zahlen sind. Das Ergebnis ist eine 32-Bit-Zahl, die gerundet wird und deren oberen 16 Bits dann in Dezimal umgewandelt und angezeigt bzw. gesendet wird.

Die Multiplikation einer 16-Bit-Zahl mit einer anderen 16-Bit-Zahl wird hier mit dem Hardware-Multiplikator vorgenommen, wie er im ATmega48A eingebaut ist. Die Instruktion MUL nimmt die beiden 8-Bit-Zahlen miteinander mal und schreibt das Ergebnis in das Registerpaar R1:R0. Wie man diese 8-Bit-Multiplikation auf 16 Bits erweitert, um die beiden 16-Bit-Zahlen N1M:N1L und N2M:N2L miteinander zu multiplizieren, ist hier rechts gezeigt.

5.3 Umwandlung der Binärzahlen in dezimale ASCII-Zeichenketten

Beide Berechnungen führen zu 16-Bit-Binärzahlen, die im Falle des Stroms das Hundertfache in mA und bei der Spannung das 1.000-fache der Spannung angeben. Beim Strom ist die Obergrenze 40 mA oder 4.000, bei der Spannung sind es 3,51 V oder 3.510 als Binärzahl. Jedenfalls bleiben alle Zahlen unter 10.000.

Die Umwandlung der Binärzahlen in dezimal wird durch fortgesetztes Subtrahieren von binär 1.000 vorgenommen, dann von 100 und danach von 10. Der Rest der Zahl wird mit '0' addiert und gibt die letzte Ziffer.

Beim Strom wird durch Vergleich mit 1.000 zunächst festgestellt, ob die führende Ziffer überhaupt dargestellt wird. Wenn nicht wird direkt mit 100 fortgefahren (Unterdrückung der führenden Null). Bei der Spannung erfolgt das nicht.

5.4 Senden über das UART

TBD

Top Hardware Aufbau Anwendung Software Algorithmen


Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte per Email an mich (info und die Web-URL-Adresse), ich freue mich über alle Arten von Rückmeldungen.

©2023 by http://www.avr-asm-tutorial.net