PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Problem: Pulsstrom bei AVR (ATmega328) Unterschied zu Arduino?



Jannai
04.01.2013, 18:34
Hallo,

ich bin bei meinem aktuellen Projekt auf ein Problem gestoßen, trotz einiger Stunden des ausprobierens komme ich auf keine Lösung und möchte euch um eure Hilfe bitten:


Das Projekt:
Für einen Wohnzimmertisch sollen mehrere "interaktive" Licht-Module verbaut werden, die die Bewegung einer Hand usw. erkennen und entsprechend LEDs faden. Jedes Modul besteht aus 1 x ATmega368 und 6 IR/LED-Pixeln

Prinzip: der Controller schaltet einen Transistor, der einen hohen Strom durch 3 IR-Dioden schickt. Ein Fototransistor misst die (IR) Helligkeit, über einen Spannungsteiler bekomt der Controller einen entsprechenden analogwert.
Nun schaltet der Transistor die IR-Dioden aus, der µC misst erneut die Spannung am Fototransistor und vergleicht sie mit der vorherigen.
Besteht eine Differenz wird sie in einen pwm-Wert umgerechnet und an eine LED ausgegeben.

Ich habe den gesammten Aufbau mit einem Arduino getestet, alles funktionierte einwandfrei.

Aus Kostengründen wollte ich in meinen Wohnzimmertisch nicht 10 Arduinos verbauen, deshalb entschied ich mich für einen standalone-ATmega328, den ich (weil ich damit leichter arbeiten kann) einen 8Mhz-Arduino bootloader verpasste. Der µC nutzt seinen internen Oszillator, an ihm sind keine externen Komponenten verbaut.


Das Problem:
Wenn ich in der Standalone-Version die IR-LEDs wie vorher beim Arduino verschalte, dann macht der ATmega nichts mehr.
Schaltung: Transistor (2N3904) C an +5V, B über 220Ohm an µC, E an drei parallele IR-LEDs (TSHA5202), die über 1 Ohm an GND.
Diese Version macht beim Arduino keine Probleme.
Durch die IR-Dioden fließt ein Stom von je etwa 1 A, laut Datenblatt können die das für 1ms ab.

Tausche ich diese Konfiguration an den stand-alone ATmega, dann reagiert die LED nicht mehr auf Annäherung.
Setze ich in den IR-Kreis hinter die Dioden einen 330 Ohm Widerstand ein, dann funktioniert alles wunderbar, nur dass eben die Reichweite durch die
geringere IR-Helligkeit extrem leidet.
Schließe ich diesen R während des Betriebs kurz (als wäre er nicht da), dann "friert" der µC ein, d.h. wenn die gefadete LED leuchtete dann behält sie diese Helligkeit bei, verändert sie aber nicht mehr.
Unterbinde ich diesen Kurzschluss, dann gehts normal weiter, ohne dass ein Reset nötig wäre.

Ich verwende eine externe Spannungsquelle mit Elko, der Stomstoß sollte kein Problem machen.
Und ich möchte nochmal betonen, dass ich NICHT versuche 3 A durch den ATmega zu jagen, der dient nur als I/O-Geber für den Transistor.


Wisst ihr woran es liegen könnte? Im Prinzip müsste die Lösung durch einen Vergleich mit dem Arduino Uno ersichtlich sein, denn dort funtioniert es ja. Wie gesagt, µC und Code sind gleich.
Einfach einen Widerstand akzeptieren fällt aus, da die Reichweite sehr leidet.



Anbei die Quellen, aus denen das Projekt entstanden ist:
Prinzip:
http://www.instructables.com/id/Make-an-Attiny13-b...
http://www.instructables.com/id/Infrared-Proximity...
ATmega328 Standalone
http://www.instructables.com/file/FP6AIB0H0OIZC72

Bumbum
04.01.2013, 19:43
Hallo Jannai,

ich denke schon, dass der hohe Strom den µC aus dem Takt bringt. Hast du 100nF Block-Kondensatoren parallel zur Spannungsversorgung direkt am µC mit kürzestem Weg verbaut?
Wenn das schon so ist oder nicht hilft würde ich testweise probieren den µC mit einer anderen Spannungsquelle zu versorgen. z.B. ein 9V-Block mit einem 7805 nur für den µC. Die Massen der beiden Spannungsquellen dann natürlich verbinden.

Viele Grüße
Andreas

Jannai
04.01.2013, 20:44
Hey,

danke für die schnelle Antwort!
Ich hatte leider gerade keine Kondensatoren in diesem Bereich zur Hand, also habe ich mal die zweite Spannungsquelle ausprobiert. ES FUNKTIONIERT!

Eigentlich ja ein echt blöder Anfängerfehler, man sehe mir meine fehlende Bildung in Etechnik nach.
Wollte ich eine gemeinsame Spannungsquelle nutzen, welchen Kondensatorwert sollte ich wählen? Die besagten 100nF oder eine Kombination verschiedener?

Und noch eine Frage: mir ist erst nach dem Erhalt der Transistoren aufgefallen, dass der verwendete Transistor (2N3904) laut Datenblatt nur für einen Dauerstrom von 200mA ausgelegt ist. Schadet es ihm mit der Zeit, wenn ich ihn so hoch pulse? (ca. 2-3 A für 50µs)?

vielen Dank für die Hilfe,
Jannai


edit: wie füge ich denn nachträglich dieses "[gelöst]" suffix ein?

Bumbum
05.01.2013, 11:39
Hallo Jannai,

ich verwende immer 100nF und hatte noch nie Probleme. Allerdings hatte ich auch noch nie so hohen Pulsströme wie du. Ausprobieren würde ich sagen! Mehr kann man dir nicht raten, da du nicht geschrieben hast wie die "externe Spannungsquelle mit Elko" genau aussieht.

Der Dauerstrom für den Transistor ist bestimmt wegen der Erwärmung angegeben. (Ich habe mir das Datenblatt jetzt nicht angesehen). Zu den Spitzen-Strömen sollte aber auch etwas drin stehen. Aber solange nichts warm wird würde ich mir keine Sorgen machen.

Viele Grüße
Andreas

Jannai
05.01.2013, 15:07
Gut, die Kondensatoren müssten Montag kommen.
Die Transistoren schalten wohl doch eher nur ca. 1 A, ich habe bei meiner blauäugigen Rechnung vergessen dass natürlich auch der Basisstrom deutlich ansteigt. So oder so: warm werden sie nicht.

Danke und beste Grüße,
Jannai

Jannai
27.01.2013, 11:01
UPDATE

So, ich habe ein bisschen weitergelötet und bin derweil ein gutes Stück weiter gekommen und bei einem weiteren Problem gelandet. Die einzelnen Module funktionieren mit dem 100nF - Kondensator einwandfrei, hier ein Eindruck davon:
http://www.youtube.com/watch?v=AbrhO0wr51A

Das neue Problem besteht darin, dass die einzelnen Module (1 ATmega mit 6 Pixeln) ganz eigenartige Dinge machen wenn ich sie verbinde.
Wenn zwei Module, die einzeln wunderbar funktionieren parallel an die Spannungsquelle angeschlossen werden, dann passiert folgendes:
Alle Pixel leuchten von Anfang an, jedes mit einer anderen Helligkeit, teilweise flackern/blinken sie.
Die Annäherung einer Hand wird weiterhin detektiert, allerdings mit stark verminderter Reichweite. Vergleiche folgendes Video:
http://www.youtube.com/watch?v=2KBWKq_3Txs (Minute 1:50)

Nach einem Reset der Controller zeigt sich das gleiche Bild. Ich habe auch ein stärkeres Netzteil als im Video (5A Nennstrom) getestet, gleiches Ergebnis.
Die ATmega sind auf der Platine fast "nackt" verbaut, einzig ein 100 uF Elko und einen 100nF Keramik-Kondensator (2 mm vom Controller) sind zwischen Vcc und GND eingesetzt.

Meine Theorie:
Wenn im Programm das Setup anläuft sind die Controller ja noch voll im Takt. Durch das gleichzeitige Durchschalten der Transistoren fällt die Spannung ein Stück ab, die Referenz-Spannungsdifferenz "diff0", fällt dadurch zu gering aus, wodurch die im Loop berechneten Differenzen zu groß ausfallen, also die LEDs heller leuchten als sie sollten. Das flackern ließe sich mit der normalen Variation der Werte im Betrieb erklären, die jetzt auffallen weil der Buffer (Code Zeile 40 "-5") schon ausgeschöpft ist.

Was meint ihr, klingt das logisch, oder gibt es einen ganz anderen Grund für dieses Verhalten?
Falls ich recht habe: wie gehe ich am besten damit um? Soll ich die Controller im Setup durch irgendwelche Spielereien (klassisches Delay * Zufallswert) dazu bringen nacheinander den inertialen Spannungswert einzulesen?
Oder ist es klüger einen Kondensator/Induktivität einzufügen um die Module zu entkoppeln? Wenn ja wäre das klasse, denn die Controller sind schon programmiert ;-)
Dafür welches Bauteil wo einbauen?

Mir fehlt dahingehend als Maschinenbauer (beschämender Weise) einfach das Grundwissen in dem Bereich. Um so mehr interessiert mich natürlich warum sich die Module so verhalten und wie sich eine Lösung darstellt.

Vielen Dank für die Hilfe!
Jannai

Code (gerne weiterverbreiten, ich erhebe keine Urheberansprüche)
https://dl.dropbox.com/u/59379713/IR_Code_final/IR_Code_final.ino

Bumbum
27.01.2013, 11:37
Hallo,

hast du mal gemessen wie stark die Spannung am Atmel einbricht? Die Leitungen sehen für den Strom von 1A schon recht dünn aus. Eventuell hast du da dann trotzdem zu hohe Verluste. Hast du mal versucht dickere Leitungen für die Versorgung zu verwenden?
Alternativ hilft es vielleicht für die Versorgungsspannung 4 Leitungen zu verwenden. Jeweils 2 Stück (+ und -) für die Versorgung des Atmels und dann noch mal 2 Stück (auch + und -) für die Power. Am Netzteil kannst du alle + und alle - Leitungen verbinden.

Viele Grüße
Andreas

markusj
27.01.2013, 12:00
Das ist ein tolles Projekt, sowas steht auch auf meiner ToDo-Liste.

Zu deinem Problem: Wie viel Strom ziehen deine LEDs? Als Daumenregel setzt man je Ampere eine Kondensatorkapazität von 1000µF an, damit sollte man auf der sicheren Seite sein. Die Ursache für das beobachtete Verhalten liegt aber vermutlich eher in einer wechselseitigen Beeinflussung der einzelnen Controller. Im Einzelbetrieb ist immer nur genau eine IR-LED zur Messung aktiv, bei mehreren Modulen zusammen kannst du darüber aber keine Aussage treffen. Die Module übersprechen, das Ergebnis hat mehr einen Zufallscharakter. Um diesen Effekt zu unterdrücken wäre eine Synchronisierung der Module untereinander erforderlich, damit benachbarte Sensoren keine Messungen durchführen.

Ach ja: Du könntest das Projekt öffentlich dokumentieren (github würde sich anbieten um auch den Quelltext sauber unterzubringen), andere hätten daran bestimmt auch Interesse.

mfG
Markus

Besserwessi
27.01.2013, 12:38
Für eine zuverlässige Finktion sollte schon der Mega328 alleine 2 der kleinen 100 nF Kondensatoren haben: je einer für die beiden GND/VCC (bzw. AGND/AVCC) Paare. Der Kondensatorwert ist nicht kritisch, so etwa 10 nF - 1 µF sollten gehen.

2 der IR LEDs könnte man ggf. auch noch in Reihe schalten, das gibt dann mit dem gleichen Strom mehr Licht. Der Strom wird vermutlich durch den Transistor 2N3904 begrenzt, z.B. durch den Basisstrom, und gar nicht 1 A erreichen. Für 1 A ist der Transistor einfach zu klein, da wäre so etwas wie BC635 angebracht, bzw. für 500 mA ein BC338. Gegen die Störungen sollte man die Versorgung für die LEDs noch einmal extra Puffern und per Widerstand/Induktivität entkoppeln. Geeignet wäre da z.B. mit ein 100 µF low ESR Elko und einem 1 µF Keramikkondensator (gibt als SMD Form, lässt sich aber noch gut löten), und dann Ein Widerstand von z.B. 10 Ohm oder eine Induktivität, die auch ruhig etwas Widerstand habe darf. Die Entkopplung ist nicht nur für eine zuverlässige Funktion von Vorteil, sondern hilft auch Funkstörungen zu reduzieren.

Die Störungen bei mehreren Einheiten könnten über die zufällig gleichzeitige Messung, oder auch über die Versorgung kommen.

Jannai
27.01.2013, 13:10
Wow, danke für die schnellen Antworten!

@Bumbum:
ja, die Leitungen sind etwas dünn, das stimmt. Durch den Pulsstrom ist die Gesammtleistung aber trotzdem sehr gering, die Litzen an sich sind also nicht gefärdet. Die Verluste waren mir in diesem Fall eher egal, schließlich ist das ganze Projekt an sich ja schon eine Form von Dekadenz ;-)
Warum habe ich mich für die dünnen Litzen entschieden? Es gab sie bei Ebay in schon zugeschnittener, abisolierter und verzinnter Form, 1000 Stück für 11€. D.h. ich habe mir diese Fusselarbeit genau 2 x 5 x 60 = 600 mal erspart...
Das mit den getrennten Leitungen ist eine gute Idee. Generell wäre natürlich eine Lösung, bei der ich einfach nur einen Kondensator einlöte angenehmer, denn nachdem die Einzelmodule so tadellos funktionierten habe ich die 10 µC-Sockel schon fertiggelötet, jetzt noch groß etwas zu ändern geht natürlich, ist aber eher zeitaufwändig.
Sollte markusjs Vorschlag mit den Kondensatoren nicht funktionieren werde ich es aber sofort ausprobieren!

@markusj:
Du meinst je 1000µF an die Spannungsversorgung der Leds pro Modul, richtig? Spielt es eine Rolle wenn bei den Kondensatoren ein deutlich höherer Spannungswert (25V, mein System: 5V) angegeben ist oder beschreibt das nur das maximal zulässige?

So wie ich dich verstehe meinst du, dass Pixel X z.B. gerade die Dunkelhelligkeit misst, während Pixel Y die IR-Leds leuchten lässt und Pixel X dadurch einen verfälschten Wert einliest? Nun ja, generell besteht das Problem. Wenn man mit einer Kamera (die IR nicht herausfiltert) bei Dunkelheit von oben auf das Plexi sieht, dann erkennt man deutlich die einzelnen IR-Lichtkegel. Diese haben bei einem Abstand zwischen Plexi und IR-Leds von 80mm immer noch 2-3 cm Distanz zueinander, falls das die Messung tatsächlich beinträchtigt dann nur für unmittelbar benachbarte Pixel.
Wenn man jetzt davon ausgeht, dass das z.B. bei jeder 10. Messung eines Pixels deutlich passiert, dann wird dieser Effekt ohne Probleme in der Fade-Funktion (Ende des Codes) mit dem Fadefaktor 100 untergebuttert und fällt nicht mehr ins Gewicht.

@Besserwessi:
Die Schaltung mit Leds und Transistor (2N3904 stimmt) ist etwas suboptimal und weit weg von dem eigentlich möglichen, da hast du absolut Recht. Allerdings funktioniert es in der jetzigen Form zufriedenstellend, und fertiggelötet sind die Pixel auch schon. Bei eventuellen Folgeprojekten werde ich deinen Rat beherzigen!
Der zusätzliche 100nF-Kondensator an AGND und AVCC ist notiert. Dem in Post#1 verlinkten stand-alone-tutorial folgend habe ich AVCC offen gelassen, der Funktion der einzelnen Module tat das keinen Abbruch. Sollte ich auch dort die 5V anlegen und den Kondensator einlöten?

Dieses Entkoppeln ist mir neu. Die Controller-Platine habe ich mit einer Streifenraster-Platine realisiert. 5V, GND und Reset laufen von links nach rechts durch, Verbindungen gehen zum Controller und zu den einzelnen Pixeln, ich habe also eigentlich nur einen "Spannungstopf" von dem aus alles abzweigt. Soll nun der Controller vom Rest durch die Induktivität/Widerstand entkoppelt werden oder die Led-Versorgung? Wenn egal wäre es für den Controller einfacher umzusetzen. Einen 100µF Elko und einen 1µF Keramikkondensator an die Led-Verorgung, verstanden.


Ich nehme mal an der Wert vonn 100µF (Besserwessi) für den Elko an den Leds ist besser als 1000µF (Markus), weil die Transistoren eh nicht so viel Strom wie oben geschätzt durchlassen? Tut es weh wenn ich einfach 1000µF nehme? (Preis annähernd gleich)

Eine Dokumentation werde ich sollte ich Zeit haben machen sobald das Projekt fertig ist. Allerdings ist das ja nicht ganz allein mein Werk, eigentlich habe ich nur die in Post #1 angegebenen Instructables zusammengeführt und auf Kosteneffizienz getrimmt.


Edit #1: dass das lustige Verhalten der zusammengeschalteten Module daher kommt, dass die Pixel einzelner Module schon bei der Initialisierung interferieren und somit den fehlerhaften Wert von "diff0" sorgt kann ausgeschlossen werden, ich habe Schüsseln über einzelne Pixel gestülpt und sie somit optisch isoliert. Keine Veränderung

Edit #2: Ich habe mir das Layout der Controller-Platine nochmal genauer angesehen. Es wäre recht aufwändig und vor allem unübersichtlich dort diese Entkoppelung nachträglich einzulöten. Ich möchte deshalb auf den Vorschlag von Bumbum wieder mit in die Diskussion einbringen. Wie müsste ich die Entkopplung auslegen, wenn ich sie für die beiden Stränge der Versorgung ausführe? Ist eine doppelte Ausführung von GND überhaupt notwändig? Die Kondensatoren an den Leds lieber zentral für alle Module oder auf jeder einzelnen Platine?

markusj
27.01.2013, 14:11
@markusj:
Du meinst je 1000µF an die Spannungsversorgung der Leds pro Modul, richtig? Spielt es eine Rolle wenn bei den Kondensatoren ein deutlich höherer Spannungswert (25V, mein System: 5V) angegeben ist oder beschreibt das nur das maximal zulässige?
Ja, korrekt. Je Modul ein Kondensator, dann werden die Lastspitzen schon dort geglättet und pflanzen sich nicht durch die ganze Versorgungsleitung fort. Die Angegebene Spannung bei Kondensatoren ist die höchste zulässige Spannung, du kannst jederzeit kleinere Spannungswerte verwenden.

mfG
Markus

Bumbum
27.01.2013, 14:12
Hallo Jannai,

die Verluste der "Wärme" die du meinst sind dabei auch relativ egal. Das Problem ist,w enn die Spannung auch nur für 1ms (was beim Einschalten deiner 1A IR-Leds in Verbindung mit den dünnen Litzen schon leicht passieren kann) zu stark einbricht resetet der Controller oder macht andere ungewollte Dinge. Dafür baut man auch die 100nF direkt an den Controller, aber auch die können das Problem nur begrenzt überbrücken.
Also entweder dickere Leitungen, dickere Elkos oder die Atmels sauber getrennt versorgen. (Zumindest wenn du eine gegenseitige beeinflußung ausschließt, wie du bereits geschrieben hast)

Um eine Beeinfußung beim Start auszuschließen kannst du auch in jeden Controller eine andere Wartezeit beim Start einprogrammieren, z.B. in 100ms Abständen. So ist sichergestellt das jedes Modul sauber hochfährt.

Hast du ein Oszi und kannst die Spannung am Atmel mal darstellen?

Viele Grüße
Andreas

Besserwessi
27.01.2013, 14:49
Der Elko zum Puffern des Stromes für die LEDs kann auch größer sein - 1000 µF sind auch OK, es sollten aber low ESR Elkos sein, damit sie auch den Strom liefern können.

Den AVCC Pin sollte man wirklich an die 5 V anschließen, selbst wenn man die 2.ten 100 nF einsparen will. Eine Entkopplung mit Induktivität braucht man für AVCC nicht unbedingt - das geht meist auch ohne. Da die Pins nebeneinander liegen passt der Kondensator auch auf dem Streifenraster noch nachträglich hin, ggf. auch als SMD (Größe 0805 oder 0603).

Bei AREF kann auch noch ein 100 nF Kondessator nach GND ran, muss aber nicht unbedingt - das verringert ggf. die Störungen für den ADC etwas.


Die Entkopplung per Widerstand/Induktivität von LED Schaltung und µC ist in gewisser Weise eine Alternative zu getrennten Leitungen. Die extra Leitungen haben ja auch einen Widerstand und Induktivität.

Jannai
27.01.2013, 18:03
So, ich bin mal wieder überwältigt wie schnell und umfassend hier im Forum geholfen wird...
Nein, ein Oszilloskop habe ich leider nicht.
Ah, ich war bei eben diesen Wärmeverlusten ;-)

Ich werde versuchen den Aufwand möglichst klein zu halten und wie folgt vorgehen. Falls eine Lösung eintritt wird abgebrochen:
1. Die großen Elkos sind bestellt, sie werden auf jeden Fall eingebracht.
2. Eine individuelle Startzeit wird einprogrammiert wie Andreas es vorgeschlagen hat.
3. Eine seperate Spannungsversorgung (so ein 3€ Step Down-Dings) für die Controller, GND gemeinsam.
4. Redesign der Controller-Platinen mit allem was hier (v.a. von Besserwessi) diesbezüglich vorgeschlagen wurde

Leider rutscht das Projekt gerade sehr in die Klausurenphase hinein, weshalb ich nicht weiß ob ich zeitnah weiterbasteln kann. Ich tagge diesen Tread mal als "erledigt", wenn sich eine neue Fragestellung ergibt, ich deutlich weiterkomme oder das Projekt abschließe werde ich hier natürlich darüber berichten.

Vielen Dank für die Unterstützung,
Jannai


Edit: ein um 75 Millisekunden (4-7 mal Setup-Runtime) versetzter Startzeitpunkt bringt keine Veränderung.