mikrocontroller.net

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


Autor: PP (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie währe es mit einem Multiplexer?

Autor: PP (Gast)
Datum:

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

Autor: AVRFan (Gast)
Datum:

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

Autor: PP (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/TSL... )
Sorry für die Verwechslung, hatte mir da was falsch aufgeschrieben :(

Autor: Uwe ... (uwegw)
Datum:

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

Autor: AVRFan (Gast)
Datum:

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

Autor: Ulrich (Gast)
Datum:

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

Autor: PP (Gast)
Datum:

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

Autor: Ulrich (Gast)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.