INT0 und Timer2 zur Dimmersteuerung

Cassio

Aktives Mitglied
29. Okt. 2008
4.027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo zusammen!

Ich möchte mal fragen, ob mir jemand bei meinem "Dimmerproblem" in BASCOM helfen kann.

Scheinbar bekomme ich das Timing nicht geregelt. :mad:
Eine Nullspannungserkennung habe ich eingebaut und diese steuert den INT0.
Das klappt auch hervorragend und soll als Startsignal für den Timer2 sein.

Da die Netzspannung 50Hz besitzt, dauert logischerweise eine Sinuswelle 20ms.

Da man aber beim Phasenanschnitt beide Halbwellen gleichmäßig anschneiden muss, benötige ich also eine Timereinstellung für innerhalb 10ms.

Ich hatte mir gedacht, den Timer2 als PWM zu benuten und das dieser OCR2 dann den Optotriac zündet.

Hardwaretechnisch ist schon alles aufgebaut und fertig gestellt. :eek:
Das kommt daher, dass ich eigentlich die Leuchte (Glühlampen) nur schalten wollte........ mir dann aber doch überlegt habe, einen Dimmer zu verwenden.

Meine Frage ist nun:
Wie bekomme ich Timer2 so eingestellt, dass er genau im geforderten Zeitfenster vom 10ms arbeitet?

Ich habe zwar schon einiges ausprobiert, aber letztlich flackern die Glühlampen immer noch. :rolleyes:

Scheinbar benötige ich mal einen Denkanstoß, sonst drehe ich mich hier nur im Kreis.

Mein Ansatz war eigentlich immer:
256bit x (64 Prescaler / 1000000 Hz) = 16,384ms
Dadurch benötige ich also nur 157 bit für 10ms. OK, das ist etwas länger als die "echten" 156,25.... Da aber der Timer2 durch den INT0 wieder neu gestartet wird, dürfte es doch keine Probleme geben. Schließlich wird die komplette Halbwelle durchgeschaltet und die Lampen haben maximale Helligkeit.

Erwähnen muss ich noch, dass die Änderung des "Dimmwertes" mittels einer RC5-Fernbedienung vorgenommen wird.
Programmiertechnisch ist das kein Problem, allerdings bremst der TSOP mein Programm doch um einige Zeit aus.... und das muss mit berücksichtigt werden.

Solange ich mit "On INT0" für die Lastansteuerung arbeite, scheint der Empfang das Timing nicht zu stören.


Ich stelle mal zwei kleine Bilder von der Messung mit meinem Scope mit ein.
Das eine Bild zeigt das Signal am INT0 .
Beim anderen Bild habe ich mal einen Ausgangsport durch den INT0 togglen lassen.


Hat vielleicht jemand eine Idee, wie ich den Timer2 einrichte..... ohne das die Lampe wieder flackert?

Grüße,
Cassio !

PS. Ach so, es muss leider der Timer2 des ATMega8 sein, weil der Timer1 bereits als PWM verwendet wird.
 

Anhänge

  • Forum-Int0.gif
    Forum-Int0.gif
    4,7 KB · Aufrufe: 65
  • Forum-Int0-Output.gif
    Forum-Int0-Output.gif
    4,8 KB · Aufrufe: 54
Hei Cassio,

habe mich für meine Steuerung auch mit dem Thema Dimmer beschäftigt.
Hast Du schon mal in den Thread

http://www.avr-praxis.de/forum/showthread.php?t=53

hier im Forum reingeschaut? Ich habe hier eine Lösung vorgestellt, welche funktioniert und auch nicht flackert.

Wenn es Dir hilft so könnte ich Dir auch den Auszug aus meiner "Spezifikation" für die Wintergartensteuerung als PDF zur Verfügung stellen.
Ich habe nämlich alles was ich gemacht habe dokumentiert. Das Dokument hat aktuell 450 Seiten und ist 100 MByte groß aber den Teil zum Dimmer könnte ich Dir extrahieren. Vielleicht bringt das ja den geistigen Durchbruch!

Grüße,
Markus
 
Hallo Markus!

DU bist heute so spät noch auf?
Nun aber ab in die Falle mit dir! ;)

Danke, für den Hinweis zu deinem Thread.
Der Begriff Wintergartensteuerung kommt mir bekannt vor.... Allerdings habe ich dabei wohl übersehen, dass du dort schon mal etwas zum Thema Dimmen geschrieben hast. Wo habe ich nur meine Augen! :rolleyes:

OK, dann werde ich mir das mal ansehen und schauen, ob meine Vorbereitungen gar nicht so falsch gewesen sind. ;)


Die Sache mit der 450 Seiten Doku lassen wir erst mal......
Sollte ich hier aber gar nicht weiter kommen, nehme ich auch die. :cool:


Schöne Grüße,
Cassio
 
Guten Morgen, Markus!

Ich habe gestern Abend und heute Morgen mal auf die Schnelle in deinen BASCOM-Code geschaut....

Deine Aliasnamen sind für mich noch etwas gewöhnungsbedürftig und ich scrolle noch ziemlich oft hoch und runter, aber das Prinzip verstehe ich schon.

Wenn ich das richtig verstanden habe, dann bekommst du bei jeder Halbwelle ein Signal auf INT0.
Meine Erfassung meldet nur den Start einer ganzen Sinuswelle.... wie oben im Bild auch zu sehen ist.
Die negative Halbwelle wird ausgelassen. Ich denke aber, dass es auch so möglich sein müsste..... wenn das Timing stimmt. ;)

Ich habe mal eben einen Schaltplan gezeichnet, damit du den Aufbau meiner Schaltung einfacher nachvollziehen kannst. Ich hänge ihn unten einfach mal mit an....


Wenn ich mir deinen Code so ansehe, dann war ich mit dem Timer ja gar nicht auf dem Holzweg. Da ich aber weder mit PWM noch mit Schaltpunkten ein flackerfreies Licht erzeugen konnte, habe immer wieder beides ausprobiert.
Einen Fehler habe ich bei mir aber gestern Abend noch gefunden.... Ich hatte die falsche INT0 Einstellung. Bei mir muss natürlich Falling stehen, sonst schalte ich zur negativen Halbwelle ein.
Außerdem liegt der Knackpunkt wohl in meiner Phasenansteuerung..... Ich wollte die Phase bei Winkel 0 starten und dann z.B. bei Winkel 90 (also halbe Helligkeit) wieder ausschalten (Phasenabschnitt).
Wenn ich mich nicht getäuscht habe, machst du es genau anders herum.... Du startes erst z.B. bei Winkel 90 und lässt den Triac bei Winkel 180 sich selbst verlöschen...... dann startest du bei Winkel 270 und bei 360 löscht er sich dann wieder selbst. Ist das so richtig?

Dann muss ich nun mal schauen, wie ich das nun umsetze.
Neue Vorgaben für mich sind also:
Phasenanschnitt mit Timer2 realisieren (sprich variable Pause bis zum Zünden)
Zweiten Zündzeitpunkt realisieren, da der INT0 erst zum Start einer neuen Sinuswelle ein Signal liefert. (Hilft mir da vielleicht CHANGE beim INT0 ? *überleg*)


Grüße und einen stressfreien Tag,
Cassio !
 

Anhänge

  • Deckenlampe-sPlan1.jpg
    Deckenlampe-sPlan1.jpg
    89,3 KB · Aufrufe: 120
Hallo Cassio!

Außerdem liegt der Knackpunkt wohl in meiner Phasenansteuerung..... Ich wollte die Phase bei Winkel 0 starten und dann z.B. bei Winkel 90 (also halbe Helligkeit) wieder ausschalten (Phasenabschnitt).
Triacs löschen genauso wie Thyristoren nicht von alleine. So lange ein
Strom fließt bleiben sie durchgeschaltet - auch wenn der Steuerstrom schon
wieder weg ist. Du kannst also mit nem Triac nicht so ohne weiteres eine
Phasenabschnittssteuerung bauen.:eek:

Wenn ich mich nicht getäuscht habe, machst du es genau anders herum.... Du startes erst z.B. bei Winkel 90 und lässt den Triac bei Winkel 180 sich selbst verlöschen...... dann startest du bei Winkel 270 und bei 360 löscht er sich dann wieder selbst. Ist das so richtig?
Ich schätze mal, er macht das genau aus dem oben genannten Grund so ;)

Dann muss ich nun mal schauen, wie ich das nun umsetze.
Neue Vorgaben für mich sind also:
Phasenanschnitt mit Timer2 realisieren (sprich variable Pause bis zum Zünden)
Zweiten Zündzeitpunkt realisieren, da der INT0 erst zum Start einer neuen Sinuswelle ein Signal liefert. (Hilft mir da vielleicht CHANGE beim INT0 ? *überleg*)
Mach doch nen Brückengleichrichter vor deinen Optokoppler für die Nullstellenerkennung.
Dafür kannst Du dir dann die einzelne Diode sparen :D

Und noch ein Tip:
Such dir den richtigen Triac raus !!!! Ganz wichtig !!!!
Es gibt 2/3-Quadranten-Triacs und auch 4-Quadranten-Triacs. Das hat mit den
Polaritäten der Steuer- und Lastströme im 4-Quadranten-Diagramm zu tun.
Sieh dir mal die Datenblätter und die Diagramme an.

Ich hab mir da mal mächtig die Karten gelegt. Wenn Du nämlich einfach so nen
Triac ansteuerst und der Steuerstrom gerade nicht zum Laststrom paßt
(Polarität, Phasenlage, ...) dann kannst Du an der Last eventuell Gleichstromanteile
bekommen. Das mögen zB Halogentrafos oder ähnliches überhaupt nicht gerne.
Trafos sind bei Gleichstrom ziemlich niederohmig und kokeln dann gerne rum.

Für wirklich reine ohmsche Lasten (Glühbirne, Heizung, ...) ist das kein Problem.
Aber ich würde alleine aus Vorsorge schon 4-Quadranten-Triacs nehmen. Man
weiß nie, was man mal anschließt :D

Gruß
Dino
 
Hallo Dino!

Ja, das mit dem Triac und dem "weiter leitend bleiben" ist mir dabei auch aufgegangen.
Darum hatte ich wohl auch ständig Probleme mit den Zeiten.... und ich dachte, mein Timer2 ist falsch eingestellt. :rolleyes:


Mach doch nen Brückengleichrichter vor deinen Optokoppler für die Nullstellenerkennung.
Dafür kannst Du dir dann die einzelne Diode sparen

Scherzbold. ;)

Der Brückengleichrichter ist ja quasi vorhanden......
Nur auf einer anderen Platine und erst nach dem Trafo.

Natürlich ist ein Teil des Schaltplans nicht auf meinem eigenen Mist gewachsen...... Irgendwo hatte ich vor Monaten mal passende Schaltbilder gespeichert und auch das Datenblatt vom MOC3021 enthällt Infos zum Lastteil.
Man muss ja nicht immer das Rad komplett noch mal neu erfinden.;)

Der Last-Triac ist ein TIC206 bzw. TIC226.... muss mal schauen, welchen ich nun letztlich in diesem Modul verbaut habe.

Ich meine aber gelesen zu haben, dass der Triac auch mit gewickelten Trafos zurecht kommt.... allerdings müsste ich die Phasenverschiebung dann auch in meiner Software berücksichtigen..... und das Problem wird wohl schwieriger sein, als den richtigen Triac zu finden.
Obwohl..... da eine induktive Phasenverschiebung ja nur in der Theorie 90 Grad beträgt, könnte man ja den ersten Nulldurchgang "ignorieren" und erst beim zweiten den Optotriac zünden. *grübel*
Egal.... zur Zeit geht es erst mal nur um Glühobst. ;)


Dann werde ich mal schauen, dass ich heute noch Zeit finde und die ersten Programmänderungen schreiben und testen kann.

Danke dir, Dino!

Cassio !
 
Hi Cassio !

Scherzbold. ;)

Der Brückengleichrichter ist ja quasi vorhanden......
Nur auf einer anderen Platine und erst nach dem Trafo.
Wenn Du den hinter dem Trafo verwendest, dann hast Du nur Gleichspannung
am Optokoppler :D :D (Sieb-Elko läßt grüßen)
Dann hat man nur nen Nulldurchgang wenn man am Netzschalter knippst :D :D

Ich würde den ?? 4N20 ?? oben in deinem Schaltplan hinter dem Widerstand
über ne Brücke ansteuern. Können hinter dem Widerstand auch 1N4148 sein,
da die meißte Spannung ja am Widerstand abfällt und die LED vom Optokoppler
dann durch den dauernden Stromfluß die Spannung über der Brücke klein hält.
Das spart ne Menge Code-Zeilen und Kopfzerbrechen ;)

Außerdem hast du sonst evtl ein Problem bei der genauen Triggerung der 2ten
Halbwelle. Durch Rundungsfehler/Toleranzen kann es dir passieren, das du den
2ten Nulldurchgang nicht so genau triffst (Timer-Vorteiler, ... was auch immer).
Wenn man aber den Nulldurchgang direkt angeboten bekommt, ... warum nicht ?

Für den Eingriff muß man nur eine Leiterbahn trennen und die paar Bauteile
kann man flach unter die Platine braten ;)

Naja , wie auch immer ...
Denn mal fröhliches basteln ...
Gruß
Dino
 
Hallo Dino!

Das mit dem Elko hinter dem Brückengleichrichter ist schon klar..... Dafür baut man ihn doch schließlich ein. ;)
Ich habe allerdings den zwinkernden Smilie hinter dem Satz vergessen, so konntest du auch nicht merken, dass er nicht wirklich ernst gemeint war!

Aber ist das nicht ein Glättungskondensator und kein Siebkondensator? :p
Im Zweifel wird mich Markus schon berichtigen. ;)


So, nun aber mal zum Thema...
Ich habe es mal mit "Config INT0 = Change" probiert, aber ohne Erfolg.
Im Datenblatt vom ATMega8 meine ich zwar gelesen zu haben, dass ich den INT0 mit "low level", "falling", "rising" und "change" betreiben kann...... aber wenn ich "change" benutze passiert gar nichts mehr. :mad:

Danach kam mir die Idee, die Flankenerkennung nach einem Interrupt zu wechseln....... aber das klappt leider auch nicht. :mad:

Ich denke mal, dass der einfachste Weg wirklich sein wird, ein paar Dioden zusätzlich einzubauen. Hätte ich vorher drüber nachgedacht, wären mir wohl einige flackernde Momente ersparrt geblieben. ;)

Die Sache mit dem Timing ist mir auch zu ungenau.... Zum Einen benutze ich noch nicht einmal einen externen Quarz (und der Interne ist ja nicht gerade genau) und zum Anderen halte ich eine Synchronisierung durch den Nulldurchgang schon für erforderlich.

Dumm ist nur, dass alle Platinen schon fertig auf- und eingebaut sind. :eek:
Na, mal sehen, wie ich die kleinen Dioden noch dazwischen bekomme. Vielleicht mit einer "Huckepack"-Lösung.

Mit ebenfalls 56k als Rv`s müssten es die einfachen 1N4148 doch wohl tun.
Die passen da bestimmt noch irgendwie zwischen.
Ach so, der Optokoppler ist ein 4N25, weil davon hier noch einige rum liegen. ;) Die Isoliespannung hatten die im Datenblatt mit etwas über 1kV angegeben. Sicher ist man mit einem 4N33 (Isolierspannung über 3kV) noch besser bedient..... aber mir war in dem Augenblick das Hemd näher als die Hose. ;)


Wünsche dann weiterhin erst mal einen schönen Tag. :ciao:

Cassio
 
Kuzes Update bzw., kurzer Kommentar noch von meiner Seite.

Die Verwendung eines Brückgleichrichters hat Dino ja schon empfohlen und angesprochen. Mit dem Brückgleichrichter ist man in der Lage JEDEN Nulldurchgang, unabhängig ob positive oder negative Halbwelle zu detektieren.

Das einzige was man dann noch tun muss ist nach Nulldurchgangserkennung zum gewünschten Zeitpunkt den Triac "zünden".
Zu beachten ist, dass der Triac nicht direkt im Nulldurchgang oder kurz danach gezündet werden kann.

Triacs löschen genauso wie Thyristoren nicht von alleine.

Verstehe ich nicht. Warum?
Die Zündung des verwendeten Triacs bezieht sich nur auf die aktuelle Halbwelle. Ab dem nächsten Nulldurchgang sperrt der triac von selbst und muss erneut gezündet werden.

Also, ich stelle die Hypothese in den Raum, dass mein Triac von selbst löscht. Ich mache ja auch nix anderes als ihn nach erkennung der nächsten Halbwelle wieder erneut zu zünden.

Grüße,
Markus
 
Hallo Markus!

Danke erst einmal, für deinen Kommentar. Immer wieder gern!

Ich habe natürlich schon meinen Aufbauplan geändert und planerisch ist der Brückengleichrichter auch schon fix und fertig eingebaut. ;)
Die Detektion aller Nulldurchgänge ist damit wesentlich einfacher und das Timing sicherer.

Das ich die Zündzeitpunkte noch festlegen muss, ist klar. Allerdings werde ich erst mal bei meinem +/- 3 (bit) Schritten bleiben und kann ja ggf. später noch die Zündzeitpunktstabelle von dir übernehmen.

Jetzt muss ich nur noch etwas Zeit finden, damit ich die Schaltung umbauen und das Programm ändern kann.
Letztlich dürften dann meine Probleme mit der Flackerei wohl ein Ende haben!



Also, ich stelle die Hypothese in den Raum, dass mein Triac von selbst löscht.

Nun ja.... streng genommen hat Dino ja recht.
Wenn du deinen Triac zündest und die Netzspannung nicht unter Null kommt, löscht er sich auch nicht wieder von selbst. Sprich, ohne das Zutun von Außen bleibt er immer eingeschaltet...... aber wem schreibe ich das? ;)
Ich denke mal, dass Dino es so gemeint hat.
Allerdings nutzt man einen Triac ja nur, wenn man auch Wechselspannungen steuern möchte..... und da gibt es nun mal meistens einen Nulldurchgang. ;)



Ach Markus, was mir gerade noch einfällt....
In deinem BASCOM-Code für den Dimmer zündest du den Triac und schaltest die Spannung am Gate nach 20µs wieder ab. Ok, wenn der Triac gezündet hat, bleibt er ja bis zum nächsten Nulldurchgang leitend..... Ich habe da eher ein Problem mit den 20µs. Irgendwie stehe ich mit den µs sowieso auf Kriegsfuß!
Ich habe damit an anderer Stelle mal experimentiert, aber sie funktionieren nicht. :confused:
Wenn ich z.B. schreibe:
Toggle Port.X
Waitus 1500

passiert leider nichts. Oder ist die Zahl zu hoch gegriffen?


Wünsche noch einen angenehmen Abend!

Cassio !
 
Hi Cassio,

Thema waitus bei BASCOM:

Die Konstante die Du übergeben kannst ist auf jeden Fall ein Word und kann damt von 1 bis 65535 gehen. Die Grüße 1500 dürfte kein Probelm darstellen. Ich hoffe Du hast keine Variable dazu verwendet denn Variablen mag waitus (z.B. wait temp) nicht. Es muss also immer eine Konstante sein.
Eine Rolle spielt natürlich auch noch die von Dir verwendete Geschwindigkeit des Quarz für den Mega (egal ob intern oder extern). Eine Folge davon wäre, dass Du kleine µs möchtest er aber nur große Wartezeiten kann weil Du einfach nicht weiter runter kommst.

1500 µs sind immer noch oder leider nur 1,5 ms. Abhängig davon was Du toggeln wolltest ist das nicht viel. Wenn Du eine LED toggeln wolltest so bleibt diese defintiv an. Du siehst nur im Oszi das sich was tut.

Vielleicht verräts Du mir noch was Du am Port toggeln wolltest ud dann kann ich mehr dazu sagen. Prinzipiell, wenn der Port richtig konfiguriert und richtig beschaltet ist sollte auch Toggle über 1500 µs funktionieren. Unter den oben genannten Einschränkungen halt.

Grüße,
Markus
 
Hallo Markus!

Nein, ich glaube, wollte bei den Versuchen nichts reales konzipieren.
Irgendwann hatte ich mal eine Zeit von 3,5ms (oder so ähnlich) errechnet und ich dachte mir: Nimm einfach 3500µs und fertig!
Leider tat sich am Port gar nichts! Ach so, ist logisch das ich dies immer mit einem Scope kontrolliere. ;)

So habe ich mal mit verschiedenen Werten rumgespielt, aber es tat sich nichts. Warum auch immer....

Ob es nun eine Konstante war oder ich eine Variable benutzt habe, kann ich leider nicht mehr sagen. Kann aber gut sein, dass ich eine Variable benutzen wollte.


Ach ja, jetzt fällt es mir wieder ein...... Es ging um das Multiplexen meiner 8x8 LED-Matrix. Es sollte jede Spalte nur 2,5ms eingeschaltet bleiben.... so komme ich auf 10ms für alle LED-Spalten. Leider funktionierte es mit 2500µs dann nicht mehr.... aber der Wert wurde auch durch eine Variable zugewiesen.
Nun ja..... letztlich ging es ja auch mit 3ms pro Spalte flackerfrei und die LEDs sind schön hell. ;)

Aber warum gibt es denn bei den µs Probleme, wenn der Wert über eine Variable zugewiesen werden soll?
Hm, bei dieser Anwendung kann ich aber auch eine Konstante verwenden.

Gruß,
Cassio !
 
Probleme bei der Zuweisung über Variable entsteht aus folgendem Grund:

Wartezeiten wie waitus oder waitms macht der Compiler durch Schleifen die fest zur Compilezeit aufgebaut / erzeugt werden. Das ist keine dynamik mit drin und aus diesem Grund kannst Du einen waitus nicht zur Laufzeit mit Variablen befüllen weil der Compiler so die Warteschleifenkonstrukte nicht erzeugen kann.

Grüße,
Markus
 
Hallo Markus!

Danke, für die Ausführung zu den Variablen und den µs.
Ich werde es im Hinterkopf behalten und demnächst mal eine Konstante verwenden.



Nun wieder zurück zu meinem Dimmer....
Operation Brückengleichrichter ist erfolgreich durchgeführt worden! :D

Auf dem angehängten Bild kannst du auch das Signal am INT0 sehen. Nun bekomme ich auch alle 10ms ein Signal geliefert!

Ich habe auch die "Schaltzeiten" mit meinem 2 Kanal-Scope optisch überprüft.
Wenn ich die Signale am INT0 mit der Wechselspannung gleichzeitg betrachte, dann kann ich sehen, dass es einen gaaaanz kleinen Versatz zwischen Nulldurchgang und der Spitze des INT0 Signals gibt.
Leider ist das 2-Kanal-Scope kein digitales und darum kann ich von der Messung auch kein Bild mit einstellen.
Die genaue Zeit konnte ich nicht ablesen....
Sagen wir es mal so: Leider war der Messaufbau dafür nicht optimal. ;)

Es kommt aber erst der Nulldurchgang und dann die Spitze des INT0 Signals.
Momentan gehe ich aber davon aus, dass es dadurch keine Probleme gibt. Du hattest ja schon geschrieben, dass ich sowieso nicht gleich nach dem Nulldurchgang zünden kann. Was bedeutet denn gleich? In etwa 20µs? ;)


So, dann werde ich mich mal an die Software machen.....
Hier sollten wohl nur kleinere Änderungen notwendig sein.

Glück auf! ;)
Cassio !
 

Anhänge

  • Forum-int0-100hz.gif
    Forum-int0-100hz.gif
    5,5 KB · Aufrufe: 37
Uffff, Casio, jetzt verlangst Du eingemachtes von mir.

Lass mich mal überlegen. Hmmm, ist schon zwei Jahre her als ich mich mit dem Thema Dimmer eingehend beschäftigt habe. Hatte damals alles "Wissen" vom Studium her noch aus meinem Hirn ausgraben müssen.

Also, wenn ich micht richtig erinnern kann waren die Zusammenhänge die folgenden:

- Triacs sollte man nur mit kurzen Zündimpulsen zünden. Bei NULL Strom im Nulldurchgang schalten sie wieder ab (Achtung; nicht Spannungsnulldurchgang) . Soweit ich noch weis kann es hier je nach Last Probleme mit der Nulldurchgangserkennung die auf Basis der Spannung arbeitet kommen.
- Dies ist wohl mit ein Grund warum leicht "zeitverzögert" gezündet werden soll.
- Soweit ich weiß wird zum korrekten Zünden des Triac auch ein bestimmter (min.) Haltestrom benötigt welche im Bereich des Nullpunkts nicht gegeben ist. Hier werde ich aber unsicher und müsste nochmal genauer nachsehen.
- Die Dauer des Zündimpulses richtet sich nach den Angaben aus dem Datenblatt des jeweils verwendeten Triacs. Ich Habe auch schon Werte mit 80µs gesehen. In der Regel probiere ich so etwas empirisch aus.

So, hoffe ich habe kein Mist erzählt denn mein Studium ist schon recht lange her und hatten den Schwerpunkt eher in der digitalen Welt und der Programmierung.

Es gibt hier im Forum sicher Leute die uns ganz genau Erklären können worauf man beim Triac achten muss und wie die Zusammenhänge sind.

Grüße,
Markus

PS: Zu Deiner Frage, ich würde sagen dass ein kleines Delay zwischen Nulldurchgang und Interrupt völlig OK ist und vernachlässigt werden kann.
 
Hi Markus!

Ja ja, das waren früher noch Zeiten.... Als wir unser Hirn mit jeder Menge Informationen bombadiert haben....
Wenn man bloß gleich die passende Schublade im Kopf wieder finden würde, in die wir damals die passenden Infos verpackt haben. ;)


Was das Dimmen betrifft:
Ich gebe hier solangsam auf! :vroam:

Theoretisch habe ich alles fertig.... nur in der Praxis will er nun nicht! ;)

Alsooo...
Ich habe ein perfektes 10ms Signal am INT0.
Damit starte ich den Timer2 und lade den zugehörigen Zeitwert zum Overflow (99-255) in den Timer2.
Beim OVFL des Timer2 springe ich in eine andere Sub, die den Timer2 stoppt und den Port meines Triacs auf High setzt..... und nach 1ms wieder auf Low. (OK, dass ist noch ein wenig lang... aber du kennst ja meine Angst vor den µs. ;) )
Die Timerwerte müssten auch stimmen....
Bei 1MHz internen Quarz und einem Prescale von 64, benötige 156,25 bit für 10ms.
Wenn ich den Timer2 mit dem Wert von 150bit lade, benötigt er 105bit bis zum OVFL ( also 6,72ms) und würde dann den Triac zünden.... der die Lampe für die verbleibenden 3,28ms in dieser Halbwelle einschaltet. Die Lampe würde also sehr schwach leuchten.

Die "Extremwerte" sind 99 und 255.... ganz dunkel, bis ganz hell.


Nun kommt die Praxis..... (mit zwei Problemen):
Problem 1:
Egal welchen Wert ich zum Start vorgebe (99 oder 255), die Lampe leuchtet nur mit 50% Helligkeit... weil ja auch jede Halbwelle nur 50% aktiv ist.
Fragt sich nur: WARUM? :confused:

Problem2:
Meine Fernbedienung reagiert nicht mehr! :mad:
Jetzt ist genau das eingetreten, was ich zu Beginn befürchtet habe!
Ich stelle mir vor, das "Abfragen" des TSOP dauert einfach viiiiel zu lange (geschätzte 158ms). Da er beim Einlesen der Bits vom TSOP einige Male vom INT0 unterbrochen wird, werden nicht alle bits ordnungsgemäß empfangen und der RC5-Code stimmt dann natürlich nicht mehr.
Sollte meine "Zeitrechnung" für das Übermitteln des RC5-Codes stimmen (über 150ms), dann wird er locker 15 mal unterbrochen.... und der Code ist fehlerhaft.
Außerdem schlägt meine 1ms Pause für den Triac auch zubuche.

Ich glaube, ich lasse es mit dem dimmen und programmiere die Schaltfunktion wieder.
So langsam bekomme ich Ärger mit meiner Tochter. Schließlich geht es um ihre neue Deckenlampe. ;)


Momentan weiß ich keinen Rat....
Auf alle Fälle ist die Fernbedienung wichtiger, als die Dimmfunktion! :cool:

Fall jemand noch eine Idee hat..... Ich bin für neue Anregungen offen!

Grüße,
Cassio !
 
Hallo !

Nun habe ich noch ein wenig experimentiert und kann daher sagen...

Die oben aufgestellte Theorie, mit dem zerhackten RC5-Signal, kann nicht stimmen!
Mehr dazu gleich.....

Inzwischen startet mein Dimmer mit dem Helligkeitswert, den ich ihm zum starten vorgebe. :D
Was ihn letztlich dazu bewogen hat, kann ich nicht mehr sagen. Eigentlich habe ich keine wirklichen Änderen im Programmablauf durchgeführt.
Letztlich habe ich nur den "Helligkeitswert" dem Timer2 direkt zugewiesen und nicht den Befehl "Load" in den Timer geladen (natürlich mit den anderen Werten!)

Damit wäre das "Problem Nr. 1" von oben beseitigt. ;)


Nun zum RC5-Signal....
Wenn ich die Lampe beim Start ausgedimmt lasse, DANN kann ich die Fernbedienung auch benutzen!
Meine andere Funktion (LEDs für die Nacht automatisch dimmen und wechseln) kann ich ein- und wieder ausschalten.
Von daher wäre die o.g. Theorie wiederlegt, dass das RC5-Signal zerstückelt ankommt. Schließlich arbeitet der INT0 ja trotzdem alle 10ms.... auch wenn die Lampe aus ist!

Sobald ich aber die Lampe einschalte bzw. "andimme", und sei der Wert noch so klein, ist die Funktion der Fernbedienung gestört.

Es scheint also eher am Timer2 zu liegen, oder? :confused:


Laut BASCOM benutzt der Befehl GETRC5 standartmäßig den Timer0. Dieser kann auch optional auf Timer2 geändert werden.
Ich habe daher in der Config noch einmal speziell den Timer 0 mit angegeben.
Aber auch das hat keine Änderung in der Funktion gebracht.

Die Sache bleibt also zur Zeit ein Rätsel.....



Eine andere Frage hätte ich da noch an die Fortgeschrittenen bzw. Profis. Hallo Markus! :D

Ich habe versucht mir diese (doch sehr wichtigen) Angaben von :

$hwstack = 32
$swstack = 10
$framesize = 40

anzulesen. Leider fehlt mir dafür wohl einiges an Grundwissen, um das zu verstehen und richtig einzustellen. :mad:

Nicht das in den Werten der Fehler zu suchen ist. :eek:

Wenn ich mein Programm kompiliere, dann taucht in den Results folgendes auf:
Stack start : 45F hex
Stack size : 20 hex
S-Stacksize : A hex
S-Stackstart : 440 hex
Framesize : 28 hex
Framestart : 417 hex
Space left : 937 dec

Kann ich vielleicht anhand der Werte meine Einstellungen ableiten?


Nun gut, dann werde ich mal weiter grübeln..... ;)

Grüße,
Cassio !
 
Hi!

Jetzt hab ich es! :D


Da mich meine Wartezeit von 1ms zum wieder ausschalten des "Zündports" immer noch ärgerte, habe ich mich mal an die µs gewagt....
Leider ohne Erfolg.
Keine Reaktion auf Werte unter 1000µs !


Dann habe ich folgendes geändert:
Beim OVFL des Timer2 zünde ich den Triac....
und erst beim nächten Nulldurchgang (mittels INT0) wird die Gatespannung als erstes wieder abgeschaltet.
Code:
' ################################################
' Beim Auslösen des INT0 wird die Verzögerung (Phasenanschnitt) gestartet
Timer_start:
Portb.3 = 0          ' Triac-Spannung ausschalten !
Start Timer2
Timer2 = Licht
Return

' ################################################
' Zünden  des Triacs
Triac_zuenden:
Stop Timer2
Portb.3 = 1         ' Triac-Spannung einschalten (zuenden) !
Return

Nun funktioniert der Dimmer und auch die Fernbedienung. :)


Jetzt muss ich nur noch dringend wissen......
Ist das für den Traic schadhaft, wenn er sooooo lange eine "Zündspannung" bekommt? :confused:
Letztlich benötigt der Triac ja nur einen Zündimpuls..... was aber nun nicht zwangsläufig bedeutet, dass er nicht auch die ganze Zeit eine Zündspannung bekommen darf, oder?
Kann mir da mal jemand aus dem Fachbereich weiterhelfen?

Danke, sagt ein (zur Zeit) fröhlicher
Cassio :ciao:
 
Triac-Eigenschaften

Hallo,
bei meinen Versuchsaufbauten konnte ich folgendes feststellen.
Der Triac wird ja meistens mit vorgeschaltetem DIAC gezündet.
Dieser triggert meistens bei ca. 33 Volt.
Also in einer solchen Schaltung muß dann nur darauf geachtet werden, daß der Strom im Zündkreis auf einige Milliampere begrenzt bleibt.
Er kann dann auch dauernd mit DC und mit der richtigen Polarität zu A1 bzw. A2 angesteuert werden, der Triac zündet dann automatisch über den DIAC und verlöscht selbständig im Bereiche unter der Haltespannung wieder.
Bei "normalen" Dimmern ist ja nur ein phasenverschobener Anteil der Netzspannung ständig am DIAC vorhanden, also kein eigentlicher Impuls.
Wird ohne DIAC gefahren, kann das nur bei Überschreiten des maximalen Steuerstromes und "falscher" Polarität zu Problemen führen. Also untige Schaltung ohne DIAC ist zu vermeiden. Dann brauche ich aber mindestens die besagten 33 Volt zum Triggern, was einen Direktanschluß an TTL-Pegel (MCU-Ausgangspegel 5 Volt) ausschließt.

Soweit meine Experimente.

Zu dem Thema gibt es auch gute Weblinks:
Zum Beispiel:

http://www.elektronik-kompendium.de/sites/bau/0411081.htm

Also, zur Sicherheit in die Gate-Zuleitung einen passenden Vorwiderstand einlöten, der bei Leistungstriacs den Steuerstrom sicher auf ca. 50 mA begrenzt. Das kann von Type zu Type aber noch variieren.
Prinzipiell ist gegen eine DC-Ansteuerung im "I. und III Quadranten" also nichts einzuwenden, wenn auch nicht gerade elegant. Die Triacs haben ja die "Zündthyristoren" zum Durchschalten bei beiden Halbwellen des Wechselstroms schon mit eingebaut. Rein persönlich favorisiere ich die Direktansteuerung eben nur über die Opto-DIACS Type MOC 3040 (Nulldurchgangssteuerung integriert), wo Nullspannungsansteuerung nicht gewünscht, halt mit dem DIAC davor.

Der Kernsatz im "Kompendium" ist nun:
Zitat:"...Der Gateanschluß verliert nach Zünden seine Wirksamkeit..."
Im Klartext, es ist gleich, wie lange der Triggereingang gegenüber A1 nun Spannung führt.
Ja, man geht sogar hin, und bombardiert das Gate sogar manchmal regelrecht mit einer Salve von Triggerimpulsen, um bei Nullspannungsansteuerung induktiver Lasten schlußendlich ein Zünden zu bewirken, denn der erste kurze Impuls führt nicht sofort zum Erfolg, da die Phasenverschiebung, bedingt durch die Induktivität, den Triac nicht sogleich in den Haltestrombereich fährt.

Gruß von Oskar01

P.S.: Die zusätzlichen Entstörmaßnahmen beinhalten abgeschirmte Zuleitung zum Lüftermotor (100 Watt) mit jeweils einer kleinen Ferritperle noch zur Dämpfung,
und da kein Schutzleiter vorhanden, einem Durchführungskondensator (Staubsaugerentstörer), wobei die Abschirmungsmasse in Form einer einfachen isolierten Metallplatte unterhalb der Steuerplatine sehr wirksam war.

http://www.datasheetcatalog.com/datasheets_pdf/B/T/1/3/BT139-500.shtml
 

Anhänge

  • DIAC-TRIAC.png
    DIAC-TRIAC.png
    29,7 KB · Aufrufe: 56
$hwstack und $swstack und $framesize

Hallo Cassio!

Eine andere Frage hätte ich da noch an die Fortgeschrittenen bzw. Profis. Hallo Markus!

Ich habe versucht mir diese (doch sehr wichtigen) Angaben von :

$hwstack = 32
$swstack = 10
$framesize = 40

anzulesen. Leider fehlt mir dafür wohl einiges an Grundwissen, um das zu verstehen und richtig einzustellen.

Nicht das in den Werten der Fehler zu suchen ist.

Wenn ich mein Programm kompiliere, dann taucht in den Results folgendes auf:
Stack start : 45F hex
Stack size : 20 hex
S-Stacksize : A hex
S-Stackstart : 440 hex
Framesize : 28 hex
Framestart : 417 hex
Space left : 937 dec

Kann ich vielleicht anhand der Werte meine Einstellungen ableiten?


Nun gut, dann werde ich mal weiter grübeln.....

Ich versuche Dir das mal kurz zu erklären, hmmmm, mal sehen :rolleyes:

Thema $hwstack:
Der HW-Stack ist ein Speicherbereich im RAM der mit einer bestimmten Größe reserviert wird. Der Default-Wert dürfte bei 32 liegen. Bedeutet, 32 Byte im Speicher werden reseviert für den HW-Stack.
Wozu brauche ich diesen nun? Bei jeder GOSUB, CALL oder FUNCTION Routine in BASCOM legt der Prozessor 2 Byte Rücksprungadresse im HW-Stack ab. Das muss er tun damit er bei einem RETURN wieder weiß wo er zurück springen muss. Üblicherweise werden auch bei ISR Registerinhalte mit PUSH aus den Stack und mit POP vom Stack geholt. Davon bekommst Du nichst mit da BASCOM das alles für Dich macht. Bei ISR kannst Du mit der Option NOSAVE BASCOM anweisen die Register nicht zu Push'en und zu Pop'en.
So, wenn Du nun viel geschachtelte GOSUB's, CALL's oder FUNCTION's hast (geschachtelt heißt, die Dinger rufen sich gegenseitig auf) dann bruachst Du viel hwstack und die 32 Bytes reichen nicht aus. Du musst also den HW-Stack erhöhen.

Die Results von BASCOM nach dem Compilat sind nicht zu verwenden da sie nur das anzeigen, was Du eingestellt hast. Stack size:20hex ist nix anderes als 32 (siehe Dein Kommando "$hwstack=32")

Aber man kann es berechnen. Du must quasi wie ein Profiler Dein Programm durchflöhen, die maximale Verschachtelungstiefe durchzählen und für jede Verschachtelung 2 Byte vorsehen. Dann musst Du noch die ISR berücksichtigen, dass der Controller auch die Register auf den HW-Stack legt. Ein Interrupt benötigt auch (soweit ich weiß) 32 Byte. Du musst also prinzipiell für jede ISR zusätzlich Speicher vorhalten.

Damit es noch komplizierter wird gibt es noch einige Instruktionen die auch den HW-Stack benutzen.


Thema $swstack:
Der SW-Stack wird für lokale Variable (Local) und Variablen, die an Subroutinen übergeben werden benötigt. Auch hier werden immer zwei Byte für die Adresse der jeweiligen Variable im swstack abgelegt.

Die Results von BASCOM nach dem Compilat sind auch hier nicht zu verwenden da sie nur das anzeigen, was Du eingestellt hast. S-Stack size: A hex ist nix anderes als 10 (siehe Dein Kommando "$swstack=10")

Auch die Grüße des SW-Stack kann man berechnen. Du musst die maximale Anzahl zu übergebender Variablen plus die Anzahl der lokalen Variablen zusammenzählen und mit 2 multiplizieren. Damit Du auf der sichereren Seite bist solltest Du immer einige Bytes mehr spendieren.

Bei größeren Megas die viel Speicher haben spielt das eh keine so große Rolle mehr und man kann richtig Platz reservieren :D


Thema $framesize:
Lokale Variablen werden in Frames gespeichert. Eine Integervariable benötigt z.B. 2 Byte, Word 2 Byte, String = seine Länge plus 1. Einige BASCOM Befehle wie INPUT, STR, VAL verwenden ebenfalls Frames und belegen dabei bis zu 16 Byte Speicher.

Die erforderliche Größe der Frames kann man dadurch berechnen, in dem man den Speicherbedarf aller lokalen Variablen zusammenzählt. Üblicher Weise gibt man auch hier immer ein bissle Reserve dazu.


So, nun zur Praxis. Ich selbst habe mir bisher die Mühe nicht gemacht und das alles genau berechnet. Ich gehe hier pragmatisch vor und nach Gefühl. Wenn sich meine Programme komisch verhalten und nicht mehr das machen was sie sollen erhöhe ich erstmal den HWSTACK und dann den SWSTACK. Empirisch also :cool:
Manchmal werfe ich noch einen Blick auf meine lokalen Variablen und das wars dann auch schon.


Ich hoffe Dir haben die Erläuerungen weitergeholfen und es ist nun nicht mehr so bömisch :p

Grüßle aus Schwaben,
Markus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)