Spannungsmessung mit ATTiny84 und externer Referenz

#2164030
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;


}
Gast #2164046
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.
Gast #2164226
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)
#2164329
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
Gast #2164388
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren