mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 2 Byte bei 12 Bit ADC mit SPI


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende den MCP3201 von Mikrochip und möchte das Ergebnis über SPI 
zu einem ATmega8 senden und von dort über den UART ausgeben. Das erste 
Byte wird fehlerfrei übertragen. Das zweite wird nur sporadisch gesendet 
und ist meistens = 0. Dabei hilft es auch nicht einfach weitere 
Messversuche zu machen bis man das Byte empfängt, sondern so wie es 
aussieht hängt es von der Eingangsspannung ab, ob das zweite Byte 
gesendet wird oder nicht.

Der AVR ist mit 16 MHz getaktet und die SPI Frequenz wird durch 128 
geteilt, d. h. also eine SPI-Frequenz von 125 KHz. Das entspricht doch 
125000 / 13,5  = 9,5 ksps

13,5 weil 12 clock cycles conversion time + 1,5 clock cycles analog 
input sample time lt. Datenblatt

oder hab ich etwas falsch verstanden bzw. könnte hier der fehler liegen?

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der häufigste Fehler beim Auslesen von SPI Peripherie mit mehr als 8 Bit 
besteht darin das nicht weiter getaktet wird. SPI macht einen Lesezyklus 
mit 8 Bit also solltest Du 8 weitere "irrelevante" ausgeben um dem Slave 
weitere 8 Takte zu spendieren. Dann wird er auch was ausspucken. Sonst 
müßten wir schon den Code in unserer Glaskugel sehen können, die gerade 
beim TÜV ist.

Autor: Kay I. (imperator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Dein MCP3201 kann die 100ksps aber nur bei 5V Vcc...
Außerdem könntest Du ja erstmal probieren, den Wert in deutlich 
langsameren Abständen abzuholen.

Was hast Du denn an den Refenz-Input und an die differenziellen Inputs 
angeschlossen?

Sind alle analogen Signale im spezifizierten Spannungs-Fenster?

Keine floating Inputs?

Wie schnell ändert sich das analoge Signal, das Du abtastest?

Hast Du ausreichende Tiefpässe zwischen Signalquelle und ADC?

Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich sende bereits 2 "Dummybytes". Aber ich schicke einfach mal Plan und 
Quellcode.

Autor: Kay I. (imperator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, nach Deinem Plan sollten ca. 50µA durch die Ref. Diode fließen - ist 
laut Diode ok - aber Dein ADC hat auch Strombedarf - vielleicht mal mit 
5k probieren?
Sind am Vref tatsächlich stabile 2.5V? Ich würde den Ref-Input auch mit 
1-10µF puffern.
Hast mal mit einem Multimeter die aniegenden Pegel geprüft?

Erst wenn Du Dir sicher sein kannst, dass die analogen Werte von außen 
richtig sind, kannst Du Dich per SW auf Fehlersuche begeben ;)

Ich weiß ja nicht, was Du später mit den Werten anfangen willst, aber je 
nach Anwendung könnte man noch berücksichtigen, dass Potis analog 
ziemliche Schweinereien verursachen können -> Tiefpass nach Poti.
Die 100nF am Eingang Deines ADCs belasten direkt die Endstufe Deines 
OPs. Falls Du als Signalquelle mal etwas rauschendes anschließst, kann 
Dein OP heiß werden - wobei 100nF noch recht moderat sind.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Langfristig hab ich vor eine Temperaturmessung mit einem Pt100 zu 
realisieren.
Am Vref liegen immer so ~2,497 V an, mit Pufferkondensator kann ichs mal 
versuchen.
Welche anliegenden Pegel meinst du denn? Die Versorgungsspannung, Vref 
und Eingangsspannung sind laut Multimeter i. O.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mit gerade noch einfällt:

War denn meine Rechnung mit den Samples richtig? Mir ist nämlich 
aufgefallen, dass bei Verringerung der ksps die Wandlungen deutlich 
genauer wurden.

Autor: Kay I. (imperator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Pegeln meine ich auch die Potentiale an V_in +/-

Die Abhängigkeit zwischen Sampling & Genauigkeit könnte ich mir nur 
durch das Sample-Hold-Glied erklären.
Wenn Dir die Wahl des AD-Wandler noch frei ist, so würd ich Dir den 
AD1248 oder Derivate empfehlen. Damit kannst Du ohne viele ext. Bauteile 
eine sehr genaue Vier-Draht-Messung realisieren.
Falls Du bei diesen Bauteilen bleiben möchtest, musst Du dir noch eine 
Stromquelle ausdenken, sodass der Spannungsabfall über dem PT100 linear 
zur Temperatur ist - sonst misst Du die Kennlinie Deiner Stromquelle 
mit.

Hast Du den 0-Byte - Effekt nun im Griff?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit der Konstantstromquelle ist logisch nur ich wollte mich erstmal 
etwas mit externen AD-Wandlern und SPI vertraut machen weil ich damit 
bis jetzt keine Erfahrung hatte ;-)

Bis jetzt ist es noch auf dem Stand, ich komme aber vsl. auch erst dazu 
Freitag herumzuprobieren.

Auf jeden Fall erstmal danke für die Antworten ;-)

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach dem CS->LOW würde ich eine Verzögerung einbauen. Die paar 
Nanosekunden
zwischen Port setzen und Taktung beginnen werden wohl kaum als Sampling 
Time ausreichen ;-) Vielleicht mal hier ca. 100 us einplanen.

>Der AVR ist mit 16 MHz getaktet und die SPI Frequenz wird durch 128
>geteilt, d. h. also eine SPI-Frequenz von 125 KHz. Das entspricht doch
>125000 / 13,5  = 9,5 ksps

ALso mal rechnen:
-----------------
16MHz : 128 = 125 KHz (soweit ok). Da der ADC den Takt
vom SPI bezieht gehts dann folgendermaßen weiter:

Dauer einer Wandlung =
  (Zeit zw. CS->LOW und dem ersten SPI Takt) + 16 Takte

[1 SPI Takt => 8 us * 16 = 128 us]

also 100us + 128 us => 228 us (Best case!) Wären dann ca. 4 KHz 
(1:228us), wenn Du das ganze zyklisch mit max. Geschwindigkeit laufen 
lassen würdest.
Die Befehle für's Port setzen und die serielle Übertragung per UART 
nehmen wegen dem Polling auch Zeit in anspruch, so dass es wohl eher 
etwas weniger ist.

Nur so als Hinweis:
-------------------
Der ADC darf laut Datenblatt nicht langsamer als 10 KHz getaktet werden. 
(10 KHz SPI Takt), sonst hat sich die Ladung auf dem S&H Kondensator im 
ADC verflüchtigt, bevor die Messung beendet ist ;-)

Und natürlich sollte man zwischen den beiden TX Dummy Bytes des SPI 
keinen Breakpoint für's debuggen setzen! ;-)

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke dein Beitrag war eine große Hilfe, jetzt klappts ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.