Forum: Mikrocontroller und Digitale Elektronik AVR 2560 counter capture durch input change


von Alexander S. (docalex)


Lesenswert?

Moin,

Ich möchte gerne bei 8 Kanälen glechzeitig die Periodendauer messen.

Der Plan:

Den systemtakt runterteilen und mit einem 16 bit counter zählen.

Die 8 Kanäle auf ein Register legen z.B. Register B.
Eine Interrupt on change definieren.

Mit der Auslösung dieses interrupts möchte ich einen counter capture 
auslösen und mit dem so gespeicherten counter die Periodendauer 
bestimmen.

Es soll also ein counter capture ausgelöst werden, wenn sich EINER der 8 
pins ändert.

Mein Problem: ich habe gefunden, wie man einen change interrupt auslöst. 
Ebenso habe ich herausgefunden, wie man den counter capture auslöst, in 
dem man den passenden pin triggert.

Wa ich nicht finden konnte: wie löse ich direkt aus dem Register change 
den counter capture aus.

Ich möchte nicht über Software (das Rechenwerk) gehen, da das 
verzögerung bedeuten würde (Ein Change interrupt löst über den Prozessor 
einen counter capture aus).

Wie kann man das direkt tun?

Viele Grüße Alexander.

von m.n. (Gast)


Lesenswert?

Alexander S. schrieb:
> Ich möchte nicht über Software (das Rechenwerk) gehen, da das
> verzögerung bedeuten würde (Ein Change interrupt löst über den Prozessor
> einen counter capture aus).

Das wird nicht funktionieren. Du möchtest keine Verzögerung, legst aber 
auch keine Zeitanforderungen vor.
Wie groß ist denn der Vorteiler des Zählers?
Wie groß ist denn die zu erwartende Periodendauer?
Wie groß ist die benötigte Meßrate und bei welcher Auflösung?

Für geringere Anforderungen lassen sich Kompromisse finden. Für höhere 
Anforderungen brauchst Du einen andern µC (z.B. STM32Fxxx), wobei aber 
selbst der AVR schon Neuland für Dich darstellt.
Es wäre ganz gut, wenn Du bereits jetzt verraten könntest, was es 
letztlich werden soll!

von Alexander S. (docalex)


Lesenswert?

Was solls werden?

Ich möchte den Durchlauf von 8 Heizkörpern messen.

Der Sensor ist dieser hier

http://www.btflowmeter.com/fileadmin/PDF/Flowmeter/97478940-FCH-midi-POM.pdf

Er liefert je nach Typ 475imp/l oder 1900 imp/l. Bei einer Heizleistung 
von. 1,5kw laufen 2l/min durch.

Er kann minimal 0,1l/min detektieren. Das entspricht etwa 75 W. In 
diesem Zustand liefert er selbst in der 1900er Ausführung noch etwa 3 
imp/s.

Das ist natürlich zu wenig, um vernünftig Impulse zählen zu können.

Daher möchte ich die Periodendauer zwischen den Pulsen messen und die 
Durchflussrate aus dem Kehrwert der Periodendauer mit hoher Auflösung 
bestimmen.

Der Vorteiler soll so gewählt werden, dass der max. Zählerstand bei etwa 
1 imp. /sek erreicht wird. Das definiere ich dann als Durchfluss Null.

Eine Messrate gibt es nicht, da eine Messung immer dann endet, wenn der 
nächste Impuls kommt.

Ob ich später über Messungen in einer Zeitdauer mitteln werde, wird sich 
zeigen.

Mit "Keiner Verzögerung" meine ich keine undefinierte. Das Zählerwerk 
arbeitet ungetaktet und unabhängig vom Rechenwerk.

Sobald ich aber über das Rechenwerk gehe (über Interrupts) können 
variable, unvorhersagbare Verzögerungen entstehen, die die Messung 
beeinflussen.

Ich möchte den Atmel verwenden, da ich die Arduino Entwicklungsumgebung 
verwende.

Viele Grüße

Alexander

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Alexander S. schrieb:
> Ich möchte den Durchlauf von 8 Heizkörpern messen.

Also eine ganz langsame Geschichte.
Eine fertige Lösung für 4 Kanäle findest Du hier: 
Beitrag "4-Kanal Drehzahlmessung mit ATmega88"
Schaltung und Programm lassen sich einfach auf 8 Kanäle erweitern. Man 
muß dafür einen anderen Port verwenden und eine größere LC-Anzeige - 4 x 
16 oder so.

von Alexander S. (docalex)


Lesenswert?

m.n. schrieb:
> Alexander S. schrieb:
>> Ich möchte den Durchlauf von 8 Heizkörpern messen.
>
> Also eine ganz langsame Geschichte.
> Eine fertige Lösung für 4 Kanäle findest Du hier:
> Beitrag "4-Kanal Drehzahlmessung mit ATmega88"
> Schaltung und Programm lassen sich einfach auf 8 Kanäle erweitern. Man
> muß dafür einen anderen Port verwenden und eine größere LC-Anzeige - 4 x
> 16 oder so.

Wenn ich das richtig verstehe, zählt das Programm Überläufe eines 
counterregisters und berechnet daraus die Frequenz.

Ich möchte aber nach einem Impuls einen counter capture auslösen, um 
eine möglichst hohe Ausflösung zu haben. Die Überläufe muss ich 
natürlich trotzdem zählen.

Daher nochmal die Frage: Wie löse ich einen counter capture durch einen 
Port change ohne Software aus?

Viele Grüße

Alexander

von Karl M. (Gast)


Lesenswert?

Alexander S. schrieb:
> Daher nochmal die Frage: Wie löse ich einen counter capture durch einen
> Port change ohne Software aus?

Was steht im AVR µC Datenblatt wie eine ICP Zähler funktioniert ?

von c-hater (Gast)


Lesenswert?

Alexander S. schrieb:

> Daher nochmal die Frage: Wie löse ich einen counter capture durch einen
> Port change ohne Software aus?

Das geht nur für maximal zwei Kanäle, nämlich den ICP-Pin und einen der 
beiden AINx-Pins. Blöd bloß: um zwischen den beiden Kanälen 
umzuschalten, wird dann doch wieder Software benötigt. Außerdem blöd: 
durch die Umschalterei hast du nur noch ein Viertel der "Abtastrate" pro 
Kanal, denn du benötigst dann jeweils zwei Pegelwechsel pro Kanal, um 
eine Zeit zu messen und das halt für zwei Kanäle.

Kurzfassung: Völlig unsinniger Ansatz. In dieser Anwendung bringt die 
Verwendung der Capture-Funktion eines Timers nur Nachteile.

von m.n. (Gast)


Lesenswert?

Alexander S. schrieb:
> Wenn ich das richtig verstehe, zählt das Programm Überläufe eines
> counterregisters und berechnet daraus die Frequenz.

Du hast es nicht richtig verstanden. Der Text zum Programm beschreibt, 
wie es funktioniert.

> Daher nochmal die Frage: Wie löse ich einen counter capture durch einen
> Port change ohne Software aus?

Nicht mit einem AVR 2560. Mit einem STM32Fxxx - ganz einfach.

von Peter D. (peda)


Lesenswert?

Alexander S. schrieb:
> Ich möchte nicht über Software (das Rechenwerk) gehen, da das
> verzögerung bedeuten würde (Ein Change interrupt löst über den Prozessor
> einen counter capture aus).

Warum nicht, wie genau mußt Du denn messen?

von Alexander S. (docalex)


Lesenswert?

Peter D. schrieb:
> Warum nicht, wie genau mußt Du denn messen?

So genau wie möglich .....

von Alexander S. (docalex)


Lesenswert?

m.n. schrieb:
> Du hast es nicht richtig verstanden. Der Text zum Programm beschreibt,
> wie es funktioniert.

Das mag sein, dass ich es nicht verstehe.

Was ich vor allem nicht verstehe:

Du liesst wohl das capture register aus:

T1_temp = TCNT1;          // capture-reg lesen: untere 16bit

aber wo löst Du den capture aus?

von Peter D. (peda)


Lesenswert?

Alexander S. schrieb:
> So genau wie möglich .....

Das ist Quatsch.
Bevor man eine Meßaufgabe anfängt zu programmieren, schreibt man erstmal 
die Anforderungen auf.

von myasuro (Gast)


Lesenswert?

Hallo,
erstmal musst du uns sagen, was deine Definition ist von zu ungenau. Du 
hast gigantische 1,5ms (1500 Cyklen (grob geschätzt 1000 Befehle) bei 
1Mhz) zwischen 2 Steigende Flanken, bzw. 0,75ms (750 Cyklen bei 
1Mhz)zwischen Steigend und Fallend (wenn 50:50 duty cycle), dann willst 
du uns erklären, dass es zu ungenau ist, Portchange Interrupt 
auszulösen, gucken welches Beinchen sich bewegt hat, dann 
dementsprechend die neue Periodenzeit wegspeichern.

Das ist schön lösbar, halt immer dran denken, keine Großen Sachen im 
Interrupt durchführen.

Warum willst du eigentlich Leistung bestimmen, du bestimmt ja eigentlich 
Energiequanten (ohh sehr grob gesprochen).

Mit freundlichen Gruß
Kerler Marian

von m.n. (Gast)


Lesenswert?

Alexander S. schrieb:
> Du liesst wohl das capture register aus:
>
> T1_temp = TCNT1;          // capture-reg lesen: untere 16bit

Nein, es ist nur ein falscher Kommentar stehen geblieben. TCNT1 ist der 
Zähler direkt.

von Alexander S. (docalex)


Lesenswert?

m.n. schrieb:
> Alexander S. schrieb:
>> Du liesst wohl das capture register aus:
>>
>> T1_temp = TCNT1;          // capture-reg lesen: untere 16bit
>
> Nein, es ist nur ein falscher Kommentar stehen geblieben. TCNT1 ist der
> Zähler direkt.

Ist die Zeile auch verkehrt?

 // nur, wenn capture-int + overflow-int gleichzeitig !

aus die deutet auf einen capture interrupt hin....

von m.n. (Gast)


Lesenswert?

Es war ursprünglich eine Routine für den input-capture Interrupt mit nur 
einem Kanal. Daher stimmen die Kommentare nicht immer.

von Alexander S. (docalex)


Lesenswert?

Dann ist es ja auch kein Wunder, dass ich das nicht verstehe :-)

von Peter D. (peda)


Lesenswert?

Der Durchfluß wird sich ja nicht jede Sekunde ändern, d.h. miß doch 
einfach nacheinander. Dazu kann man den ADC-MUX über den Comparator an 
den Capture-Input schalten.

von Alexander S. (docalex)


Lesenswert?

Peter D. schrieb:
> Der Durchfluß wird sich ja nicht jede Sekunde ändern, d.h. miß doch
> einfach nacheinander. Dazu kann man den ADC-MUX über den Comparator an
> den Capture-Input schalten.

Ja, das könnte ich machen. Nur wird dadurch das Rauschen (die 
Ungenauigkeit) größer.

Lieber nehme ich dann 8 Stk 328er, die über I2C als slaves die Messung 
an einen Master senden.

Viele Grüße

Alexander

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Alexander S. schrieb:
> Ja, das könnte ich machen. Nur wird dadurch das Rauschen (die
> Ungenauigkeit) größer.

Wie meinst Du das ?

> Lieber nehme ich dann 8 Stk 328er, die über I2C als slaves die Messung
> an einen Master senden.

Für so einen kleinkram einen 328er ?, da reicht doch einer aus der 
Familie des Attiny85 aus.

von m.n. (Gast)


Lesenswert?

Alexander S. schrieb:
> Lieber nehme ich dann 8 Stk 328er, die über I2C als slaves die Messung
> an einen Master senden.

Wozu? Ein ATmega328 reicht für alle acht Kanäle; ein Geizhals nimmt 
einen ATmega48.
Wenn man einen Arduino Uno verwenden möchte, bieten sich die PC0 - PC3 
und PD4 - PD7 als Eingänge an. IIC und USART Schnittstellen bleiben 
dabei frei verfügbar.

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.