Forum: Mikrocontroller und Digitale Elektronik ADC des ATMega16 defekt?


von Tom L. (munzi)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Tom L. schrieb:
> AREF=GND

Das macht man nicht!

von Tom L. (munzi)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

> 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.

von Hubert G. (hubertg)


Lesenswert?

Woher weißt du das im main und weiter alles richtig ist?

von Tom L. (munzi)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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).

von Karl H. (kbuchegg)


Lesenswert?

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.

von Tom L. (munzi)


Angehängte Dateien:

Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von Tom L. (munzi)


Lesenswert?

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
Noch kein Account? Hier anmelden.