mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 15 x 1ms Impulsbreite messen


Autor: Mehel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich muss auf 15 Kanälen die Impulsbreite eines ca. 1ms breiten Signals 
messen und frage mich ob das mit einem Atmega in C zu machen ist? Das 
System soll die Daten als I2C slave zur Verfügung stellen.

Das Problem ähnelt der PPM decodierung bei Funkfernsteuerungen da 
zwischen den Pulsen auch ca. 20ms Zeit ist. Ich hab aber noch kein 
Projekt mit so vielen Kanälen gesehen. Ausserdem kommen die Impulse bei 
meinem Problem nicht sequentiell sondern asynchron...

Bei 8 bit Auflösung müsste ich die Pins mit ca. 512kHz abfragen, dh. da 
bleiben nur 40 Takte bei 20Mhz... und ich hab warscheinlich berechtigte 
Zweifel dass das reicht. Bei Interrupts könnte ich potentiell eine 
Änderung übersehen (abgesehen davon, dass ich keine 15 Interrupts 
habe...)

Weiss jemand von Euch einen Kniff? Gibt's da spezielle ICs die sowas 
machen?

-mj

Autor: MB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann dir leider nicht detailliert weiterhelfen, aber vielleicht 
hilft es dir das ganze direkt in einen SRAM (16Bit) zu schieben. Durch 
das anschließende Auslesen (nach der Messung) sind die Zeitpunkte durch 
die Adresse auch bekannt. Das ganze muss eben schnell genug sein um eine 
hohe Auflösung gewährleisten zu können. (wegen den Flanken, sofern diese 
relevant sind)b

Fraglich ist nur, ob das ebenfalls keinerlei Timing-Problemen zum Opfer 
fallen wird. Ich glaube ein SRAM sollte aber nicht mehr als 70ns 
brauchen.
Nachteil ist natürlich der höhere Schaltungsaufwand und die Kosten.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mehel (Gast)

>Projekt mit so vielen Kanälen gesehen. Ausserdem kommen die Impulse bei
>meinem Problem nicht sequentiell sondern asynchron...

Dann wird das wohl nix mit dem AVR. der hat keine 15 ICP Eingänge.

>Weiss jemand von Euch einen Kniff?

Da wird man wohl einen CPLD oder so brauchen. Oder man nimmt 15 kleine 
8-Pin AVRs, welche einen Kanal messen und per I2C zurückmelden.

> Gibt's da spezielle ICs die sowas machen?

Keine Ahnung. AFIAK nein.

MfG
Falk

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Dann wird das wohl nix mit dem AVR. der hat keine 15 ICP Eingänge.

Könnte man nicht ein ICP per PinChange-Interrupt realisieren?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  STK500-Besitzer (Gast)

>Könnte man nicht ein ICP per PinChange-Interrupt realisieren?

Nicht bei 512 kHz Abtastrate und 15 ASYNCHRONEN Kanälen.

MFG
Falk

Autor: Gasst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das System soll die Daten als I2C slave zur Verfügung stellen.

Wenn der Platz vorhanden ist, könntest Du 15 x Tinys einsetzen - pro 
Kanal einen. Der passende Typ sollte IIC ermöglichen, oder ein zentraler 
AVR sammelt die Daten nur ein (seriell) und sendet sie weiter.

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brauchst du bei dem Signal wirklich 10 Bit Auflösung? Mit weniger 
auslösung, d.h. geringerer Samplerate sollte das ein AVR gerade noch so 
per polling schaffen, vielleicht etwas Jitter, aber evtl könnte man die 
kommunikation mit einem 2. AVR lösen, der die Daten Parallel vom ersten 
bekommt.

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso geht das nicht mit dem internen SRAM des AVR?
Ein Timer auf 512 kHz einstellen. Innerhalb der ISR 2 Ports in ein int 
einlesen und mit dem Int aus der "letzten Runde" mit exor vergleichen. 
Wenn ungleich 0 > Flag setzen und in der while(1) schleife asynchron 
dieses Flag abfragen. Ist es gesetzt, auswerten, welches Bit sich 
geändert hat.

Parallel dazu läuft ein Timer (oder der selbe), der dann die 
entsprechende Zeit zählt.

Autor: Hans-jürgen Herbert (hjherbert) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso geht das nicht mit dem internen SRAM des AVR?
Ein Timer auf 512 kHz einstellen.

Innerhalb der ISR
Zeitzähler erhöhen
2 Ports in ein int
einlesen und mit dem Int aus der "letzten Runde" mit exor vergleichen.
Wenn ungleich dann Zeitstempel und Wert abspeichern.
              und den Abspeicherindex erhöhen.
Nach dem 30 mal den Interrupt wieder sperren.

Autor: Gasst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Innerhalb der ISR 2 Ports in ein int einlesen und mit dem Int aus >der "letzten 
Runde" mit exor vergleichen.

... und in der restlichen Zeit den Prozessor noch schlafen legen.
Für eine erfolgsversprechende Lösung ist das Timing zu eng (riskant).

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.