Mehrere Signale über einen ADC messen

Gast #2628854
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?)
Gast #2628905
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
Gast #2628909
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
Gast #2628911
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
Gast #2628920
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?
Gast #2628934
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
Gast #2628984
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
#2629008
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.
Gast #2629072
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.
Gast #2629137
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?
Gast #2629167
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.
Gast #2629209
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?
Gast #2629733
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:
Angehängte Dateien:
Gast #2629899
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
Gast #2629984
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 ? :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren