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?
1 | if ( LastInput0 != Input0 ) { |
2 | Zaehler0++; |
3 | LastInput0 = Input0; |
4 | }
|
5 | |
6 | if ( LastInput1 != Input1 ) { |
7 | Zaehler1++; |
8 | LastInput1 = Input1; |
9 | }
|
Danke, eigentlich logisch und total simple. Hatte wohl ne große Denkblockade. Vielen Dank für Eure Hilfe.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.