Forum: Mikrocontroller und Digitale Elektronik Atmega8 ADC Werte beeinflussen sich gegenseitig?


von Herbert (Gast)


Lesenswert?

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
void ADC_Init(void) {
2
  uint16_t result;
3
  ADCSRA |= (1<<ADEN);                    
4
  ADCSRA |= (1<<ADSC);                   
5
  while (ADCSRA & (1<<ADSC) ) {}        
6
  result = ADCW;
7
}

Auslesen:
1
uint16_t ADC_Read( uint8_t channel )
2
{
3
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
4
  ADCSRA |= (1<<ADSC);        
5
  while (ADCSRA & (1<<ADSC)) {} 
6
  return ADCW;                   
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

von al_guesto (Gast)


Lesenswert?

Hallo,

belastest du mit deinem Poti deine Referenzspannung? Hast du mal einen 
anderen ADC gestestet, der nicht direkt daneben liegt?

von Herbert (Gast)


Lesenswert?

Jo, der Poti hängt mit an dem Spannungsteiler (10k Poti)

von al_guesto (Gast)


Lesenswert?

Miss mal, ob die zusammenbricht, wenn du das Poti aufdrehst.

von Timmo H. (masterfx)


Lesenswert?

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.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Herbert (Gast)


Lesenswert?

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

von nicht "Gast" (Gast)


Lesenswert?

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,

von Herbert (Gast)


Lesenswert?

Äh eine Frage habe ich noch:
Diesen Code verwende ich zur Durchschnittswertbildung der ADC Werte
1
uint16_t ADC_Read_Avg( uint8_t channel, uint8_t nsamples )
2
{
3
  uint32_t sum = 0;
4
  uint8_t i;
5
  for (i = 0; i < nsamples; ++i ) {
6
   sum += ADC_Read( channel );
7
  }

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

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
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.