Forum: Mikrocontroller und Digitale Elektronik Frequenzen von mehren Sensoren mit Input Capture (Timer1)


von PP (Gast)


Lesenswert?

Hallo,

möchte gerne mehrere Sensoren mit einem uC (Atemel Mega16 oder so) 
auslesen. Diese geben ihre Werte in Form einer sich ändernden Frequenz 
aus. Um die zu messen dachte ich an die Input Capture Funktion über den 
ICP.
Von dem gibt es aber nur einen. Jetzt hatte ich überlegt das einfach mit 
Logikbausteinen und I/O vom uC zu lösen. (Also pro Sensor ein Select 
Ausgang vom uC (CS) und mit diesem den Sensor (S) durchschalten: 
ICP=(CS1^S1)v(CS2^S2))
Jetzt meine Frage, habt Ihr eine Idee wie ich das einfacher realisieren 
kann?
bzw habt Ihr eine bessere Idee?
Bräuchte so ja entsprechend Bausteine mit ^ und v Logik...
Abfrage der Sensoren erfolg mit >= 1min, Frequenz liegt je nach Sensor 
zwischen 5-10kHz und 500-1000kHz (evt kommen noch andere hinzu).


Gruß
PP

von Gast (Gast)


Lesenswert?

Wie währe es mit einem Multiplexer?

von PP (Gast)


Lesenswert?

Ein Multiplexer bringt mir da doch nix, oder?
Muss ja einen Ausgang immer durchschalten.

von AVRFan (Gast)


Lesenswert?

>dachte ich an die Input Capture Funktion über den ICP.

Wie wäre es, jedem Sensor einfach timergesteuert eine feste Zeitspanne 
von z. B. 20 ms zu spendieren (reihum, jedesmal wenn die Minute 
verstrichen ist), und innerhalb dieser Zeit die steigenden Flanken des 
Sensorsignals zu zählen?  Der 500-1000 kHz-Sensor erzeugt während 20 ms 
10000-20000 steigende Flankenwechsel; das erfordert also eine 
16-Bit-Zählvariable.  Bei einer µC-Taktfrequenz von z. B. 16 MHz sollte 
man mit Assemblercode problemlos alle steigenden Flanken detektieren und 
zählen können.

Der lahme 5 kHz-10 kHz-Sensor erzeugt nur 100-200 steigende Flanken 
während 20 ms.  Vielleicht ist die Auflösung hier schon zu gering.  Dann 
gibt man ihm halt mehr Zeit, z. B. 200 ms.

PS: Welcher Sensor erzeugt Frequenzen bis 1000 kHz?  Das erscheint mir 
ja doch schon sehr viel.

von PP (Gast)


Lesenswert?

Das währe natürlich auch eine Idee...
Dann über Interrupt die Flanken detektieren?
Das mit den 500-1000kHz war ein versehen, hab mich da irgendwie 
versehen. Kann irgendwie auch nicht mehr nachvollziehen wie ich drauf 
gekommen bin.
Der Sensor geht max von  0-60kHz
( http://www.taosinc.com/images/product/document/TSL237-E33.pdf )
Sorry für die Verwechslung, hatte mir da was falsch aufgeschrieben :(

von Uwe .. (uwegw)


Lesenswert?

PP wrote:
> Dann über Interrupt die Flanken detektieren?
Ja. Dafür wäre ein AVR mit Pin-Change-Interrupt optimal. Ein Mega16 hat 
ja nur drei externe Interrupts.

von AVRFan (Gast)


Lesenswert?

>Dann über Interrupt die Flanken detektieren?

Wüsste nicht wozu. Du kannst das Sensorsignal problemlos ganz normal in 
einer Schleife einlesen, solange die "Torzeit" andauert, welche per 
Timerinterrupt beendet wird. Der Vorteil ist, dass Du dann beliebig 
viele Sensoren behandeln kannst; max Anzahl Sensoren = Anzahl der 
Portpins.  Externe Interrupts (ich meine nicht die Pin Change 
Interrupts) gibts dagegen nur zwei oder drei.  Was machst Du, wenn Du 
acht Sensoren hast?  Irgendeine Multiplex-Zusatzlogik an den Controller 
anschließen?

Der externe Interrupt kann sich übrigens auch als übel erweisen, wenn Du 
Störungen auf der Sensorleitung hast (Zuleitungen zu den Sensoren: 
Länge, Abschirmung, elektrisches Umfeld?).  Der reagiert nämlich auch 
auf den kleinsten Störpeak.  Bei dem Pollingverfahren hast Du dagegen 
die Möglichkeit, Störungen gegebenenfalls auszufiltern.

Wenn der Sensor 60 kHz erzeugt, bedeutet das, dass die steigenden 
Flanken im Abstand von 1/60000 s = 16.666 µs hereinschneien.  Ein mit 16 
MHz getakteter AVR kann während 1 µs ungefähr 10 Instruktionen 
ausführen, also schafft er während 16.666 µs wunderbare 166 
Instruktionen.  Das reicht x mal aus, um den Sensor-Pinzustand 
einzulesen, zu prüfen, ob der Pegel von L auf H gewechselt hat, wenn ja 
eine 16-Bit-Variable hochzuzählen, und eventuell eine gewisse Zeitspanne 
zu warten (die einfachste Maßnahme gegen Störungen).

von Ulrich (Gast)


Lesenswert?

Der Mega16 hat einen internen Multiplexer für die ADs, der auch für den 
analogen Komperator benutzt werden kann und der Komperator kann auch für 
die ICP-funktion genutzt werden. Der einzige Nachteil ist, das man damit 
jeweils einen AD kanal blockiert.

Für die hohen Frequenzen (ca. > 300 kHz) sollte bzw. muss man einen 
Takteingang, denn da reicht die Zeit zum verarbeiten sonst nicht aus.

von PP (Gast)


Lesenswert?

@AVRFan
Klingt eigentlich ganz gut, dann hat man entsprechend über dir Torzeit 
auch gleich eine Mittlung/Mittelwertbildung drin die kurze Schwankungen 
herausfilter.
Das einzige was mir da nicht sooo ganz gefällt ist das er halt die ganze 
Torzeit über pollt und nix anderes machen kann.

@Ulrich
Hab ich vorhin auch grade gelesen, auch ein gute Sache.

Werde mir das jetzt noch mal genau anschauen und dann mal beides testen 
und schauen was die stabilsten Werte liefert. Brauch ich nur noch eine 
Referenz.. :)

Danke schon mal und Gruß
PP

von Ulrich (Gast)


Lesenswert?

Wenn das normale Sensoren (z.B. Temperatur) mit Frequenzausgang sind, 
sollte ein normaler Quarz reichen.
Wenn man bei der Perioden Messung zu viele Schwankungen hat, einfach 
über ein paar mehr perioden mitteln. Optimal wäre eine lineare 
Interpolation der Zeiten für die einzelnen Flanken. Klingt komplizierter 
als es ist, aber der Aufwand ist nur selten nötig.

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.