Forum: Mikrocontroller und Digitale Elektronik ADC an Olimex AT90CANBoard


von Jan (Gast)


Lesenswert?

Hallo,

ich verzweifle gerade an einer einfachen ADC-Schaltung bzw. an dem Code. 
Ich habe mich an die beiden ADC Tutorial von dieser Seite gehalten und 
meiner Meinung nach eigentlich alles richtig gemacht und trotdem will es 
nicht.

Ich nutze das Olimex Board für den Controller 
AT90CAN(https://www.olimex.com/Products/AVR/Development/AVR-CAN/). Zur 
Zeit sind noch ein LCD an Port B und C und CAN-Bus PD5 und PD6 aktiv. 
Port F (ADC-Port)ist komplett als Eingang ohne Pull-Ups eingestellt. 
Debugging mit AVR JTAG ICE3 über den JTAG Port auf dem Board.

In meiner Init-Methode wähle ich zunächst Channel 2 (Pin 2 Port F), dann 
die Reverenzspannung (AVCC with external capacitor on AREF pin).

Und hier bin ich schon nicht sicher ob ich alles richtig mache:
Auf Seite 7 der Manual sieht man im Schaltplan eine Lötbrücke an AVREF 
(siehe Link). Diese habe ich geschlossen und seitdem 5V zwischen AVREF 
und AGNG liegen. Meine Versorgungsspannung liegt später bei 11 bis 13,7V 
(Autobatterie), aber z.Z. bei 12V über Tischnetzteil. Als Last dient 
eine 8kOhm Potentiometer 
(http://www.novotechnik.de/uploads/tx_extprodfind/TX2_Gelenkkopf.pdf), 
dessen äußere Anschlüsse an AVREF und AGNG anliegen. Mittelschleifer an 
PF2.

Dann stelle ich den Presscaler auf 128. Weil 16MHz/200kHz = 80 also 
nächster Precaler 128 (wie hier erklärt: 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC)

Anschließend starte ich eine Wandlung, warte das Ende ab und lese dann 
erst low, dann high byte aus.
1
void ADC_init(void)
2
{
3
  //Channel select
4
  ADMUX=0x02;
5
  
6
  //REFS1 REFS0 Voltage Reference Selection
7
  //0 0 AREF, Internal Vref turned off
8
  //0 1 AVCC with external capacitor on AREF pin
9
  //1 1 Internal 2.56V Voltage Reference with external capacitor on AREF pin
10
  ADMUX |= (1<<REFS0);
11
  
12
  //Set Prescaler Division factor to 128 (16MHz CPU)
13
  //Enable ADC
14
  ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
15
  
16
  //Read one value to warm up ADC
17
  //Start single conversion
18
  ADCSRA |= (1<<ADSC);
19
  //Wait to end convention
20
  while(ADCSRA & (1<<ADSC));
21
  
22
  ad_l = ADCL;
23
  ad_h = ADCH;
24
}


Meine Read-Methode führe ich in der Main-Loop einmal die Sekunde 
(_delay_ms()) aus. Und gebe dort das Ergebniss über CAN aus. In der 
Methode selbst noch über LCD. Die Zahlendarstellung von LCD und CAN ist 
getestet und korrekt.
1
uint16_t ADC_read(void)
2
{
3
  //Start single convertion
4
  ADCSRA |= (1<<ADSC);
5
  //Wait to end convention
6
  while(ADCSRA & (1<<ADSC));
7
  
8
  ad_l = ADCL;
9
  ad_h = ADCH;
10
  
11
  LCD_displayInt8(3,0,ad_h);
12
  LCD_displayInt8(3,2,ad_l);
13
  
14
  ////Return full scaled value
15
  return (ad_h<<8) + ad_l ;                 
16
}

Nun bekomme ich aber immer nur Null als Ergebniss. Egal auf welchem 
Channel. Auch dann wenn ich die Reverenspannungseinstellung ändere. Und 
z.B. dann den +5V-PIN am Board als Eingangsspannung nutze. Ich habe auch 
das selbe vorher ohne geschlossene Lötbrücke getestet(Dann lag aber 
keine Spannung an AVREF). Ebenso auch nochmal mit einem komplett neuen 
Board. Trotzdem immer nur Null.

Mach ich irgendwo einen dummen Fehler den ich einfach nicht sehe. Ich 
freu mich über Hilfe.

LG

von Karl H. (kbuchegg)


Lesenswert?

Was hast du mit dem Anschluss VDDA gemacht?

Auf dem musst du deine Versorgungsspannung anlegen. Das ist die 
Spannungsversorgung des ADC.

Die Lötbrücke kannst du offen lassen, wenn du sowieso µC-intern die 
Referenzspannung auf VDDA schaltest.
Das du bei offener Lötbrücke und intern auf AVcc (VDDA) geschalteter 
Referenzspannung an AVREF keine 5V macht mich stutzig. Denn eigentlich 
sollte das keinen Unterschied machen. Durch die Wahl der 
Referenzspannung als 'Avcc with Capacitor' machst du µC-intern nichts 
anderes als das was die Lötbrücke macht. D.h. du solltest eigentlich in 
beiden Fällen an AREF dann die 5V messen können. Kann ich mir eigentlich 
nur so erklären, dass du VDDA an EXT2 frei gelassen hast.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:
> Was hast du mit dem Anschluss VDDA gemacht?
>
> Auf dem musst du deine Versorgungsspannung anlegen. Das ist die
> Spannungsversorgung des ADC.
>


Gemeint ist natürlich: da müssen 5V rein!


Edit: seltsam, dass Olimex da keine direkte Verbindung zur restlichen 5V 
Versorgung zb in Form einer Lötbrücke vorgesehen hat.

: Bearbeitet durch User
von Jan (Gast)


Lesenswert?

Müssen beide VDDA mit 5V+ und GND belegt werden? Gerade ist eine kleines 
Stückchen aus dem Spannungsregler geplatzt als ich 5V+(PIN 5 und 6) von 
EXT 1 auf VDDA gepinnt habe. AVREF, AGND und PF2 wie gehabt. Sind noch 
ein paar Boards da :D

von Jan (Gast)


Lesenswert?

Der Text zum Jumper:
This jumper when closed supplies VDDA reference to the AVREF. If
this jumper is open the desired reference voltage should be applied at
EXT2-3.
Default state is open.

Das durchbrennen war an einem Board an dem die Brücke offen ist.

von holger (Gast)


Lesenswert?

VDDA ist über L1 völlig korrekt an 5V angeschlossen.
Da muss man nichts ändern.

von Jan (Gast)


Lesenswert?

Also ich habe gerade nochmal nach gemessen:

Offener Jumper:
VDDA - GND : 0V
ACREF - AGND : 80-90mV

Geschlossener Jumper
ADDA -GNG : 5V
ACREF - AGND : 4,90V

Also schein  das mit dem Jumper schon richtig zu sein und ich muss keine 
5V von "extern" an den VDDA Pin anlegen?

von holger (Gast)


Angehängte Dateien:

Lesenswert?

>ich muss keine 5V von "extern" an den VDDA Pin anlegen?

Siehe Bildausschnitt aus dem Schaltplan. VDDA ist an 5V
angeschlossen. Passt aber nicht zu deiner Messung mit
offenem Jumper.

Der Jumper ist überflüssig weil man intern auf AVCC schalten kann.
Also vergiss den Jumper. Was dann fehlt ist ein Kondensator an AREF.
Das ist ein Fehler im Schaltplan.

von Karl H. (kbuchegg)


Lesenswert?

holger schrieb:
> VDDA ist über L1 völlig korrekt an 5V angeschlossen.
> Da muss man nichts ändern.

Ich hasse das, wenn man in Schaltplänen bis zur Vergasung alles absuchen 
muss, bis man alle Verbindungen sieht.
Danke.

Aber warum misst er dann nichts an VDDA?

: Bearbeitet durch User
von Jan (Gast)


Lesenswert?

Im Schaltplan steht VDDA mehrfach im Zusammenhang mit AREF und Co. 
Weiter unten rechts nochmal, da ist auch der Jumper/Lötbrücke 
verzeichnet. Ich dachte erst die beiden VDDA Anschlüsse an EXT2 wären 
unterschiedlich beschaltet, aber bei offener Brücke beide 0V.

von Karl H. (kbuchegg)


Lesenswert?

Jan schrieb:
> Müssen beide VDDA mit 5V+ und GND belegt werden? Gerade ist eine kleines
> Stückchen aus dem Spannungsregler geplatzt als ich 5V+(PIN 5 und 6) von
> EXT 1 auf VDDA gepinnt habe.

?
Wie kann das denn passieren?

Die Verbindung existiert doch schon auf dem Board (wenn auch über eine 
Spule)


Irgendwas ist da heftig faul

von holger (Gast)


Lesenswert?

>Aber warum misst er dann nichts an VDDA?

Habe ich oben auch schon angemerkt.
Irgendwas stimmt da nicht. Aber ihm platzen
ja auch Teilchen aus dem Spannungsregler wenn
er 5V an ein und dieselben 5V anschliesst;)

von Jan (Gast)


Angehängte Dateien:

Lesenswert?

Hier nochmal die Stelle im Plan. Aber Code meint ihr ist in Ordnung 
oder? Weicht ja auch quasi nicht von den tausend Beispielen im Netz ab.

von Karl H. (kbuchegg)


Lesenswert?

Jan schrieb:
> Im Schaltplan steht VDDA mehrfach im Zusammenhang mit AREF und Co.
> Weiter unten rechts nochmal, da ist auch der Jumper/Lötbrücke
> verzeichnet. Ich dachte erst die beiden VDDA Anschlüsse an EXT2 wären
> unterschiedlich beschaltet, aber bei offener Brücke beide 0V.

Genau das hatte ich auch gedacht.

Da hatte ich aber die Verbindung über eine Spule noch nicht gesehen, die 
Holger im Schaltplan entdeckt hat. Ich hatte nur nachgesehen wo die 5V 
herkommen und dieses 'Detail' nebenan übersehen.

von Karl H. (kbuchegg)


Lesenswert?

Jan schrieb:
> Hier nochmal die Stelle im Plan. Aber Code meint ihr ist in Ordnung
> oder?

Ich hätte mal ja gesagt.
Ich hab dann auch noch die Referenzspannungsbits mit dem Datenblatt 
verglichen: Ist alles in Ordnung.

Gerade weil ich im Code nichts gefunden habe, hab ich mir mal den 
SChaltplan reingezogen und bin auf dieses VDDA gestossen. Und nachdem 
ich mich erinnert habe, dass du gesagt hast, du würdest dort 0V messen, 
war die Sache irgendwie klar. Das wär so eine schöne Erklärung gewesen 
:-(

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

holger schrieb:
>>Aber warum misst er dann nichts an VDDA?
>
> Habe ich oben auch schon angemerkt.
> Irgendwas stimmt da nicht. Aber ihm platzen
> ja auch Teilchen aus dem Spannungsregler wenn
> er 5V an ein und dieselben 5V anschliesst;)

Ja eben.
Auf den Photos kann man L1 leider nicht finden.

Ich weiss es ist mühsam. Aber das scheint ein Fall für den 
Durchgangsprüfer zu sein, um damit die Bahnen auf der Platine zu 
verfolgen.

Wenn sein Spannungsregler platz würde ich mal auf einen Masseschluss 
irgendwo auf dieser Bahn tippen. Von ein paar Kondensatoren wird ein 
Spannungsregler nicht überlastet.

von Jan (Gast)


Lesenswert?

Hier der Link zum Datenblatt von Olimex:
https://www.olimex.com/Products/AVR/Development/AVR-CAN/resources/AVR-CAN.pdf
Seite 7 ist der Schaltplan.

Durchgang zwischen AVREF und VDDA habe ich nur bei geschlossenem Jumper. 
Durchgang zu 5V habe ich an VDDA immer.

Bei dem beschädigten ist nirgens mehr Durchgang.

von Eric B. (beric)


Lesenswert?

Karl Heinz schrieb:

> Auf den Photos kann man L1 leider nicht finden.

Doch: https://www.olimex.com/Products/AVR/Development/AVR-CAN/
2. Foto, Links zwischen C15 und C16, neben dem SUB-D, mittig.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Jan schrieb:
> Hier der Link zum Datenblatt von Olimex:
> https://www.olimex.com/Products/AVR/Development/AVR-CAN/resources/AVR-CAN.pdf
> Seite 7 ist der Schaltplan.
>
> Durchgang zwischen AVREF und VDDA habe ich nur bei geschlossenem Jumper.

Logisch.

Den brauchst du aber nicht, denn das hier
1
  ADMUX |= (1<<REFS0);
macht diese Verbindung µC intern

> Durchgang zu 5V habe ich an VDDA immer.

Und misst du dann an VDDA auch 5V (wenn der Jumper nicht geschlossen 
ist?)

> Bei dem beschädigten ist nirgens mehr Durchgang.

Ist mir immer noch nicht klar, warum der abgeraucht ist. Im Grunde hast 
du nichts anderes gemacht, als zu der auf dem Board ohnehin vorhandenen 
Verbindung zu +5V noch eine zweite zu legen. Du hast dich doch nicht in 
den Pins verzählt, oder?

Was ich aber eigentlich sagen wollte:
Du rufst aber die Funktion ADC_init() schon aus main() heraus auf?
Lach nicht. Sowas kommt vor.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Was ich aber eigentlich sagen wollte:
> Du rufst aber die Funktion ADC_init() schon aus main() heraus auf?
> Lach nicht. Sowas kommt vor.


PS:
Genau das ist der Grund, warum wir hier nicht wirklich Freude damit 
haben, wenn bei einem nicht funktionierendem Programm immer nur Auszüge 
gepostet werden. Manchmal reicht das. Aber oft reicht das nicht und der 
Fehler sitzt in Wirklichkeit ganz woanders.

von ich (Gast)


Lesenswert?

Jan schrieb:
> Müssen beide VDDA mit 5V+ und GND belegt werden? Gerade ist eine kleines
> Stückchen aus dem Spannungsregler geplatzt als ich 5V+(PIN 5 und 6) von
> EXT 1 auf VDDA gepinnt habe. AVREF, AGND und PF2 wie gehabt. Sind noch
> ein paar Boards da :D

Zitat: "VDDA mit 5V+ und GND belegt"
So machst Du Deinen 5V Spannungsregler natürlich kaput.

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.