Forum: Mikrocontroller und Digitale Elektronik Atmega32 Impulse zählen


von iGast (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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?

von iGast (Gast)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

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?

von Wilhelm F. (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von iGast (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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
}

von iGast (Gast)


Lesenswert?

Danke,

eigentlich logisch und total simple. Hatte wohl ne große Denkblockade.

Vielen Dank für Eure Hilfe.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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!

von STK500-Besitzer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.