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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Alexander S. (docalex)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

So genau wie möglich .....

von Alexander S. (docalex)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Peter D. (peda)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

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]
  • [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.