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; }
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.
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)
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
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.