Hallo erstmal,
wie im Betreff schon erwähnt möchte ich mit dem ADC eines Attiny85 eine
Spannung messen.
Soweit funktioniert auch alles, allerdings habe ich einen gewissen
Offset den ich rausbekommen will.
Nachdem die Versorgungsspannung auch gleichzeitig am zu messenden
Spannungsteiler anliegt, kann ich im Betrieb keine 0V-Offsetmessung
vornehmen, da dann ja schon Spannung anliegt.
Möchte deswegen die Möglichkeit der Internen Offsetmessung nutzen, da
dieser dann unabhängig von der externen Schaltung ist. Allerdings ist
dieser Wert dann ziemlich hoch: ca.35 (echter Offset etwa 8).
Weis jetzt nicht, ob der einfach so ungenau ist, oder was am Code nicht
stimmt. Konnte nichts finden, was das Problem erklären könnte.
Benutze die 1,1V interne Referenz und die Differenzielle bipolare
Messung auf ADC0 und ADC1 mit einfacher Verstärkung. Das wichtigste vom
Code:
Code Offsetmessung:
1 | ADMUX = 0x88;
|
2 | ADCSRB |= 0x80;
|
3 | ADCSRA = (1<<ADPS1)
|
4 | | (1<<ADPS0)
|
5 | | (1<<ADEN)
|
6 | | (1<<ADSC);
|
7 | while ( ADCSRA & (1<<ADSC));
|
8 | offset_u = ADCW;
|
9 | ADCSRA |= (1<<ADSC);
|
10 | while(ADCSRA & (1<<ADSC));
|
11 | offset_u = ADCW;
|
12 | ADMUX = 0x00;
|
13 | ADCSRA &= ~(1<<ADEN);
|
14 | if (offset_u >=0x0200){offset_u |= 0xFE00;}
|
15 | offset_u= (-offset_u);
|
Code Spannungsmessung:
1 | ADMUX = 0x8A;
|
2 | ADCSRB |= 0x80;
|
3 | ADCSRA = (1<<ADPS1)
|
4 | | (1<<ADPS0)
|
5 | | (1<<ADEN)
|
6 | | (1<<ADSC);
|
7 | while ( ADCSRA & (1<<ADSC));
|
8 | temp = ADCW;
|
9 | ADCSRA |= (1<<ADSC);
|
10 | while(ADCSRA & (1<<ADSC));
|
11 | temp = ADCW;
|
12 | ADMUX = 0x00;
|
13 | ADCSRA &= ~(1<<ADEN);
|
14 | if (temp >=0x0200)
|
15 | {
|
16 | temp |= 0xFE00;
|
17 | }
|
18 | temp += offset_u;
|
19 | temp= -temp;
|
Vieleicht hat von euch jemand ne Idee oder ne Lösung zu dem Problem.