PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nulldurchgangserkennung



BlaueLed
03.06.2005, 12:21
Hallo,

ich will mit nem Atmega8 und Bascom einen Dimmer für 220V bauen. Was mir jetzt noch fehlt, ist die Nulldurchgangserkennung mit Bascom. Ich weiß absolut nicht, wie ich das in Bascom anstellen soll. Ich versorge meine Schaltung mit nem 12V trafo. da könnte ich doch die 12V wechsel nehmen oder ? Nur wie in bascom realisieren ? Vielleicht kann mir ja jemand helfen.

mfg Kay

x-ryder
03.06.2005, 13:04
was iss denn nen nulldurchgang?

PicNick
03.06.2005, 13:11
Wechselstrom is'n sinuskurve. dort wo er die Mittelllinie trifft, ist der Nulldurchgang

uwegw
03.06.2005, 15:43
du müsstest die 12V durch einen brückengleichrichter (macht pulsierende gleichspannung, keinen kondensator dahinter!) und über einen komparator laufen lassen, der auf die nullspannung eingestellt ist. dann bekommst du jedesmal ein kurzes signal wenn ein nulldurchgang ist...

BlaueLed
03.06.2005, 16:45
ahso, ich versorge ja meine Schaltung schon mit 12V aus dem trafo, dann habe ich ne gleichrichtung ( 4 Dioden ) und dann nen Sieb Elko. Dann gehe ich grad direkt von den 12V Wechsel noch mal ab und gehe auf nen komparator. es gibt doch von atmel auch ne appnote, in der beschrieben ist, wie man direkt die 220V über nen 1M Ohm Widerstand auf Int0 vom atmel geht. Nur verstehe ich nix von diesen Interrupts. Wann löst denn ein Interrupt aus ?

uwegw
03.06.2005, 17:09
direkt per hochohmwiderstand wär natürlich die minimalvariante. die auswertung per interrupt würde ich auch bei einer schaltung über den trafo bevorzugen, weil man so am bequemsten programmieren kann.

ein interrupt läuft ungefähr so:
wenn am entsprechenden pin ein wechsel von high nach low (es sind auch andere schaltsituationen einstellbar) stattfinde, springt der controller in einen bestimmten programmteil, in dem bei dir jetzt zb der ausgang eine bestimmte zeitlang eingeschaltet wird...

03.06.2005, 18:34
das heißt als, das ich mit den 12V Wechsel ( über nen Widerstand ) an Int0 gehe und wenn die Spannung genau 0 ist, dann löst der Interrupt aus ?

Marco78
03.06.2005, 19:31
Welche AppNote ist das denn? Oder hast du evtl sogar n Link dazu? :D
Ich kann dir schonmal soviel sagen, das du den Int auf ansteigende oder abfallende Flanke programmieren kannst. Aber wenn genau und besonders ob bei 0 den Int ausgelöst wird weiss ich so jetzt nicht.

Es würde zur Not auch über ein Analogeingang geh'n.

uwegw
03.06.2005, 19:37
der analogeingang wäre ein ziemlcier overkill und würde unntötig rechenzeit ziehen...

wenn man nen kompararo zwischenschaltet bekommt man nen sauberen wechsel von high auf low um den interrupt auszulösen...

03.06.2005, 20:22
@Marco
also die appnote ist diese hier http://www.atmel.com/dyn/resources/prod_documents/doc2508.pdf

@uwegw
habe jetzt noch folgendes gefunden:
http://www.mathar.com/bilder/nulldurchgang.gif
da wird die fallende flanke ausgewertet. würde das auch gehen mit dem Interrupt ?

uwegw
03.06.2005, 20:44
ich muss grad mal sehn was da für ein IC benutzt wird, aber wenn es eine fallende flake beim nulldurchgang erzeugt spricht eigentlich nichts dagegen....

also ein optokoppler mit darlingtonausgang... ist ne einfache lösung, hat nur den kleinen nachteil dass der schaltpuunkt etwas früh ist... aber das lässt sich, wie auf der zugehörigen seite beschrieben, leicht in der software ausgleichen...

Marco78
03.06.2005, 20:46
Ich kann mir nicht vorstellen, das eine 'Free'-Messung länger dauert als eine ISR aufzurufen. Da werden ja immerhin die Register erst gespeichert, bevor der eigentliche Porgrammteil anfängt.

Sinn würd der INT aber auf jeden Fall machen, wenn in der Zeit vorm INT der Phasenwinkel brechnet werden kann und im INT dann das eigentliche dimmen erfolgen kann.

Also steht's im Moment 1:0 für den INT ;)

Aber ich muss zugeben, das ich beim ersten Überfliegen noch nicht verstanden habe, wie der genaue Nulldurchgang erfasst werden soll. So wie ich das sehe ist es nur ein Nährungswert.
Aber da der Zeitunterschied von 5V bis 0V um einiges geringer ist als der von Upeak zu 5V und da noch ein paar Takte erforderlich sind bis das eigentliche dimmen eingeleitet wird kann man diese Nährung sicherlich annehmen.
Aber wenn ich mit meiner Auffassung richtig liege sollte man wohl doch auf die 230V zurück greifen und nicht nur auf die 12V AC.

uwegw
03.06.2005, 20:49
wenn man schon mal nen trafo an bord hat sollte man nicht zuviele 230er strippen auf der platine ziehen... am besten den 230er teil auf ne getrennte platine in ein eigenes gehäuse... und dann halt optokoppler...

Marco78
03.06.2005, 21:16
Es ging mir dabei nicht um die VDE sondern um die tatsache, das die 12V immer noch eine Sinuskurve sind. Und sich das Verhältnis von Delta t von 5V bis 0V zu 12V bis 0V und 230V bis 0V ändert.

uwegw
03.06.2005, 21:27
dann sollte man die verzögerungszeit mit dem oszi ausmessen...

Marco78
03.06.2005, 21:46
Da kann sich jeder glücklich schätzen, der eins hat! Aber das ist nunmal nicht jeder, der mit Elektronik spielt.

Ich würd den Zeitunterschied einfach berechnen, die ungefähre Zeit abschätzen, die der AVR für seine Aktionen benötigt und dann in Anhänigkeit der Taktfrequenz eine Konstante bestimmen, die den Zeitunterschied kompensiert.

@BlaueLed, den INT auf falling einstellen (findest du in der BASCOM-Hilfe) und erstmal den INT als Nulldurchgang annehmen.
In der ISR kannst du dann auch gleich das zünden des Transistors veranlassen.
Wenn das zünden noch während der positiven Welle passieren sollte, wird man das wohl dadran sehen, das kaum gedimmt wird. dann einfach noch eine kleine Pause einfügen, nachdem die ISR aufgerufen wird und bevor gezündet wird.
Dann mit RETURN wieder ins Hauptprogramm gehen, wo dann z.B. der Winkel berechnet werden könnte.
Bedenke, das die menschliche Wahrnehmung log sein muss um lin auszusehen! Das gilt auch für's Sehen.

04.06.2005, 07:40
@marco78
also ich benutze also die schaltung mit dem optokoppler. gehe mit dem ausgang direkt auf Int0. Dann stelle ich in Bascom Int auf falling. Wenn jetzt Int0 ausgelöst wird, dann muss ich ja normalerweise nur 0 -10 ms warten und dann den Triac zünden. wenn ich 10 ms warte, dann dürfte nichts zu sehen sein. Wenn ich bei 0 ms zünde, dann müsste der Triac doch die vollen 220V durchlassen. Sehe ich das so richtig ?

BlaueLed
04.06.2005, 08:28
der gast im posting über mir, war auch ich. hab vergessen mich einzuloggen :-)

Felix G
04.06.2005, 08:49
Also auch wenn du evtl. schon eine Schaltung hast...

schau dir doch mal das Ding an: ELV-Phasenabschnittdimmer (http://www.elv-downloads.de/service/manuals/DI300/373-78.htm)

Marco78
04.06.2005, 09:17
Ich denke, ein Triac muss nach jedem Nulldurchgang neu gezündet werden. Wenn er also durch die Zeitverschiebung kurz vor Ende der Halbwelle gezündet wird, löscht er sich wieder beim Nulldurchgang und es wird nicht (bzw. nicht sichtbar) gedimmt.
Ich mag damit auch falsch liegen.

Willst du denn ein Phasenan- oder abschnittsdimmer bauen?

Aber das mit den 0-10ms sehe ich genau so.
Und wenn's beim ersten >Versuch nicht klappt, kannst du ja in der ISR erstmal eine Pause von 2ms einlegen. Da sollte spätestens der Nulldurchgang vollzogen sein.

Wie wird die Helligkeit denn gesteuert? Baust du ein Tastdimmer? Oder mehrere Tater für feste Helligkeiten?

Getaco
04.06.2005, 09:47
@blaueLed
Guck mal hier -->https://www.roboternetz.de/phpBB2/viewtopic.php?t=9469
wenn du die schaltung dazu wils melde dich.
Achja und wenn jemand einen dimmer mit 8 Kanälen zum laufen bringt bitte auch melden.danke :-)


Und wenn's beim ersten >Versuch nicht klappt, kannst du ja in der ISR erstmal eine Pause von 2ms einlegen.

Ne Pause ?!bei einem in Basic programierten Dimmer gibt's nicht's fataleres als eine Pause. (flakern der gedimten Glühbirne)

Also mit dem Int ist sehr gut.Nur der INT kommt nicht genau zum Zeitpunkt des Nulldurchgangs. Bei Int0 faling kommt er kurz danach, bei rising kurz davor.

Marco78
04.06.2005, 10:14
Wofür sollte die Pause denn sein???

Getaco
04.06.2005, 10:18
hmm weis nicht? ich hab die pause von 2ms nicht erwähnt.

Marco78
04.06.2005, 10:20
Aber ich. Und ich habe auch meine Gedanken dazu beschrieben!
Weil ja der INT nicht genau beim Nulldurchgang ausgelöst wird.

Getaco
04.06.2005, 10:24
ja klar ok is schon richtig aber wann du dem uC sagst er soll mal kurz für 2ms nix tun (z.b. waitms 2 ) kommt nur geflacker raus. hab das alles auch schon probiert und getestet und verflucht. Ich glaube am besten ist's wenn wann das ganze mit dem Nulldurchgang nicht so genau nimt und einfach animt Nulldurchgang = int ausgelöst.

Marco78
04.06.2005, 10:26
Die 2ms waren ja auch nur für den worst-case.

Wenn er vor dem Nulldurchgang zündet, wird sich garnichts dimmen. die 2ms wären ja auch nur um den Fehler ausschliessen zu können und kan im fertigen Programm ggf auf 500µs angepasst werden.

Getaco
04.06.2005, 10:30
also ich für meinen teil lass den/die Triac/s bis zum int gezündet (eine art PWM) mit Pausen und warten usw hab ich nur probleme gehabt. Ich habe im Netz einige fertige basic programe zu diesem thema gefunden und ausprobiert nur leider haben sie nie bei mir funktioniert. mein program basiert auf den erkentnissen und programmen der anderen.

Marco78
04.06.2005, 11:37
Bis jang hat sich ja auch hier noch kaum einer zum Beitrag geäußert. Zumindest nicht besonders sinnvoll.

Ich will auch nicht an meiner Meinung festhalten. Ich habe ja auch selbst geschrieben, das ich mir das so auf Grund theoretischer Vorstellungen denke.

Wenn du selbst Praxiserfahrungen damit hast, glaube ich dir das gerne. Und BlaueLed sollte auch ein Schritt näher am Ziel sein.

04.06.2005, 16:30
@Getaco:
wenn ich also den interrupt benutze und annehme, das Int = Nulldurchgang ist, dann muss ich doch 0 - 10 ms warten, bis ich den Triac zünde oder ? wie soll ich das warten realisieren, wenn nicht über Wait () ?

BlaueLed
04.06.2005, 17:30
ich vergesse immer mich einzuloggen, bevor ich was schreibe. Also das Posting über mir, war auch ich

recycle
04.06.2005, 17:34
Also mit dem Int ist sehr gut. Nur der INT kommt nicht genau zum Zeitpunkt des Nulldurchgangs. Bei Int0 faling kommt er kurz danach, bei rising kurz davor.

Wenn du bei einer Phasenanschnittssteuerung (oder wie immer das genau heisst) schon genau im Nulldurchgang abschalten willst, kannst du deine Lampe auch gleich am Schalter ausmachen.
Wenn der Interrupt erst ein "bischen" später auslöst, sollte das nicht ganz so schlimm sein, denn ein "bischen" Spannung braucht eine Lampe auch bevor sie sichtbar leuchtet.

Kommt natürlich drauf an, wieviel ein bischen ist, bzw. wann genau "kurz danach" ist.

Marco78
04.06.2005, 20:22
Ich denke mal die 0-10ms sind der dimmbare Bereich.

BlaueLed
05.06.2005, 10:40
ja genau. die 0-10ms sind der dimmbare Bereich

BlaueLed
06.06.2005, 11:56
@Getaco,

könntest du mir deinen Code zur Verfügung stellen ?

Getaco
06.06.2005, 23:24
@blaueled
kann ich, der steht auch schon irgendwo im forum(forum_dimmer***.bas), nur nicht gleich heute, muss noch arbeiten :( aber so in groben zuegen ->
--------------------
config timer1
enable int0
enable compare1a
variabeln, etc...
---Hauptschleife---
do
Taster abfragen und auswerten
Wenn Taster kuerzer als x ms dann Lampe toggeln
Wenn Taster laenger als x ms dann Lampe dimmen
loop

---Interrupt---
timer1_code:
decr zuendzeitpunkt
wenn zuendzeitpunkt = lampen Helligkeit dann triac zuenden (set pinx.n)
compare1a = naechster zuendzeitpunkt bei
Return

---Nulldurchgang---
int0_code:
timer1 = 0
compare1a = erster zuendzeitpunkt
zuendzeitpunkt = 256
Return

end
--- 255 Zuendzeiten ---
data xxx,xxx,xxx

Grobe erklaerung :

Zu INT0:
Bei einem Nulldurchgang wird Int0 ausgeloest und setz den zuendzeitpunktszaehler (wow was fuer ein wort) auf Null bzw auf 256, der timer wird auf null gesetz und compare1a auf den ersten (im wert niedrigsten aber in der helligkeit hoechste) wert gesetzt. Bei 10 MHz quartz und timer prescale 8 ist das so um die 400 oder 500.
Diese erste wert entspricht etwa dem "kurz nach" dem Nulldurchgang der sinus kurve d.h. wenn du deinen Triac dann Zuendest hast du die volle welle.

Zu Timer1 interrupt (eigentlich das compare1a interrupt) :

wird nun der erste kleinste wert vom timer ereicht d.h. das compare1a interrupt ausgeloest, zaehlst du einfach einen zaehler von 255 um eins nach unten, vergleichst diesen wert mit dem deiner lampe wenn diese beiden gleich sind zuendest du. Bevor der return kommt noch schnell den naechsten comapre wert setzen,damit das spiel von vorne beginnen kann.

zur Hauptschleife :
Hier kanns du alles reinpacken was du willst nur , es darf nicht zu viel zeit "kosten" . Du brauchst in deiner hauptschleife nicht zu warten oder zu "pausieren" oder irgendwelche interrupte manuel auszuloesen, das geht alles von selbst.

Klingt alles sehr verwirrend geb ich zu doch wenn du dir mein progi anschaust und ein bischen auseinander nimst wirst du es verstehen wenn nicht werd ich dir helfen,ich hab auch einige tage und wochen damit verbracht.

Ich schreib dir nen richtigen code sobald ich zuhause bin

BlaueLed
07.06.2005, 06:16
@Getaco

Alles klar. danke schonmal

Getaco
08.06.2005, 05:52
Hier kuck mal.

$regfile = "m8535.dat"
$crystal = 10000000

Config Portc = Output

'(
Im Hauptprogramm Berechnest Du Aus Jedem Helligkeitswert(8 Bit) Die
Entsprechende Anzahl Von Timerticks. Beim Nulldurchgang Löscht Du
Deinen Timer Und Schreibst Die Timerticks Der Hellsten Lampe Ins
Compare -register Deines Timers. Wenn Das Compare -reg Einen Ir Auslöst,
Schaltest Du Die Lampe Ein Und Schreibst Den Wert Der Zweithellsten
Lampe Ins Compare -reg , Usw.
Fang Am Anfang Mit Nur Einer Lampe An. Dann Hast Du Nur Einen Wert Für
Das Compare -register Und Dein Programm Bleibt Einfach. Wenns Läuft , Bau
Die Anderen Lampen Ein!
')

' 8 chanel werter festleen an engem array !
Dim Chanel_val(8) As Word
Dim Temp_chanel_val(8) As Word
Dim Trigger_chanel_num(8) As Byte
Dim T As Byte
Dim C As Byte
Dim M As Byte
Dim Idx As Byte
Dim Chanel As Integer 'actuel chanel nummer
Dim Comp As Integer
Dim T_c As Integer
Dim R_c As Integer
Dim R2d2 As String * 1
Dim R3d3 As String * 10



Declare Sub Big_level() As Bit

' Offset NUll Duurchgang = 1750 ticks
Chanel_val(1) = 1750 'MIN
Chanel_val(2) = 1700
Chanel_val(3) = 1600 '
Chanel_val(4) = 1500 '
Chanel_val(5) = 1400 '
Chanel_val(6) = 1300 '
Chanel_val(7) = 1200 '
Chanel_val(8) = 1100 'MAX

'Config Int0 = Rising
Set Mcucr.isc01
Set Mcucr.isc00

' Interrupts
Enable Interrupts




'timer configureiren
Call Big_level
Compare1b = 250 '12502

Config Timer1 = Timer, Prescale = 8
Config Serialin = Buffered, Size = 64



Enable Int0 'Null Durchgans erkennung
Enable Compare1a 'timer1 interrupt
Enable Compare1b 'timer1 interrupt

On Int0 Int0_isr
On Compare1a Timer_isr
On Compare1b Port_reset






Do
R2d2 = Inkey()
If Err = 0 Then
If R2d2 <> "*" Then
R3d3 = R3d3 + R2d2
Else
Print "Chanel 1 set to "; R3d3
Chanel_val(1) = Val(R3d3)
R3d3 = ""
End If
End If

Loop




'main routine
'Timer_ticks_max = 12500 'bei prescale = 8 ass 12500
'One_step = 50 'linear ticks









Timer_isr: 'compare1a interrupt
T_c = Trigger_chanel_num(Chanel)
Select Case T_c
Case 1 : Set Portc.0
Case 2 : Set Portc.1
Case 3 : Set Portc.2
Case 4 : Set Portc.3
Case 5 : Set Portc.4
Case 6 : Set Portc.5
Case 7 : Set Portc.6
Case 8 : Set Portc.7
End Select
Chanel = Chanel + 1
If Chanel > 8 Then
Chanel = 1
End If
T_c = Trigger_chanel_num(Chanel)
Comp = Chanel_val(T_c)
Compare1a = Comp
Return





Int0_isr: 'Null Durchgangs Interrupt
Timer1 = 0
Start Timer1
Chanel = 1
T_c = Trigger_chanel_num(Chanel)
Comp = Chanel_val(T_c)
Compare1a = Comp
Return


Port_reset:
Portc = 0
Return

Dieser code hat in etwa so bei mir funktioniert. experimentiere mal damit herum. Ist glaube ich auch ne bessere erklaerung als mein versuch vorhin ;)

BlaueLed
08.06.2005, 08:58
mal sehen, ob ich das richtig verstanden habe :

nach jedem Nulldurchgang muss ich ja 0-10ms warten, bis ich den Triac zünde. Ich nehme mir also einen Timer und lege die Timerzeit fest ( z.B. 5ms ). Wenn nun Int0 auslöst, starte ich den Timer. Ist der Timer abgelaufen, zünde ich den Triac. Ist das so im groben richtig ?

Getaco
08.06.2005, 13:30
ja so im groben richtig, die feinheiten liegen in den timer werten die sich mit einer, zumindest für mich, Formel berechnen lassen. Wieviele triacs möchtest du eigentlich ansteuern ?

BlaueLed
08.06.2005, 17:21
also ich will 3 Dimmer bauen. aber für jeden Dimmer ist 1 AVR und 1 Triac vorgesehen. Also jetzt zum testen, habe ich einen Atmega 8 und nen Tic226. Also nur einen Triac. Wie berechnest du die Timer Werte denn genau ?

Getaco
08.06.2005, 17:23
hmm bischen übertrieben nen mega8 für einen kanal aber mir solls recht sein :)

hier ist die formel die ich gefunden habe
Zündzeitpunkt = Arcos(1 -(x / 128)) * 10ms / Pi
kann dir die werte aber reinposten oder mailen oder wie auch immer.

BlaueLed
08.06.2005, 17:40
der mega8 soll nur zum testen sein. Wäre nett, wenn du mir die werte per e-mail zukommen lassen könntest. hier meine Adresse kaypohl@t-online.de

mit den Timerwerten von dir, in wieviel stufen kann man das licht denn dimmen ?

Getaco
08.06.2005, 17:43
Die Lichtlein lassen sich in 255 Stufen dimmen. Mail is ab

BlaueLed
08.06.2005, 17:50
255 Stufen ???? ist ja mal genial. danke

hab aber noch ne frage :-)

Wie sieht denn deine Schaltung zur Nulldurchgangserkennung und zur Verbindung zum Triac aus ?

BlaueLed
08.06.2005, 17:55
hab deine e-mail bekommen. ich habe den atmega mit 16Mhz laufen. wie kann ich das umrechnen ?

PicNick
09.06.2005, 07:51
Männer, ich verschieb euch mal in die Elektro-Abteilung, Der BasCom ist ja eigentlich das Opfer, nicht der Täter

Getaco
10.06.2005, 13:25
@picknick
was hat ein Bascom Program zur ansteuerung eines Ausgans (hier eben ein Triac) mit Elektronik zu tun ? Aber egal hier schreibt's sich auch ganz schön. ;)

BlaueLed
10.06.2005, 13:28
@getaco
wie sieht deine Ansteuerung des Triacs aus ?
wie sieht die Schaltung deiner Nulldurchgangserkennung aus ?