Forum: Mikrocontroller und Digitale Elektronik atmega8 mit 3ADCs und 500kHz betriben


von Konstanze M. (konstanzem)


Angehängte Dateien:

Lesenswert?

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

von Benedikt K. (benedikt)


Lesenswert?

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?

von Konstanze M. (konstanzem)


Lesenswert?

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

von Ronald S. (mline)


Lesenswert?

13 weil das Wandeln 13 Zyklen benötigt.

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

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.

von Benedikt K. (benedikt)


Lesenswert?

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.

von Helmut L. (helmi1)


Lesenswert?

Nimm ein retriggerbares Monoflop ala 74xx4538 und gut ist. Wenn das dann 
nicht mehr getriggert wird ist dein Signal ausgefallen

Gryuss Helmi

von Stefan K. (syliosha)


Lesenswert?

@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.

von BenQ (Gast)


Lesenswert?

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

von Konstanze M. (konstanzem)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Helmut L. (helmi1)


Lesenswert?

>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
Noch kein Account? Hier anmelden.