Forum: Mikrocontroller und Digitale Elektronik Spannungsmessung mit ATTiny84 und externer Referenz


von Boris N. (neubert)


Lesenswert?

Hallo,

ich will mit einem ATTiny84 einen Sensorwert auslesen. Der Sensor 
liefert

Vout= Wert x Vs mit Vs= 5V.

Ich teile mit je zwei 82k-Widerständen Vs und Vout durch 2 und lege

Vref= Vs/2 an PA0/AREF

und

Vin= Vout/2 an PA2/ADC2.

Aktuelle Meßwerte mit dem Digitalvoltmeter:
Vin= 0,116V
Vout= 2,52V

Gemäß Handbuch sollte das Ergebnis der Wandlung ADC= Vin*1024/Vref= 47 
sein. Es werden aber ca. 119 ausgegeben. Interessanterweise ist 
119/1024= 0,116.

Kann mir bitte jemand auf die Sprünge helfen, wo mein Fehler liegt? 
Programmfragment in C siehe unten.

Vielen Dank und viele Grüße
Boris

uint16_t measure(void) {

  uint8_t lo, hi;
  // start conversion
  ADCSRA |= _BV(ADSC);
  // wait for ADC to finish
  while ( bit_is_set(ADCSRA, ADSC) ); // wait for converter to finish
  // ADCL must be read first, to ensure contents belong to same 
conversion
  lo= ADCL;
  hi= ADCH;
  return (hi << 8 | lo);
}


uint16_t get_voltage(void) {

  uint16_t result= 0;

  CLEAR_BIT( DDRA,  PA0 );
  CLEAR_BIT( PORTA, PA0 );
  CLEAR_BIT( DDRA,  PA2 );
  CLEAR_BIT( PORTA, PA2 );

  // disable ADC
  ADCSRA &= ~_BV(ADEN);

  // External voltage reference at PA0 (AREF) pin. See ATTiny84 manual 
p. 145
  // measure ADC2
  ADMUX |= _BV(REFS0) | _BV(MUX1);
  ADMUX &= ~_BV(REFS1) & ~_BV(MUX0) & ~_BV(MUX2) & ~_BV(MUX3) & 
~_BV(MUX4) & ~_BV(MUX5);

  // right adjusted 10bit result in ADCH/ADCL
  ADCSRB &= ~_BV(ADLAR);

  // Auto Trigger Disable
  ADCSRA &= ~_BV(ADATE);

  // Interrupt Disable
  ADCSRA &= ~_BV(ADIE);

  // Internal RC Oscillator runs at 8 MHz.
  // maximum resolution if clock frequencz between 50kHz and 200kHz
  // prescaler division factor= 64 gives 8MHz/64= 125kHz
  ADCSRA |= _BV(ADPS2) | _BV(ADPS1);
  ADCSRA &= ~_BV(ADPS0);

  // enable ADC
  ADCSRA |= _BV(ADEN);
  result= measure(); // throw away
  result= (measure()+measure()) >> 1;

  // disable ADC
  ADCSRA &= ~_BV(ADEN);

  // 10bit right-adjusted
  return result;


}

von Spannungsmesser (Gast)


Lesenswert?

Boris Neubert schrieb:
> Ich teile mit je zwei 82k-Widerständen Vs und Vout durch 2 und lege
>
> Vref= Vs/2 an PA0/AREF
>
> und
>
> Vin= Vout/2 an PA2/ADC2.

Verstehe ich Dich richtig? Du willst sowohl die Messspannung als auch 
die Referenzspannung von der Versorgung ableiten? Das wird nicht 
funktionieren, weil sich dann beide Spannungen im gleichen Verhältnis 
ändern. Nimm doch die interne Referenzspannung.

von Uwe (Gast)


Lesenswert?

Ich glaube Rref also Reference Input Resistance liegt so bei 32kOhm. Die 
Referenz sollte schon nen bischen niederohmiger sein. Der Analoge 
eingangswiderstand bei 100MOhm is schon nen bischen höher, aber ich hab 
irgendwo mal gelesen das die Signalquelle nich mehr als 10kOhm haben 
sollte (ich glaub  wegen der Sample and hold schaltung).
Also Impendanzwandler wär nich schlecht, und ne anständige Referenz 
(nich zwei hochohmige widerstände)

von Boris N. (neubert)


Lesenswert?

Hallo Spannungsmesser,

Vout des Sensors skaliert wie

Vout= interessierender Wert x Vs

Ich will Vs als Referenz verwenden, um den Effekt durch Schwankungen von 
Vs aus der Gleichung herauzudividieren.

Grüße,
Boris

von Boris N. (neubert)


Lesenswert?

Hallo Uwe,

gemäß 16.8 des ATTiny84-Handbuchs


The ADC is optimized for analog signals with an output impedance of 
approximately 10kΩ or less. If such a source is used, the sampling time 
will be negligible. If a source with higher impedance is used, the 
sampling time will depend on how long time the source needs to charge 
the S/H capacitor, which can vary widely.

spielt die Impedanz nur eine Rolle für die Meßdauer. Diese ist aber für 
mich bedeutungslos, weil ich in der Praxis nur alle paar Minuten einen 
Wert bestimmen will.

Es kommt mir nicht auf die Genauigkeit der Referenz an, weil Vout= 
interessierender Wert x Vs und ich Vs durch Verwendung als Vref 
herauskürzen will.

Viele Grüße
Boris

von Uwe (Gast)


Lesenswert?

Dann nimm zumindest zwei niederohmige widerstände für die Referenz oder 
mach nach dem Spannungsteiler nen Impendanzwandler dahinter. Ich glaub 
32KOhm Eingangswiderstand des Referenzpins beeinflussen den 
Spannungsteiler von 2x82kOhm doch stark.

von Peter R. (pnu)


Lesenswert?

Wenn keine hohe Abtastfrequenz benötigt wird, kann man direkt an den 
Analogeingang einen Pufferkondensator schalten. Der bietet der 
sample-and-hold-Schaltung des Wandlers sozusagen ein für die Abtastung 
konstantes Signal an.

von Boris N. (neubert)


Lesenswert?

Hallo an alle,

Danke für Eure Tipps! Die Widerstände auf 10k herabzusetzen, hat es 
allein nicht gebracht. Aber ein 47muF-Elko von AREF nach GND hat das 
Problem gelöst!

Viele Grüße
Boris

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.