Forum: Mikrocontroller und Digitale Elektronik Atmega1284P , Drei Frequenzen messen


von Dennis H. (somebuddy)


Lesenswert?

Guten Morgen,

Ich möchte mit einem Atmega1284P 3 Impulse messen. Es handelt sich dabei 
um Rechteck Signale zwischen 0-70 Hz. Bei nur einem Signal wäre es durch 
die Input capture Unit recht einfach zu lösen , doch wie gehe ich bei 3 
Signalen vor ? Der zweite ICP Pin von Timer3 ist zwecks SPI belegt.

Dachte schon an die Benutzung des einen ICP und einen externen Mux, aber 
das muss doch sicher auch eleganter zu lösen sein.


Gibt es eine Möglichkeit Polling zu vermeiden ? Sprich zum Beispiel jede 
Sekunde zu warten bis eine Signal Änderung am jeweiligen Pin ansteht und 
mir daraus die Frequenz errechnen ?

Vielleicht habt ihr ja noch eine passende Lösung oder Strategie in der 
Schublade.

Vielen Dank

von Klaus D. (kolisson)


Lesenswert?

Schau mal nach dem ACI Interrupt.
Der Analog Comparator ist durch den Amux auf jeden beliebigen 
Analogeingang
aufschaltbar.
Dann könntest du mit der gleichen Routine erst den einen und dann den 
anderen  Eingang vermessen.

Gruss Klaus

p.s.
ein wenig undokumentierten Inlineassembler dazu habe ich noch

von Wolfgang (Gast)


Lesenswert?

Dennis Henning schrieb:
> Ich möchte mit einem Atmega1284P 3 Impulse messen. ...
> Gibt es eine Möglichkeit Polling zu vermeiden ?

Warum? Bei 70 Hz müßte man mit mindestens 7 ms Zeitauflösung pollen. 
Warum soll man nicht z.B. per Timer regelmäßig alle paar ms eine ISR 
aufrufen, die sowieso oft als Basistakt für Tastaturentprellung 
vorhanden ist, und damit auch gleich die drei Impulse messen.
Es kommt natürlich drauf an, was du an deinen 3 Impulsen messen möchtest 
und in welchem Bereich das Tastverhältnis liegt. Wenn du die 
Flankensteilheit messen möchtest, wird es ohne Zusatzelektronik z.B. 
schwierig.

von Werner (Gast)


Lesenswert?

Mußt du die Frequenzen gleichzeitig messen? Du könntest im Zeitmultiplex 
die Periodendauern nacheinander messes. Deine untere Signaleßfrqeuenz 
von 0Hz müßtest du dann per Timeout abfangen.

von m.n. (Gast)


Lesenswert?

Der ATmega1284 hat wie der ATmega162 zwei Capture-Einheiten, je für T1 
und T3. Damit kann man zwei Eingangsfrequenzen mit hoher Auflösung 
gleichzeitig messen. Als Beispiel: 
Beitrag "reziproker Frequenzzähler, GPS-stabilisiert, ATmega162"

Wenn eine 5-stellige Anzeige bei ca. 3 Messungen/s reicht, schafft man 
mit dem ATmega1284 auch vier Kanäle gleichzeitig zu messen. Beispiel: 
Beitrag "4-Kanal Drehzahlmessung mit ATmega88"
Das Programm schafft es sogar bei 0 Hz auch '0' anzuzeigen, wenn man 
sich auf 0 Hz als <= 0,016 Hz verständigen kann :-)

von Dennis H. (somebuddy)


Lesenswert?

das reicht vollkommen ! Selbst wenn auf eine Kommastelle gerundet würde 
, wäre es ausreichend !

Der letzte Link hat mir schonmal sehr geholfen.
Danke

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


Lesenswert?

Warum nicht den Pin-Change-Interrupt verwenden und auf die betreffenden 
Pins maskieren?
In der Interrupt-Routine könntest du auf die jeweils gesetzten 
Interrupt-Flags reagieren: gesetzte Flags jeweils zählen und löschen.

Weiteres steht im Datenblatt, such einfach nach PCICR, PCIFR, PCMSK3 bis 
PCMSK0, Interrupt-Vektoren für PCINT0 bis PCINT3.

von Dennis (Gast)


Lesenswert?

@ markus

Funktioniert das also nur an PCINT 0 bis PCINT 3 ?

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


Lesenswert?

Dennis schrieb:
> @ markus
>
> Funktioniert das also nur an PCINT 0 bis PCINT 3 ?

Hi Dennis, sorry, seh deine Antwort erst jetzt. Wenn ich das Datenblatt 
richtig gelesen hab, dann kann man jeden dieser vier PCINTs für einzelne 
I/O-Pins eines Ports einstellen. Schau einfach mal ins Datenblatt, da 
steht einiges dazu drin.

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.