ADC Problem

MPP

Neues Mitglied
25 Feb 2009
15
0
0
Schwarzenberg / Erzgebirge
Sprachen
BascomAVR
Hallo allerseits,

ich habe wiedermal ein "Problem(chen)" bzw. ein Phämomen, welches mit unklar ist:
Kurz zum Verständnis:
ich habe das "CRUMB2560"-Modul mit einem AVR2560. Dort möchte ich alle 16 ADC's nutzen.
Als Referenzspannung nutzen ich 4,096V (IC MAX 6241 - ein wunderbarer IC! - Absolut genau und stabil! - kann ich nur empfehlen...)
Also: 4096 mV sind 1024 Bit -> 4 mV / Bit Auflösung.
Programmcode ADC-Initialisierung:
Code:
Config Adc = Single , Prescaler = Auto , Reference = Aref   ' Referenz ist +4,096V !!
Jeden ADC-Kanal frage ich 10mal nacheinander mit 200µs Pause ab und bilde daraus jeweils einen Mittelwert:
Prinzipieller Beispielcode:
Code:
   Start Adc
' 1. ADC (ADC 0 PORT F)
   Adcdigit = 0
   For I = 1 To 10

      Adcdigit = Adcdigit + Getadc(0)
      Waitus 200

   Next I

   Adcdigit = Adcdigit / 10
' ...in String und zur Anzeige...
   Waitus 200

'...

' 8. ADC (ADC 7 PORT F)
   Adcdigit = 0
   For I = 1 To 10

      Adcdigit = Adcdigit + Getadc(7)
      Waitus 200

   Next I

   Adcdigit = Adcdigit / 10
' ...in String und zur Anzeige...
   Waitus 200

' 9. ADC (ADC 0 PORT K)
   Adcdigit = 0
   For I = 1 To 10

      Adcdigit = Adcdigit + Getadc(32)
      Waitus 200

   Next I

   Adcdigit = Adcdigit / 10
' ...in String und zur Anzeige...
   Waitus 200

'...
' 16. ADC (ADC 7 PORT K)
   Adcdigit = 0
   For I = 1 To 10

      Adcdigit = Adcdigit + Getadc(39)
      Waitus 200

   Next I

   Adcdigit = Adcdigit / 10
' ...in String und zur Anzeige...

   Stop Adc
Beim Testen der ADC-Kanäle ist mir aufgefallen, dass alle Kanäle am Port K (ADC 8 bis 15) einwandfrei funktionieren.
Die ADC-Kanäle 0 bis 7 (Port F) bringen allesamt einen Offset von 16 Bit (Ich lege alle ADC's auf Ground). Das sind also 64 mV zuviel! - Wieso?
Port K zeigt 0 Bit und Port F 16 Bit unter gleichen Bedingungen!
Was ist hier los bzw. was mache ich falsch?
Oder gibt es doch Unterschiede zwischen den 2 ADC-Ports?
Das die ADC's 9 bis 16 (Port K) nicht mit Getadc = 8 bis 15 sondern mit 32 bis 39 abgefragt wird habe ich selber rausgefunden - aber jetzt weis ich nicht mehr weiter!
Kann mich da jemand aufklären?

Gruß aus dem Erzgebirge

Mario
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Hallo Mario,

die Ursache für den unterschiedlichen DC-Offset kenne ich leider nicht.

Anscheinend verhält sich hier der Multiplexer von PortF etwas anders als der von PortK. Den DC-Offset kannst du ermitteln, indem du über die Multiplex-Bits den Differentialmodus wählst und als Plus und Minus Input den selben ADCn wählst (zum Beispiel bei PortF mit ADC0 und bei PortK mit ADC8 messen). Danach schaltest du wieder auf Single-Ended-Inputs und berücksichtigst den ermittelten DC-Offset von PortF und PortK bei deinen weiteren Berechnungen.

Du solltest auch die Digital Input Buffer der beiden Ports abschalten.

Für den ADC sind es die Register DIDR0 und DIDR2.

DIDR0 = 0xFF
DIDR2 = 0xFF

Wie man dies alles mit Bascom-Mitteln macht, kann ich dir leider nicht sagen, da ich mich mit Bascom nicht so gut auskenne.

Dirk :ciao:
 

MPP

Neues Mitglied
25 Feb 2009
15
0
0
Schwarzenberg / Erzgebirge
Sprachen
BascomAVR
Hallo Dirk,

Danke erstmal für deine Tipps.

DIDR0 = 0xFF
DIDR2 = 0xFF

geht auch in BASCOM - hat aber nichts gebracht.
Nach einigen Herumprobieren habe ich die Ursache höchstwarscheinlich gefunden:
Die Pullup-abschaltung des PORT F geht nicht! :mad:- Alle benutzten offenen Eingänge gehen sofort auf 1023 Bit (also gegen VCC). Die Einänge auf GND gelegt bleiben wieder 16 Bit stehen.:confused:
Das gleiche Vorgehen mit PORT K: Alle benutzten offenen Eingänge bringen ein Rauschen von ca. 230 Bit. Die Eingänge auf GND -> gehen sauber auf 0 Bit - So soll es sein!.:)
Wie kann ich die Pullup's Des PORT F richtig abschalten? Habe schon folgendes ausprobiert:
Code:
Config Portf = Input
Pinf = 0
oder
Code:
Ddrf = 0
Config Pinf.0 = Input : Pinf.0 = 0                          ' Pullup's aus (ADC)
Config Pinf.1 = Input : Pinf.1 = 0                          ' Pullup's aus (ADC)
Config Pinf.2 = Input : Pinf.2 = 0                          ' Pullup's aus (ADC)
Config Pinf.3 = Input : Pinf.3 = 0                          ' Pullup's aus (ADC)
Config Pinf.4 = Input : Pinf.4 = 0                          ' Pullup's aus (ADC)
Config Pinf.5 = Input : Pinf.5 = 0                          ' Pullup's aus (ADC)
Config Pinf.6 = Input : Pinf.6 = 0                          ' Pullup's aus (ADC)
Config Pinf.7 = Input : Pinf.7 = 0                          ' Pullup's aus (ADC)
Alles ohne Erfolg....
Bei
Code:
Config Portk = Input
Pink = 255
verhält sich der PORT K genau wie PORT F.

Hat jemand einen Vorschlag wie ich dem PORT F die Pullup's wirkungsvoll abschalte?
Hier noch die ADC-Konfiguration:
Code:
Config Adc = Single , Prescaler = Auto , Reference = Aref   ' Referenz ist +4,096V !!
Gruß aus dem Erzgebirge

Mario
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Hallo Mario,

wahrscheinlich liege ich falsch, da ich mich, wie schon geschrieben, mit Bascom nicht so auskenne.

PIN ist beim AVR Mikrocontroller kein Register. Um den Pullup-Widerstand zu deaktivieren, löscht man das entsprechende Bit im Port-Register.

Vielleicht macht das aber bascom irgendwie über Pinf.0 = 0?

In C geht das zum Beispiel so: PORTF = 0; (alle Bits auf 0, alle Pullups aus)

Demnach müsste es in Bascom irgendwie so gehen:
Portf.0 = 0;
Portf.1 = 0;
...

Dirk :ciao:
 

dino03

Aktives Mitglied
27 Okt 2008
6.716
16
38
Sprachen
BascomAVR, Assembler
Hi,

mach mal ...

DDRF = &B0000_0000
PORTF = &B0000_0000

im ersten Register setzt du die Pins vom PortF auf Eingang und im zweiten Register setzt du (wenn auf Eingang geschaltet ist !) Die PullUps auf Aus. Dieses =Input oder =Output von Bascom verwende ich nie. Ich setze bei den Standard-IO-Funktionen direkt die Portregister.

Nach einigen Herumprobieren habe ich die Ursache höchstwarscheinlich gefunden:
Die Pullup-abschaltung des PORT F geht nicht! :mad:- Alle benutzten offenen Eingänge gehen sofort auf 1023 Bit (also gegen VCC). Die Einänge auf GND gelegt bleiben wieder 16 Bit stehen.:confused:
Da vermute ich mal einen Fehler bei der Beschaltung/Programmierung. Das sollte bei GND am Eingang nicht auf 65535 stehen.

Das gleiche Vorgehen mit PORT K: Alle benutzten offenen Eingänge bringen ein Rauschen von ca. 230 Bit. Die Eingänge auf GND -> gehen sauber auf 0 Bit - So soll es sein!.:)
Das Rauschen ist bei offenen Eingängen absolut logisch. Die wirken wie eine Antenne und fangen jeden Schmutz ein.

Gruß
Dino
 

MPP

Neues Mitglied
25 Feb 2009
15
0
0
Schwarzenberg / Erzgebirge
Sprachen
BascomAVR
Gruß allerseits,

um es kurz zu machen - Problem gelöst!
Also, ich habe nochmal ausgiebig ADC-Kanal für ADC-Kanal einzeln getestet. Dabei ist mir aufgefallen, dass NUR ADC 4 bis 7 (PORTF.4 bis PORTF.7) diese "Unsauberheiten" machen.
Diese Ports werden aber auch auch für JTAG verwendet. Nachdem ich JTAG deaktiviert habe funzt alles prächtig!
Vielleicht hilft diese Erfahrung einigen Usern weiter...
Trotzdem ein Dankeschön an Dino03 und Dirk für eure Hilfe...

Anmerkung:
Das sollte bei GND am Eingang nicht auf 65535 stehen.
Ich habe mich da wohl falsch ausgedrückt - es sind 16 Digits (von 1023 möglichen) und nicht 16 Bit (also 64 mV):eek: ...

Gruß Mario
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)