Hallo!
Ich lese mit dem ADC3 und ADC4 jeweils Spannungen aus, einmal eine eher
kleine Spannung (ca. 100mV) und direkt am Nebenpin hängt ein Poti
(0->Vref)
Vref ist ein Spannungsteiler zwischen Vcc und GND und wirft ca 2,4V ab.
Das Problem ist dass die kleine Spannung die ich messen möchte von dem
Nebenpin beinflusst wird.Es steigt der Wert um so näher der Poti an Vref
sich heranbewegt.
Ich habe schon den den ADC-Pin der kleinen Spannung einen 100nF
Kondensator nach GND gelegt, bringt aber nix.
So habe ich den ADC eingestellt:
1
voidADC_Init(void){
2
uint16_tresult;
3
ADCSRA|=(1<<ADEN);
4
ADCSRA|=(1<<ADSC);
5
while(ADCSRA&(1<<ADSC)){}
6
result=ADCW;
7
}
Auslesen:
1
uint16_tADC_Read(uint8_tchannel)
2
{
3
ADMUX=(ADMUX&~(0x1F))|(channel&0x1F);
4
ADCSRA|=(1<<ADSC);
5
while(ADCSRA&(1<<ADSC)){}
6
returnADCW;
7
}
Beim auslesen habe ich das mitteln der letzten 5 Werte schon
ausprobiert, das bringt auch nicht so viel.
Wenn jemand weiter weiß wäre ich um Hilfe dankbar.
Gruss
Herbert
Setz mal den ADC Prescaler hoch (z.B. 32 oder 64). Wenn der ADC Clock zu
hoch ist, kann das dazu führen, dass der Kondensator der Sample & Hold
Schaltung noch nicht vollständig entladen und ist beim wechsel auf einen
anderen Kanal noch "Restladung" vom vorherigen hat.
Herbert schrieb:> Das Problem ist dass die kleine Spannung die ich messen möchte von dem> Nebenpin beinflusst wird.Es steigt der Wert um so näher der Poti an Vref> sich heranbewegt.
Dann ist die Quellimpedanz der kleinen Spannung zu groß und deshalb
nicht in der Lage, den Kondensator der S&H-Schaltung schnell genug
umzuladen.
Also gibt es logischerweise zwei Lösungsmöglichkeiten:
1) Impedanz der Quelle verringern (z.B. durch einen Buffer-Verstärker)
2) Zeit erhöhen, die zum Umladen zur Verfügung steht
Wenn die Geschwindigkeit/Häufigkeit, mit der die Messungen erfolgen
sollen kein große Rolle spielt, ist natürlich Variante 2 einfacher, weil
sie nur Änderungen an der Software erfordert.
Die einfachste Umsetzung ist:
> Auslesen:uint16_t ADC_Read( uint8_t channel )> {> ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);> ADCSRA |= (1<<ADSC);> while (ADCSRA & (1<<ADSC)) {}> ADCSRA |= (1<<ADSC);> while (ADCSRA & (1<<ADSC)) {}> return ADCW;> }
Man muß sich aber klar machen, daß das nur ein Herumdoktorn an Symptomen
darstellt, die Ursache aber nicht beseitigt. Das tut nur eine Lösung
nach Variante 1.
Poste doch mal die Hardwareschaltung bezüglich der "kleinen Spannung".
Vielleicht ist da ja auch noch was herauszuholen ohne einen Verstärker
verwenden zu müssen.
Herbert schrieb:> Vref ist ein Spannungsteiler zwischen Vcc und GND und wirft ca 2,4V ab.>> Das Problem ist dass die kleine Spannung die ich messen möchte von dem> Nebenpin beinflusst wird.Es steigt der Wert um so näher der Poti an Vref> sich heranbewegt.
D.h. Dein Poti ändert die Referenzspannung.
Man nimmt ja auch keinen Spannungsteiler als Referenz, sondern eine
Referenz.
Bzw. einen OPV als 1-Verstärker hinter den Spannungsteiler.
Lt. Datenblatt hat der Referenzeingang 32kOhm. Für 10Bit Auflösung
sollte dann der Quellwiderstand einer externen Referenz <32 Ohm sein.
Moin!
Die "kleine Spannung" ist die Spannung die an einem 1Ohm Widerstand zur
Messung vom Motorstrom abfällt.
Ich weiß, dafür nimmt man eigentlich einen OpAmp, aber sowas habe ich
gerade nicht hier.
Also Sampling rate runter drehen damit der Kondensator mehr zeit hat
sich umzuladen?
Gruss
Herbert
Hiho,
wartest du zwischen den Wandlungen ein wenig? Die Sample and Hold
Schaltung braucht ein wenig, um sich auf die neue Spannung einzustellen.
Beim Atmega328 z.Bsp 13.5 Clock Cycles der ADC Clock. Wenn du die nicht
einhälst, dann verhaut es dir das Signal und es sieht so aus, als wenn
die Channel überstreuen.
Grüße,
Wenn ich die Sampling Rate sehr niedrig stelle, kann es dann sein dass
ein Funktionsaufruf evtl. zu lange dauert weil er ja dann z.b bei fünf
Stichproben fünf mal wartet bis ein neuer Wert vorhanden ist?
Gruss
Herbert
Herbert schrieb:> Wenn ich die Sampling Rate sehr niedrig stelle, kann es dann sein dass> ein Funktionsaufruf evtl. zu lange dauert
kommt drauf an, was du unter 'zu lange' verstehst.
> Wenn ich die Sampling Rate sehr niedrig stelle
definiere 'sehr niedrig'.
> weil er ja dann z.b bei fünf> Stichproben fünf mal wartet bis ein neuer Wert vorhanden ist?
Ja.
Wenn ADC_Read generell ein kleines Päuschen nach dem Umschalten des
Kanals einlegt, dann kann das durchaus aus.
Das Päuschen ist ja nur notwendig, wenn der Kanal gewechselt wird.
Also baut man da in ADC_Read eine Abfrage rein, ob der Kanal gewechselt
wurde und wenn nicht, dann gibt es auch kein Päuschen. Und schon ist das
'Problem' ein gewesenes Problem.
Alternativ könnte man auch vor der eigentlichen n-fach Messung einfach
mal eine Messung machen, deren Ergebnis verworfen wird und die man nur
deswegen macht, damit der Multkiplexer umgeschaltet wird und so die
nächste Spannung an die Sample&Hold Stufe gelegt wird, die sich dann
anpasst. Gib ihr ein wenig Zeit, damit der Kondensator umgeladen wird
und gut ists.
Es führen immer mehrere Wege nach Rom.