Hallo, Ich benutze an einem ATMega16 den ADC. Egal welche Einstellung ich für die Referenzspannung wähle (AREF, AVCC oder interne 2,5V), zeigt die uint16_t Variable, der ADCW nach Ende der Wandlung zugewiesen wird folgendes Verhalten: AREF=VCC - Input an VCC: Ergebnis=0 - Input an GND: Ergebnis schwankt zwischen 4 und 7 - Input hängt in der Luft (keine Pull-Widerstände): Ergebnis=0 AREF=GND - Input an VCC: Ergebnis (logischerweise) = 1023 - Input an GND: Ergebnis=1023 - Input hängt in der Luft (keine Pull-Widerstände): Ergebnis=1023 Identisches Verhalten zeigt sich eben auch bei AVCC (Pollin Board) und den internen 2,5V. Die Bits des ADMUX und ADCSRA sind richtig, bzw. wie gewollt gesetzt, was ich im Debugger geprüft habe. Kann es sein, dass die ADC-Inputs zerschossen sind? Vielen Dank und viele Grüße Munzi
Tom L. schrieb: > Kann es sein, dass die ADC-Inputs zerschossen sind? Möglich. Glaub ich aber nicht (ausser du hast mal 230V Netzspannung drann gehängt). Soo empfindlich sind die AVR dann auch wieder nicht. Die halten schon auch was aus und stecken auch mal was weg. Dann fangen wir mal an: Schaltplan? Programm? Das voll, übliche, Prozedere also. Wenn du schon länger hier im Forum mitliest, solltest du das eigentlich wissen: Beschreib nicht was du getan hast - zeig es her.
Hier mein Quelltext. Die Schaltung ist die des Pollin Boards, wobei ein Poti als Spannungsteiler am ADC1, also PA1, hängt. AREF liegt auf VCC.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | #include "atm16_adc.h" |
5 | #include "Typedefs.h" |
6 | #include "global.h" |
7 | |
8 | uint16_t uwAdcResult; |
9 | |
10 | void ADC_vStartConv(uchar8 ucChannel){ |
11 | ADMUX |= ucChannel; |
12 | ADCSRA |= (1<<ADSC); |
13 | while (ADCSRA & (1<<ADSC) ); |
14 | uwAdcResult = ADCW ; |
15 | fBitflags|=(1<<bf0); //conversion finished |
16 | }
|
17 | |
18 | void ADC_vInit(void){ |
19 | //ADCSRA = (1<<ADIE);
|
20 | ADCSRA |= (1<<ADEN)|ADC_PRESCALER_128; |
21 | ADMUX = (1<<REFS1); |
22 | ADC_vStartConv(1); //Init with ADC1 |
23 | }
|
uchar8 bezeichnet uint8_t und ADC_PRESCALER_128 ist (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0). Das Bitflag wird in der Main ausgelesen und sorgt für eine erneute Wandlung.
> AREF liegt auf VCC
macht man auch NICHT !
An AREF kommt nen 100nF nach GND un Punkt. Naja man kann auch ne gute
(bessere als die interen Referenz) benutzen und dort anschließen.
Wenn man VCC als Ref haben will stellt man das am Mux ein, dann schaltet
der Mux VCC an den Ref Pin der dann vom Kondensator gepuffert wird.
Hubert G. schrieb: > Woher weißt du das im main und weiter alles richtig ist? Durch den Debugger. Außerdem funktioniert auch der bloße wiederholte Aufruf der ADC_vStartConv in main bezüglich des Ergebnisses genauso wenig. Natürlich legt man AREF sinnvollerweise nicht auf GND. Ich wollte nur sehen, ob das Ergebnis dann 1023 ist.
Tom L. schrieb: > Die Schaltung ist die des Pollin Boards Im Internet darf man Links setzen, tue dies! Oder verlangst Du ernsthaft, daß jeder sich das mühsam zusammen suchen soll? Und was sollen diese Codehäppchen? Du baust ja auch nicht den Motor aus und bringst ihn zur Werkstatt, sondern das ganze Auto. Also Schaltplan als Link und kompletter Code als Anhang (*.h, *.c).
Tom L. schrieb: > ADMUX = (1<<REFS1); Sagtest du nicht, du benutzt einen Mega16? Das ist die einzige Einstellung der Referenzspannung, bei der im Datenblatt des Mega16 lediglich 'reserved' dabei steht! Du kannst jede andere Kombination der beiden REFS Bits benutzen, benutzt aber ausgerechnet die eine, bei der dir kein Mensch sagen kann, was Sache ist.
Peter Dannegger schrieb: > Im Internet darf man Links setzen, tue dies! > Oder verlangst Du ernsthaft, daß jeder sich das mühsam zusammen suchen > soll? http://www.pollin.de/shop/downloads/D810038B.PDF Seite 6 Karl Heinz Buchegger schrieb: >> ADMUX = (1<<REFS1); Ja, muss natürlich REFS0 lauten, behebt aber den Fehler nicht. Ich lade den Code gezippt im Anhang hoch. Das Projekt hat zwar eigentlich noch keinen vorzeigbaren Stand, aber vielleicht hilft es.
Wie schreibt Atmel so schön im Datenblatt: >If the user has a fixed voltage source connected to the AREF pin, the user may >not use the other reference voltage options in the application, as they will be >shorted to the external voltage." So habe ich an einem Mega32 auch schon mal den ADC geschossen. Direkt an VCC und GND lieferte der dann zwar noch 1023 bzw. 0, aber mit einem Poti drann kam nur noch Müll raus. AREF richtig verschaltet, neuen Mega rein, schon hat es funktioniert. Oliver
Oliver schrieb: > AREF richtig verschaltet, neuen Mega rein, schon hat es funktioniert. Ich denke auch das wird das Beste sein. Ich werd ihn bei eBay bestellen, da ich keinen zum Test mehr da habe.
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.