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
Ein Multiplexer bringt mir da doch nix, oder? Muss ja einen Ausgang immer durchschalten.
>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.
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 :(
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.
>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).
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.
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.