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?)
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
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?
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
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
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.
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.
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.
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?
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.
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?
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:
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
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 ? :)