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?)
Du nimmst, wie normal, direkt 3 Pins und multplext diese. Alles andere ist unsinnig.
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
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
> > 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
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?
Du musst gar nichts neu startetn. Du schaltest mit den MUX Bits den nächsten EIngang auf den ADC und misst.
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.
Hllo Radium hat denn das mit dem Multiplexing jetzt geklappt? Welchen Multiplexer hast Du denn verwendet in Deiner Schaltung?
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?
Wobei n die Anzahl.der Takte (die die Befehle.beanspruchen) ist.
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 ? :)
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.