mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR-Timer mit Netzfrequenz synchronisieren


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin moin,

ich nutze einen ATmega32 mit 16MHz externen Quarz.
Timer 1 nutze ich via Compare-Irq für einen 1ms Irq. Toggle ich in 
diesem Interrupt einen Port-Pin so habe ich exakt jede ms eine Änderung. 
(funktioniert also!).

Diesen 1ms Irq muss ich mit der Netzfrequenz synchronisieren. So baute 
ich eine Nulldurchgangserkennung (funktioniert einwandfrei!), die mir 
einen externen Irq auslöst (Int0).
In der Funktion Int0 initialisiere ich den Timer erneut (zurücksetzen 
von TCNT1).

Mein Problem ist jetzt, das dieses so nicht funktioniert :-(
Messe ich mit dem Oszi den 1ms-Impuls und lege auf den anderen Kanal die 
Nulldurchgangserkennung, so rasen die Signale aneinander vorbei...

Hat jemand eine andere Idee, wie man den Timer entsprechend 
synchronisieren kann?

Die Nulldurchgangserkennung ist vom Versorgungstrafo (9V eff) 
abgegriffen; Spannungsteiler geg. Masse; Mittelpunkt via Basiswiderstand 
an einen BC547B; Emitter mit Widerstand geg. Int0; Kollektor mit 
Widerstand geg. VCC.

Autor: Fragesteller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum und wofür benutzt du den Timerinterrupt?
Ist nicht alles mit dem ext Int zu erledigen?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anschneiden der Phase zum bestimmten Winkel.

Autor: Fragesteller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also möchtest du einen Dimmer bauen.
Dein Timer Interrupt hat eine Zykluszeit von 1ms. Dein Ext int. 10ms.
Du setzt den Zähler des Timers mit deinem ext int zurück.
Mein Vorschlag, Timer nicht auf auto reload sondern jeweils im ext int 
setzen.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nur so eine Idee: Prescaler Reset.

MfG Spess

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ein Dimmer wird es nicht.
Auch sind es keine 50Hz, aber das macht alles nix :-)

Nehmen wir mal an, das wie Du schreibst, der externe Int alle 10ms 
auslöst, und ich dort den Timer setze -> dann muss ich auf meinen 1ms 
Irq verzichten...das geht nicht.

Andere Timer sind belegt.

Autor: Fragesteller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst ja nicht zwingend einen Timer im ext int initialisieren. 
Nehmen wir an deine Application würde in einem Timerinterrupt zyklisch 
ausgeführt,dein ext int würde eine globale Variable setzen, dann könnte 
mann in seiner Application diese Variable benutzen um zu reagieren.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Diesen 1ms Irq muss ich mit der Netzfrequenz synchronisieren.

Wie soll das gehen? Netzfrequenz ist 10ms und nicht 1ms...?

Oder meinst du so:


Netz:...|.................................................|.............
1ms: ...|....|....|....|....|....|....|....|....|....|....|....|....|...

Das du sozusagen die Netzfrequenz verzehnfachen willst???

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias. Genau dieses!

und ich bekomme:
Netz: ....|......................................|........... oder ->
Netz: ....|........................................|.........
1ms:  ....|....|....|....|....|....|....|....|....|....|....|

aber eben nicht:
Netz: ....|.......................................|..........
1ms:  ....|....|....|....|....|....|....|....|....|....|....|

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Upps...verzählt habe ich mich jetzt auch noch. Entschuldigt bitte.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm.. folgende Idee:

Proescaler auf 8. ergibt 2MHz Zähltakt.
Somit würde ein Überlauf alle 32,768ms stattfinden.

Deinen ext. Interrupt legst du auf den ICP-Interrupt. Dort löscht du den 
Timerwert (tcnt=0) und merkst dir ein den letzten (icp-wert). diesen 
teilst du durch zehn und merkst dir das ergebnis als ocp-wert. Diesen 
nutzt du um alle diese ticks einen ocp interrupt auszulösen...

Also im icq-int schreibst du den ocp-wert (icp/10) ins ocp register.
kommt der ocp-int. dann erhohst du den ocq-wert immer um icq/10...

Das sollte gehen...

Autor: F. Kriewitz (freddy436)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein das deine Null Durchgangs Erkennungs Schaltung einfach bei 
einem falschen Pegel schaltet?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Hast du eigentlich beachtet,daß die Netzfrequenz nicht konstant ist?

Unter folg. Link kannst du dir mal ansehen, wie sich die Frequenz 
innerhalb kurzer Zeit ändert:

http://www.etrans.ch/services/online/frequency/

Die Quarzfrequenz dürfte auf kurze Zeit gesehen, wesentlich stabiler als 
die Netzfrequenz sein.

MfG Spess

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@freddy.
Die Schaltung schaltet exakt. Anfangs habe ich gedacht, dass evtl. 
Eingangskapazitäten mir den Pegel verderben, durch diverse Messungen 
kann ich dieses ausschließen. Die Schaltung arbeitet einwandfrei.

@matthias.
Bis auf den letzten Satz kann ich das alles nachvollziehen. Warum 
erhöhen? Es reicht doch dann, wenn ich stets icp/10 ins ocp-reg 
schreibe...oder?

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es reicht doch dann, wenn ich stets icp/10 ins ocp-reg
>schreibe...oder?

Nein. weil der Timer nur alle 10* (icp/10) auf null zurückgesetzt wird:


Netz: 
....|.................................................|.............
1ms: 
....|....|....|....|....|....|....|....|....|....|....|....|....|...


Tcnt    20000
          0       4000      8000      12000     16000     20000

                                                            0 
40000

Das ICP REgister beinhaltet also immer Werte ~20000. Und das OCP 
register muss nun mit den werten n*(icq/10), mit n=0..8 geladen 
werden...

Nicht 9 ! Das muss im ICP-Int erfolgen...

Autor: hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
misst du die 50 Hz am trafo oder am Netz?

denn am Trafo ist die Spannung/Strom in Bezug aufs Netz ja 
phasenverschoben...

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm eine diskret aufgebaute PLL Schaltung die du mit der Netzfrquenz 
synchronisierst. Du erhälst einen zur Netzfrequenz synchronen Takt mit 
beliebiger Frequenz. Den kannst du dann an den externe IRQ anlegen.

Was du hier machen willst, ist das Paradebeispiel für eine PLL.

In µC mit Software und IRQ wirst du NIE synchron sein, sondern immer 
eine Abweichung vom Nulldurchgang bekommen.
Die Frage ist wieviel Abweichung ist für dich und diese Anwendung 
akzeptabel.

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würde das nicht so gehen?
Wenn ein ext. Ereignis auftaucht zunächst die Zeit seit dem letzten 
Ereignis bestimmen, den wert durch 10 teilen, den timer zurücksetzten 
und dann als prescaler bis zum nächsten ext. Ereignis diesen Wert 
eintragen.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Werner:

Ich glaube, das wurde schonmal vorgeschlagen ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.