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.
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!
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
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.
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
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 ?
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.
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.
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?
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?
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.
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
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.
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....
Es war ursprünglich eine Routine für den input-capture Interrupt mit nur einem Kanal. Daher stimmen die Kommentare nicht immer.
Dann ist es ja auch kein Wunder, dass ich das nicht verstehe :-)
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.