Forum: Mikrocontroller und Digitale Elektronik Mehrere Signale über einen ADC messen


von Radium (Gast)


Lesenswert?

Hi,
habe folgendes Problem:
Ich muss drei Signale mit dem ADC des Atmega8 messen. Nun hat man 
eigentlich doch nur zwei Möglichkeiten: Extern zwischen drei 
verschiedenen Zuleitungen (auf einen Pin) oder intern zwischen drei 
verschiedenen Pins hin und her zu schalten. Was ist nun besser, externe 
Transistoren oder Multiplexing? (Ich würde eher zu den ext. Transistoren 
tendieren, bin mir aber nicht sicher. Macht die Sample and 
Hold-Schaltung bei Multiplexing nicht Probleme, sodass man quasi ein 
"hallen" in der Messung hätte?)

von Ingo L. (Gast)


Lesenswert?

Du nimmst, wie normal, direkt 3 Pins und multplext diese. Alles andere 
ist unsinnig.

von Radium (Gast)


Lesenswert?

Ingo L. schrieb:
> Du nimmst, wie normal, direkt 3 Pins und multplext diese. Alles andere
> ist unsinnig.

Hmm, ok. Kann man das so realisieren?

    ldi     r16, 64
    out     ADMUX, r16
    ldi     r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
    out     ADCSRA, r16

 ///1.
sample_adc:
    sbi     ADCSRA, ADSC

wait_adc:
    sbic    ADCSRA, ADSC
    rjmp    wait_adc

    in      adlow1, ADCL
    in      adhigh1, ADCH

    ldi     r16, 64
    out     ADMUX, r16
    ldi     r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
    out     ADCSRA, r16
    ...


//2.
     ldi     r16, 65
    out     ADMUX, r16


sample_adc:
    sbi     ADCSRA, ADSC

wait_adc:
    sbic    ADCSRA, ADSC
    rjmp    wait_adc

    in      adlow2, ADCL
    in      adhigh2, ADCH


    ldi     r16, 64
    out     ADMUX, r16
    ldi     r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
    out     ADCSRA, r16
    ...

//3.
     ldi     r16, 66
    out     ADMUX, r16

sample_adc:
    sbi     ADCSRA, ADSC

wait_adc:
    sbic    ADCSRA, ADSC
    rjmp    wait_adc

    in      adlow3, ADCL
    in      adhigh3, ADCH

von spess53 (Gast)


Lesenswert?

Hi

>Macht die Sample and
>Hold-Schaltung bei Multiplexing nicht Probleme, sodass man quasi ein
>"hallen" in der Messung hätte?)

Nein. Wenn die Impedanz der Quellen und die ADC-Frequenz stimmen.

MfG Spess

von Radium (Gast)


Lesenswert?

>
>     ldi     r16, 64
>     out     ADMUX, r16
>     ldi     r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
>     out     ADCSRA, r16
>
>  ///1.
> sample_adc:
>     sbi     ADCSRA, ADSC
>
> wait_adc:
>     sbic    ADCSRA, ADSC
>     rjmp    wait_adc
>
>     in      adlow1, ADCL
>     in      adhigh1, ADCH
>
>     ldi     r16, 64
>     out     ADMUX, r16
>     ldi     r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
>     out     ADCSRA, r16
>     ...

Muss natürlich so heißen :

     ldi     r16, 64
     out     ADMUX, r16
     ldi     r16, (1<<ADEN) | (1<<ADPS2) | (0<<ADPS1) | (1<<ADPS0) ;!!!
     out     ADCSRA, r16

  ///1.
 sample_adc:
     sbi     ADCSRA, ADSC

 wait_adc:
     sbic    ADCSRA, ADSC
     rjmp    wait_adc

     in      adlow1, ADCL
     in      adhigh1, ADCH

von Radium (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Macht die Sample and
>>Hold-Schaltung bei Multiplexing nicht Probleme, sodass man quasi ein
>>"hallen" in der Messung hätte?)
>
> Nein. Wenn die Impedanz der Quellen und die ADC-Frequenz stimmen.
>
> MfG Spess

Also die ADC-Frequenz soll zwischen 50 und 200kHz sein, dh bei mir also 
125kHz (4MHz µC und 32 Vorteiler). Die Impedanz der Quellen, ob die wohl 
im Datenblatt des Sensors steht... Oder kann man das auch messen?
Andererseits, sollte es richtig sein, dass der ADC nach jedem 
initalisieren (Wechsel des Kanals) neugestartet werden muss; bedeutet 
das nicht auch, dass man die Frequenz "manuell " einstellen muss?

von Karl H. (kbuchegg)


Lesenswert?

Du musst gar nichts neu startetn.
Du schaltest mit den MUX Bits den nächsten EIngang auf den ADC und 
misst.

von spess53 (Gast)


Lesenswert?

Hi

>Die Impedanz der Quellen, ob die wohl im Datenblatt des Sensors steht...

Musst halt mal nachsehen.

>Oder kann man das auch messen?

Kann man schon. Ausgang belasten und messen. Meistens reicht aber ein 
Kondensator nach Masse am jeweiligen ADC-Eingang.

>Andererseits, sollte es richtig sein, dass der ADC nach jedem
>initalisieren (Wechsel des Kanals) neugestartet werden muss; bedeutet
>das nicht auch, dass man die Frequenz "manuell " einstellen muss?

Ein Wechsel des Kanals ist keine Initialisierung. Es reicht die MUX-Bits 
einzustellen und mit ADSC die Wandlung zu starten.

MfG Spess

von Radium (Gast)


Lesenswert?

Aja oke, also der ADC würde dann jede 1/f s messen, wie als ob immer der 
selbe Kanal ausgewählt wäre, dh folgende Sequenz wäre richtig ?

ldi     r16, 64  ;initialisieren
    out     ADMUX, r16
    ldi     r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
    out     ADCSRA, r16

 ///1.
sample_adc:            ; ADC starten (einmalig)
    sbi     ADCSRA, ADSC

wait_adc:               ; messen
    sbic    ADCSRA, ADSC
    rjmp    wait_adc

    in      adlow1, ADCL
    in      adhigh1, ADCH

    ... //irgendwas tun


//2.
     ldi     r16, 65   ;Kanal wechseln
    out     ADMUX, r16


wait_adc:
    sbic    ADCSRA, ADSC
    rjmp    wait_adc

    in      adlow2, ADCL
    in      adhigh2, ADCH


    ...   //irgendwas tun

//3.
     ldi     r16, 66   ;Kanal wechseln
    out     ADMUX, r16

wait_adc:
    sbic    ADCSRA, ADSC
    rjmp    wait_adc

    in      adlow3, ADCL
    in      adhigh3, ADCH

von Karl H. (kbuchegg)


Lesenswert?

Das würde nur funktionieren, wenn du den Free Running Modus nimmst. 
Ansonsten musst du den ADC natürlich schon mittels setzen des ADSC Bits 
in ADCSRA für jede Messung starten. Insofern war meine Aussage da oben 
nicht ganz korrekt. Aber dieses "Starten" musst du sowieso bei jeder 
Messung machen. Ob das am selben oder einem anderen MUX erfolgt, spielt 
keine Rolle.

1
     ldi     r16, 66   ;Kanal wechseln
2
    out     ADMUX, r16

sehr fehleranfällig, dieses Schreibweise. Du brauchst nur mal eine 
andere Konfiguration und schon hast du eine Menge Anpassarbeit am Hals.
Besser:
  ADMUX auslesen
  die MUX BIts auf 0 ziehen
  die neuen MUX Bits setzen
  nach ADMUX zurückschreiben

oder zumindest die ausführliche Bitschreibweise benutzen.


PS: Subroutinen sind schon erfunden, so dass man das nur einmal 
schreiben muss.

von Adder (Gast)


Lesenswert?

Hllo Radium

hat denn das mit dem Multiplexing jetzt geklappt? Welchen Multiplexer 
hast Du denn verwendet in Deiner Schaltung?

von Radium (Gast)


Lesenswert?

Das ist mir jetzt noch nicht ganz klar:
Wenn ich den ADC auf den FreeRunning Modus und auf eine Frequenz 
eingestellt habe (125kHz) läuft er ja mit dieser Frequenz, macht also 
8µs eine Messung. Wenn er jetzt aber auf Single Conversation steht, wie 
siehts da mit der Frequenz aus? Bspw. ich hätte jetzt wie in meinem 
Beispiel drei Messungen mit bisschen Verarbeitungscode nacheinander.?

@ Adder :
Am Anfang des Threads stand ja die Frage ob externer Multiplexer oder 
intern "multiplexen". Direkt zu Beginn wurde mir empfohlen intern 
zwischen den Channels zu schalten (das hab ich mit intern "multiplexen" 
gemeint), darüber handelt bis jetzt der Thread-> Ich habe also keinen 
Multiplexer.

von JojoS (Gast)


Lesenswert?

Nicht vergessen das der ADC mehrere Takte für eine Wandlung braucht, der 
ATMega braucht zB 13 Takte, also bekommst du nur alle 125 kHz / 13 einen 
Wert geliefert.

von Radium (Gast)


Lesenswert?

ahh oke, gut das ich das jetzt weis :). Kann es sein, dass der Messwert 
immer 13/f nachdem starten vorliegt? Dh also übertragen auf mein Bsp, 
das die Frequenz für die drei.Messungen des Bsp.( vorrausgesetzt sei 
immer gleicher Verarbeitungscode) fmess = 1/(13/fadc + n * 1/fuC) als 
sehr nahe näherung gilt?

von Radium (Gast)


Lesenswert?

Wobei n die Anzahl.der Takte (die die Befehle.beanspruchen) ist.

von JojoS (Gast)


Lesenswert?

Müsste so passen. Sowas kann man auch schön mit dem Simulator im 
avrstudio ausmessen, der zählt schön die Takte mit.
Die 13 Takte Weissheit habe ich aus dem Datenblatt, da findest du zb 
auch das in den ersten 1,5 von den 13 clocks das S&H gemacht wird. Und 
auch wann man den mpx umschalten darf/kann.
Wenn es um schnelle Wandlung/Speicherung geht: die moderneren 32 Bitter 
haben oft hilfreiche Features die (kenne ich jetzt vom LPC176x) zb 
mehrere Kanäle vorselektieren und dann automatisch im Burstmodus 
durchnudeln. Oder per DMA die Ergebnisse direkt in den Speicher 
schreiben.

von Radium (Gast)


Lesenswert?

Ja von der Schnelligkeit her sollts grad so reichen. Ich hab übrigens 
mal.nach der Impedanz geguckt. Also der Ausgangswiderstand liegt bei 2-5 
Ohm, da sonst nichts angegeben ist wird das wohl auch die.Impedanz sein. 
So, wie hängen jetzt Impedanz und Frequenz zusammen? Achja , die 
Kondensatoren: 100nF Keramik ?? oder andere?

von Heimerdinger (Gast)


Angehängte Dateien:

Lesenswert?

spess53 schrieb:
> Hi
>
>>Die Impedanz der Quellen, ob die wohl im Datenblatt des Sensors steht...
>
> Musst halt mal nachsehen.
>
>>Oder kann man das auch messen?
>
> Kann man schon. Ausgang belasten und messen. Meistens reicht aber ein
> Kondensator nach Masse am jeweiligen ADC-Eingang.
>
> MfG Spess

Hi,
man benötigt meines Wissens nach nur Kondensatoren an AREF und AVCC:

von spess53 (Gast)


Lesenswert?

Hi

>man benötigt meines Wissens nach nur Kondensatoren an AREF und AVCC:

Wenn die Quelle hochohmiger ist kannst du das mit einem Kondensator am 
ADC-Eingang ausgleichen. der ADC benötigt die niedrige Impedanz der 
Quelle nur in der kurzen Sample-Phase.

MfG Spess

von Radium (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>man benötigt meines Wissens nach nur Kondensatoren an AREF und AVCC:
>
> Wenn die Quelle hochohmiger ist kannst du das mit einem Kondensator am
> ADC-Eingang ausgleichen. der ADC benötigt die niedrige Impedanz der
> Quelle nur in der kurzen Sample-Phase.
>
> MfG Spess

Ah ok. Gibts da ne Faustregel, wie groß der Kond., bzw. ab wann ? :)

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.