ADC an Olimex AT90CANBoard

Gast #4037059
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
#4037082
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.
Gast #4037181
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.
Angehängte Dateien:
#4037229
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.
#4037232
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 
:-(
#4037248
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.
#4037422
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.
#4037428
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.
Gast #4037444
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren