Hallo,
ich möchte drei unabhängige Einphasen Wechsselstromzähler über die s0
Schnittstelle mit einem Atmega 32 auswerten und Zählen. Die
Wechsestromzähler haben jeweils eine s0 Schnittstelle und 1000 Imp/kWh.
Ich möchte diese drei unabhängig von einander Zählen.
Die Impulse sollen dann nach 30 sekunden verglichen werden und einen
Ausgang schalten
Aber wie programmiert man drei Zähler (in C) und wo schließt man diese
an? Es gibt ja nur zwei interne Zähler.
Vielleicht hat ja einer von euch das gleiche Problem schon einmal gehabt
und kann einen Lösungsansatz aufzeigen.
Ich bin auch noch kein C Experte. Aber wie kann ich ggf. die Flanken
auswerten, wenn ich keinen internen Zähler verwende? Es müsste doch
möglich sein, da Impulsbreite bei s0 definiert ist, über eine Zeit den
Rest des einsignals zu ignorieren.
Danke schon im voraus, für alle fachlich und sachlichen Beiträge
iGast schrieb:> Hallo,>> ich möchte drei unabhängige Einphasen Wechsselstromzähler über die s0> Schnittstelle mit einem Atmega 32 auswerten und Zählen. Die> Wechsestromzähler haben jeweils eine s0 Schnittstelle und 1000 Imp/kWh.
Das ist eine schöne Angabe.
Aber viel interessanter wäre die Antwort auf die Frage:
und, wieviele Imulse pro Sekunde bedeutet das jetzt für
den µC.
Denn das ist die entscheidende Frage. Hängst du da 3 Fahrradbirnen an,
dann kann ich dir das ganze mit Papier und Stricherl-zählen machen.
Hängst du da aber die Heizung eines Hochofens an, dann werden die Zähler
nur so rattern, dass es raschelt.
Also: wieviele Pulse pro Sekunde erwartest du?
> Aber wie programmiert man drei Zähler (in C) und wo schließt man diese> an? Es gibt ja nur zwei interne Zähler.
Sagt ja keiner, dass man die Timer dafür nehmen muss.
Wenn man erst mal konkrete Zahlen dafür hat, welche Pulsraten zu
erwarten sind, kann man ja auch entscheiden, ob man nicht einfach in 3
Variablen hochzählt. Hängt halt alles davon ab, wieviele Pulse pro
Sekunde dann tatsächlich einlaufen werden.
Karl Heinz Buchegger schrieb:> iGast schrieb:>> Wechsestromzähler haben jeweils eine s0 Schnittstelle und 1000 Imp/kWh.>> Das ist eine schöne Angabe.> Aber viel interessanter wäre die Antwort auf die Frage:> und, wieviele Imulse pro Sekunde bedeutet das jetzt für> den µC.
Jau! :-)
Ist aber vermutlich unkritisch, weil eine Wattsekunde eine relativ große
Einheit ist, so dass man sicher nicht an die Leistungsgrenzen des
Mikrocontrollers stößt – selbst, wenn man per Software zählt. Ich würd
deshalb gerne noch eine Frage nachschieben:
Wie lang dauert ein Impuls?
Und aus reiner Neugier: Warum ein ATmega32 und z.B. kein ATtiny13A?
Hallo,
die Breite von Ein und aus sind jeweils >=30ms nach Norm EN62053-31.
Ich verwende den Atmega, da ich mal eine größere Menge bestellt habe.
Welchen Vorteil hätte Attiny13a?
iGast schrieb:> die Breite von Ein und aus sind jeweils >=30ms nach Norm EN62053-31
Ich habe jetzt nicht gerechnet, aber was passiert wenn mehr Leistung
gezogen wird?
iGast schrieb:> Es gibt ja nur zwei interne Zähler.
Im Grunde braucht man auch nur einen einzigen Timer, der im µC
fortlaufend als System-Timer läuft, z.B. im Millisekunden-Raster, und
einen 32-bit-Wert endlos hoch zählt. Der Zähler braucht dann bei 32 bit
49 Tage bis zum Überlauf. Den kann man dann auch mal für einen
Zeitstempel gebrauchen. Einem Impuls einen Zeitstempel verpassen, dann
kann man damit weiter rechnen.
iGast schrieb:> Hallo,>> die Breite von Ein und aus sind jeweils >=30ms nach Norm EN62053-31.
d.h. ein kompletter Puls kann nicht kürzer als 60ms sein. (Daraus folgt
auch, dass du nicht mehr als 16 Pulse pro Sekunde haben kannst).
Na, ja.
Bei diesen Zahlen reicht es, wenn der µC ab und an mal einen Blick auf 3
Portpins wirft und wenn sich die verändern, dann zählt er 1 zu je einer
Variablen dazu.
> Ich verwende den Atmega, da ich mal eine größere Menge bestellt habe.> Welchen Vorteil hätte Attiny13a?
Er ist kleiner. Du fährst ja auch nicht mit dem 40-Tonnen LKW zum
Pizzaholen.
Nochmal zum Verständnis. Wie kann ich dann einen Impuls zählen? Gibt es
eine c Befehl für steigende Flanken? Oder wie würdet ihr sowas
programmieren?
Es kann nicht mehr Leistung gezogen werden, da eine 16A LS davor
geschaltet ist.
iGast schrieb:> Nochmal zum Verständnis. Wie kann ich dann einen Impuls zählen? Gibt es> eine c Befehl für steigende Flanken? Oder wie würdet ihr sowas> programmieren?
Karl Heinz Buchegger schrieb:> Na, ja.> Bei diesen Zahlen reicht es, wenn der µC ab und an mal einen Blick auf 3> Portpins wirft und wenn sich die verändern, dann zählt er 1 zu je einer> Variablen dazu.
Da du zusätzlich noch nach 30 Sekunden eine Auswertung machen willst,
würde es sich daher anbieten einen Timer als Systemzeit zu benutzen, der
alle zb. 1ms eine ISR aufruft. In der ISR wird
* die Systemzeit um 1ms weitergestellt (und die Sekunden wenn es soweit
ist)
* ein Blick auf die 3 Portpins geworfen und wenn sich die im Vergleich
zum letzten mal nachsehen verändert haben, dann der entsprechende Zähler
erhöht.
* Vergleich der Systemzeit mit den gewünschten 30 Sekunden und wenn die
abgelaufen sind, werden zb die gesammelten Werte für die Auswertung
dupliziert, alles auf 0 gestellt und der ganze Mechanismus startet von
vorne.
iGast schrieb:> Nochmal zum Verständnis. Wie kann ich dann einen Impuls zählen? Gibt es> eine c Befehl für steigende Flanken? Oder wie würdet ihr sowas> programmieren?
Ich würde es so machen wie Karl Heinz vorgeschlagen hat, das ist ein
vernünftiges Konzept!
Wenn du nicht den (doch etwas angestaubten) ATmega32 hättest, sondern
seinen Nachfolger (ATmega324A), dann wären die Pin-Change-Interrupts
eine elegante Lösung. Dort kannst du für (fast beliebige) Pins insgesamt
maximal vier verschiedene Interrupt-Routinen vorgeben, von denen immer
dann die zuständige aufgerufen werden, wenn sich der Eingangspegel
ändert.
Der ATtiny13A war nur ein Beispiel. Er zieht weniger Strom, ist kleiner
und deutlich billiger. Allerdings hat er nur wenige Pins. Kommt halt
immer drauf an, was du sonst noch ansteuern willst. Mir kam es nur ein
bisschen übertrieben vor, einen 40-Pinner für diese Aufgabe zu
verwenden. Aber wenn du die Teile eh schon hast, dann verwende sie
ruhig!
Peter II schrieb:> if ( LastInput0 != Input0 ) {> Zaehler0++;> LastInput0 = Input0;> }>> if ( LastInput1 != Input1 ) {> Zaehler1++;> LastInput1 = Input1;> }
Damit zählst du jede Flanke, also 2 Impulse pro Impuls.