Hallo Leute. Ich will mit einem Atmega8 drei 100kHz Rechteck-Signale abtasten. Das ganze soll eine Art Überwachung sein. Wenn sich das Signal noch ändert funktioniert die Schaltung noch, wenn nicht soll der Atmel den Kanal ausschalten. Mit einem prescale-faktor von 16 läuft der ADC auf 500kHz. Das Signal muss auch nicht mit 10 Bit abgetastet werden. da lediglich die Änderung von Bedeutung ist. Ich habe mit dem Arduinoboard angefangen mit µCs zu arbeiten aber für diesen Zweck ist es nicht schnell genug. Der Code ist ein eher zusammen gesammelt, drum verzeiht mir. Für einen Kanal hats funktioniert aber bei dreien geht nichts. vielen Dank wenn mir da einer von euch den entscheidenen Tipp geben könnte Konstanze
Konstanze Mürtel schrieb: > Ich will mit einem Atmega8 drei 100kHz Rechteck-Signale abtasten. Das geht nicht. > Mit einem prescale-faktor von 16 läuft der ADC auf 500kHz. Der ADC ja, aber die Samplerate beträgt dann 500kHz/13=38,5kHz. > Das Signal muss auch nicht mit 10 Bit abgetastet werden. da lediglich > die Änderung von Bedeutung ist. Wenn es sowieso Rechtecksignale sind, wieso nimmst du dann nicht die normalen Portpins?
Aber warum 500/13? Bei drei Eingängen wären es doch 166kHz samplefrequenz. Könntest du das mit den Portpins genauer erläutern?. Ich war auch nicht sicher ob man die internen Komparatoren bei diesen Frequenzen benutzen kann. Ich glaub die waren zu langsam. schön Gruß konstanze
Konstanze Mürtel schrieb: > Aber warum 500/13? Weil eine AD-Wandlung 13 Takte braucht. > Könntest du das mit den Portpins genauer erläutern?. Ich war auch nicht > sicher ob man die internen Komparatoren bei diesen Frequenzen benutzen > kann. Ich glaub die waren zu langsam. Wofür Komparatoren? Du brauchst doch nur drei Pins, um jedes Signal abzutasten. Einfach den Zustand des Pins einlesen. Eventuell davor noch irgendeine Schaltung zur Pegelanpassung, das hängt von deinem Rechtecksignal ab.
Konstanze Mürtel schrieb: > Aber warum 500/13? > > Bei drei Eingängen wären es doch 166kHz samplefrequenz. Nein, schau mal ins Datenblatt, Abschnitt ADC: Der ADC benötigt 13 Takte für eine Messung. > Ich war auch nicht > sicher ob man die internen Komparatoren bei diesen Frequenzen benutzen > kann. Ich glaub die waren zu langsam. Dann halt externe (falls die Pegel nicht direkt schon geeignet sind) und die daraus erzeugten Digitalsignale dann an normale IO Pins. Wenn alle 3 Rechtecksignale am gleichen Port hängen, kannst du alle 3 Signale gleichzeitig einlesen. Bei 100kHz musst du mit mindestens 200kHz einlesen um die Signale richtig zu erfassen. Da hat der AVR ganz schön was zu tun.
Nimm ein retriggerbares Monoflop ala 74xx4538 und gut ist. Wenn das dann nicht mehr getriggert wird ist dein Signal ausgefallen Gryuss Helmi
@Benedikt er sollte es schon mit mehr als 200kHz abtasten, sonst kann es passieren das es immer 0 ist oder immer high wenn er mit genau 200kHz abtasen würde. Davon ab würd ich ehr bezweifeln das der AVR das schafft. Einlesen über Portpins sicher, aber dann noch eine Verarbeitung der Werte dürfte schwierig werden.
Hallo Konstanze, um wertvolle Prozessorzeit einzusparen könntest du einen Pin-On-Change Interrupt verwenden. Sobald sich ein Pinzustand ändert (egal ob von High auf Low oder umgekehrt) wird ein Interrupt ausgelöst und dein Mikrocontroller springt in eine von dir definierte Interruptroutine. In dieser könntest du einen laufenden Zähler (z.B. Timer 0 des MEGA8) zurücksetzen. Bleibt dein Rechtecksignal stehen, kommt es zu einem Zählerüberlauf, der einen weiteren Interrupt auslöst und dir ein ausbleibendes Rechtecksignal anzeigt. Viele Grüße, BenQ
Vielen Dank schonmal für die vielen Antworten Wo fang ich an. Also das Signal schaltet Bauteile und wenn diese kaputt sind kommt hinten weder high oder low, f=0Hz raus. Dann sollte das der µC so langsam bemerken und abschalten(er hat dafür meinetwegen auch 10sec Zeit). Deshalb denke ich dass auch 110kHz Abtastrate reichen müssen. Wenn innerhalb einer Sekunde nicht high und low erreicht wurde, dann Bauteil futsch. Das Schaltsignal ist leider auch von einem externen Signalgenerator gegeben und zwischen 10kHz und 100kHz einstellbar. Dashalb denk ich ist die monoflopsache nicht die einfachste. Außerdem hab ich mich oben verschrieben. Bei 16MHz und prescaler 16 wirds ja 1MHz. Ist das realistisch? Prinzipiell kann der µC auch einen Kanal auswerten, dh. lesen, entscheiden geht noch, dann den nächsten usw. Hat jemand evtl mal in den Code geschaut :) konstanze
Konstanze Mürtel schrieb: > Das Schaltsignal ist leider auch von einem externen Signalgenerator > gegeben und zwischen 10kHz und 100kHz einstellbar. Dashalb denk ich ist > die monoflopsache nicht die einfachste. Doch ist es. Wie schnell das Monoflop getriggert wird ist ja Nebensache. Bekommt es eine Zeitlang kein Signal, dann fällt es in seinen Ausgangszustand zurück. Diese 'Zeitlang' muss so dimensioniert sein, dass das langsamste mögliche Signal eine Chance hat, das Monoflop getriggert zu halten. Ist es schneller: kein Problem. Du dimensionierst es auf 10kHz und die von dir gewünschte Detektierzeit. Wird es von 100kHz schneller getriggert, spielt das keine Rolle. Du kannst es auch auf 5kHz dimensionieren, wenn du willst, musst dann aber die Haltezeit entsprechend verlängern. > Außerdem hab ich mich oben verschrieben. Bei 16MHz und prescaler 16 > wirds ja 1MHz. Ist das realistisch? Nein. Immer noch viel zu viel Aufwand für nichts. Wenn man allerdings einen µC für so etwas einsetzt, dann geht man nicht über den ADC. Du hast Rechtecksignale. Die musst du (oder auch nicht) elektronisch so aufbereiten, dass du sie auf µC Pins legen kannst. Wurde oben schon mal gesagt. Sinnigerweise legt man die auf nebeneinanderliegende Pins. Deine Hauptschleife ist dann so etwas in der Art
1 | Status = 0; |
2 | |
3 | while( 1 ) |
4 | Status = Status | ( PINB & 0x07 ); |
Wenn die 3 Signale zb an PINB - PB0, PB1, PB2 hängen. In einem Timerinterrupt sieht man zb alle 10ms nach, ob Status den Wert 0x07 hat und setzt ihn wieder auf 0. War Status nicht 0x07, dann ist ein Kanal ausgefallen, denn ansonsten wäre ja das für diesen Kanal zuständige Bit in der Hauptschleife gesetzt worden. In diesem Fall wird dann entsprechend reagiert. Wenn das 'darauf reagieren' nicht allzuviel Aufwand ist, macht man das in der ISR gleich mit. Um sicher zu gehen, dass man nicht einem Dauerhigh aufsitzt und dieses mit einem Puls verwechselt, kann man das Ganze auch noch in der anderen Richtung machen:
1 | StatusLow = 0; |
2 | StatusHigh = 0x07; |
3 | |
4 | while( 1 ) { |
5 | Channels = PINB & 0x07; |
6 | StatusLow = StatusLow | Channels; |
7 | StatusHigh = StatusHigh & Channels; |
8 | }
|
Solange StatusLow alle paar Millisekunden den Wert 0x07 und StatusHigh den Wert 0x00 hat, sind alle 3 Signale noch da.
>Dashalb denk ich ist die monoflopsache nicht die einfachste.
Das ist die Simpleste Methode zu detektieren ob ein Signal vorhanden ist
oder nicht.
1 1/2 74xx4538 und 3 Widerstaende und 3 Kondensatoren das wars.
Widerstand 100K
Kondensator 4.7nF
ergibt untere Grenzfrequenz von 6KHz.
Gruss Helmi
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.