Hallo,
ich bin auf der Suche nach Ideen, um eine Folge von Impulse zu speichern
und anschließend wiederzugeben.
Es ist wichtig, den zeitlichen Ablauf der Impulse zu speichern und deren
Länge. Ich brauch keine hohe Auflösung, da es sich nur um "0 oder 1"
handelt. Die maximale Frequenz aufeinanderfolgender Impulse liegt bei
wenigen hundert kHz. Gespeichert werden muss insgesamt max. 1s.
Ich dachte, ich nehme einen schnellen ADC, um das Signal abzutasten.
Diesen lese ich mit einem Mikrocontroller (z.B. Atmega32 o.ä.) aus und
speichere die Abfolge im EEPROM. Über einen Pin gebe ich anschließend
(auf Kommando hin) die gespeichert Abfolge wieder aus. Ist das so
realisierbar? Oder habe ich hier einen groben Denkfehler?
Viele Grüße
Deine Idee klingt ansich vernünftig. Ausser das mit dem ADC - wozu? Wenn
du weisst, es handelt sich um ein digitales Signal, genügt ein
Komparator oder Trigger als Eingangsstufe. Das mit dem EEPROM würde ich
evtl. auch nochmal hinterfragen, wenn du das Teil öfters benutzen willst
(Anzahl der Überschreibungen). Evtl. ist da ein gepuffertes SRAM die
bessere Wahl, auch wegen der Reaktionszeiten ...
Die Samplefrequenz sollte 3..5 mal höher sein als der kürzeste
vorkommende Zeitraum zwischen zwei Pegelwechseln - da bist du schnell im
MHz-Bereich.
ok, wenn ich z.B. einen Komparator nutze, dessen Ausgang "high" wird,
sobald ein Impuls anliegt, kann ich die steigende / fallende Flanke mit
einem (Interrupt-)Port am Mikrocontroller detektieren. Wie schnell kann
diese Reaktion ausgelöst werden, wenn ich dem Mikrocontroller z.B. mit
16MHz betreibe? Welche Verzögerungszeiten habe ich ungefähr bei z.B.
einem Atmega32 o.ä.?
Lukas BD schrieb:> einem (Interrupt-)Port am Mikrocontroller detektieren. Wie schnell kann> diese Reaktion ausgelöst werden,> wenn ich dem Mikrocontroller z.B. mit> 16MHz betreibe? Welche Verzögerungszeiten habe ich ungefähr bei z.B.> einem Atmega32 o.ä.?
realistisch musst du in einem C-Programm mit ca. 20 Takten Verzögerung
rechnen. Wenn der Interrupt kommt, wird der momentan aktive µC Befehl
fertig gemacht, ehe dann die ISR angesprungen wird und in der ISR
sichert der Compiler erst mal ein paar Register (je nachdem was so alles
benutzt wird). Aber ich würde sagen, so um die 20 Zyklen ist
einigermassen realistisch.
Lukas BD schrieb:> wenigen hundert kHz> Gespeichert werden muss insgesamt max. 1s.> z.B. Atmega32 o.ä.> EEPROM
Hm...
Den zeitliche Ablauf einer Impulsfolge mit "wenigen hundert kHz" über 1s
per AtMega32 abzutasten, und dann Länge/Zeitpunkte im (internen?) EEPROM
abzuspeichern, dürfte einige unlösbare Probleme nach sich ziehen.
Zur Abtastung: Das Stichwort dafür lautet Input Capture. Damit verlierst
du schonmal keine 20 Zyklen.
Aber wohin du die in 1s anfallende Datenmenge in einem AtMega dann
abspeichern willst, ist mir noch nicht so ganz klar.
Oliver
> Welche Verzögerungszeiten habe ich ungefähr> bei z.B. einem Atmega32 o.ä.?
ist denn eine Verzögerungszeit bei der gegebenen Aufgabenstellung
(capture der 0-1 und 1-0 Übergänge) überhaupt wichtig? Ob das nun 10 uS
oder 1 mS oder gar 1 S dauert ist doch ziemlich "wurscht", hauptsache es
wird immer gleich lang verzögert, und es geht kein Ereignis verloren
....
Ich hab mal ein Programm geschrieben (AVR Assembler), welches die
Impulsfolgen aufnimmt und wiedergegen kann. Das geht recht gut mit dem
Input Capture Pin. Um ausreichende Genauigkeit zu erzielen, musste ich
jede Pulslänge als 16 Bit abspeichern, da wirds recht eng mit dem
internen Ram....
Oliver schrieb:> Aber wohin du die in 1s anfallende Datenmenge in einem AtMega dann> abspeichern willst, ist mir noch nicht so ganz klar.
Das mit dem Atmega war auch nur ein erster Vorschlag. Was würdest du
empfehlen?
Wegstaben Verbuchsler schrieb:> hauptsache es> wird immer gleich lang verzögert, und es geht kein Ereignis verloren
Das ist richtig. Ist für meine geplante Anwendung nicht von Interesse,
solange die Verzögerung gleich bleibt.
Dr G. Reed schrieb:> Ich hab mal ein Programm geschrieben (AVR Assembler), welches die> Impulsfolgen aufnimmt und wiedergegen kann. Das geht recht gut mit dem> Input Capture Pin. Um ausreichende Genauigkeit zu erzielen, musste ich> jede Pulslänge als 16 Bit abspeichern, da wirds recht eng mit dem> internen Ram....
Hast du den Quelltext veröffentlicht oder kannst du nähere
Detailinformationen zur verwendeten Hardware geben und zur
Programmierung geben?
Lukas BD schrieb:> Das mit dem Atmega war auch nur ein erster Vorschlag. Was würdest du> empfehlen?
Der µC muss folgende Dinge erledigen:
- Auf den Input Capture reagieren.
- Notwendige Register retten
- Den Timer (16Bit) auslesen.
- Den Wert abspeichern
- Register zurückspeichern.
- Interrupt beenden
Du redest von wenigen 100kHz. Wenn man 400KHz annimmt sollte man um
etwas Puffer zu haben nicht länger als 2µs dafür brauchen.
Maximal brauchst du dann theoretisch 200.000 * 2Byte RAM.
Achtung bei 16Bit Timer und z.B. 1µs Tick läuft der 16 Bit Timer nach 64
ms über!
Jetzt hast du eigentlich alle Werte um dir einen µC rauszusuchen.
Lukas BD schrieb:> Ich brauch keine hohe Auflösung, da es sich nur um "0 oder 1"> handelt. Die maximale Frequenz aufeinanderfolgender Impulse liegt bei> wenigen hundert kHz.
Welche Auflösung brauchst Du genau? 1µs, 100ns, 10ns?
Welches ist die maximale und welches die minimale Frequenz und wieviele
Flankenwechsel/s werden erwartet?
Wenn es einen Tick mehr kosten darf als 0815, dann nimm einen µC mit ICP
und DMA und ggf. ext. RAM.