Wie programmiere ich den ADC10 auf einem MSP430G2553?

Ich schreibe derzeit meine erste ernsthafte Anwendung mit einem MSP430-Controller (insbesondere einem MSP430G2553) und bin etwas verwirrt von der Dokumentation, wie ich den ADC10 einrichten soll. Ich möchte es so verwenden:

  • Das Signal (kommt von einem 100-kΩ-Potentiometer zwischen V CC und GND) wird an Eingang A4 (Pin 6) angeschlossen und liegt im Bereich von GND bis V CC
  • Hin und wieder (wenn der Benutzer eine Taste drückt) möchte ich die Spannung an diesem Eingang abtasten. Eine Probe ist ausreichend.
  • Ich habe genug Zeit, alles zu tun, was nötig ist, um Eingaben zu sampeln, wenn die Zeit dafür gekommen ist.
  • Ich würde es vorziehen, dies synchron (dh ohne Interrupts) zu tun, um die Programmlogik nicht zu sehr zu verkomplizieren.
  • Der ADC10 sollte ausgeschaltet werden, wenn ich ihn nicht verwende, um Strom zu sparen.
  • Weder der ADC10 noch Ping 6 werden in dieser Anwendung anderweitig verwendet.

Wie konfiguriere und verwende ich den ADC10 in diesem Anwendungsfall? Ich programmiere den MSP430 in Assembler, aber eine Antwort in C ist auch nützlich.

Hier ist, wie ich denke, dass der ADC konfiguriert werden sollte:

ADC10CTL0:
  SREFx      = 000  (V_CC)
  ADC10SHTx  = 11   (64 clocks, we have enough time)
  ADC10SR    = 1    (50 kbps should be enough)
  REFOUT     = 0
  REFBURST   = don't care
  MSC        = don't care
  REF2_5V    = don't care
  REFON      = 0
  ADC10ON    = 1    (set to 1 after finishing the configuration)
  ADC10IE    = 0    (no interrupts)

ADC10CTL1
  INCHx      = 0100 (A4)
  SHSx       = 00   (sample and hold sourced from ADC10SC)
  ADC10DF    = 0    (no two's complement)
  ISSH       = 0    (no inversion)
  ADC10DIVx  = 000  (not too sure either)
  ADC10SSELx = 0    (is this the right clock?)
  CONSEQx    = 00   (single channel single conversion)

ADC10AE0     = 0x10 (A4 enabled)
ADC10DTC1    = 0    (DTC disabled)

Ich denke, die Sequenz zum Abtasten von Daten sieht folgendermaßen aus:

  1. ADC10ONauf 1 ENCund auf 0 setzen ADC10SCund alle Register konfigurieren.
  2. ADC10SCund ENCauf 10 setzen , um die Konvertierung zu starten
  3. Warten Sie 64 + 12 + 1 = 77 Zyklen, bis die Umwandlung abgeschlossen ist
  4. Ergebnis lesen vonADC10MEM

Ist diese Reihenfolge richtig? Sind die Einstellungen korrekt?

Bitte wählen Sie Assembler oder C. Die Antworten werden sehr unterschiedlich sein. (persönliche Empfehlung: C wählen; Assembler-Programmierung - außer für kleine Stubs - macht heutzutage wenig Sinn).
Hinweis: Dies ist kein Code-Writing-Service. Bitte zeigen Sie, was Sie bisher gemacht haben und wo Ihr eigentliches Problem liegt. Upps, sorry, hat sich das Poster nicht angesehen. FuZxxI, du solltest es besser wissen
Ich würde mit dem FUG (Familien-Benutzerhandbuch) beginnen. Stellen Sie einfach die Register wie im ADC10-Abschnitt und in der Portauswahl angegeben ein.
Ja sicher, gib mir einen Moment, ich bin gerade im Zug.
@Olaf Wie ich in der Frage sage, interessiere ich mich hauptsächlich für Assemblercode, aber wenn Sie es vorziehen, eine Antwort in C zu geben, ist das auch in Ordnung.
@Olaf Ich habe meine Idee hinzugefügt, wie der ADC meiner Meinung nach verwendet werden soll.
Die Grundidee finde ich richtig. Aber da ich noch nicht mit diesem speziellen Gerät oder ADC10 gearbeitet habe, bin ich mir nicht sicher. Probier's einfach. Das Timing hängt von der Systemuhr ab. Vergessen Sie nicht, die PIN richtig einzustellen (IIRC, MSP430 muss die analogen Eingänge von digitalen Schaltkreisen passivieren, es sollte ein Register für den Port geben).
@Olaf Was ist mit den Bits, von denen ich keine Ahnung habe?
Ich musste mich selbst einlesen und tiefer einarbeiten, als ich eigentlich gerade möchte - um ehrlich zu sein (bitte (!) verstehen Sie, ich habe mein eigenes großes Projekt). Im Moment versuche ich, Ihnen Hinweise zu geben. Ich bin mir ziemlich sicher, dass es einige App-Notizen von TI gibt. Schon mal auf microcontroller.net geschaut? Die können vielleicht weiter helfen. Zumindest ist es ein Forum und besser geeignet als SO.
Die Bits sind in der FUG ziemlich gut beschrieben.
@Olaf Okay, ich denke, ich habe eine Vorstellung davon, was ich für die verbleibenden Einstellungen ausfüllen muss. Ich würde wirklich gerne wissen, ob das alles richtig ist, weil es ziemlich schwierig ist, dies in einem Programm zu testen, da ich keine Möglichkeit habe, Daten auszugeben, während das Programm läuft (keine Pins für UART übrig), und ich kann es nicht genau Testen Sie das Timing, wenn der Debugger ausgeführt wird. Ich möchte nur, dass jemand an dieser Stelle sagt „jepp, das ist richtig“.
Ok, REFBURSThängt von der Energieverwaltung ab. MSCist egal, wenn nicht Multiple/Sequence-Modus. SHSx hängt von Ihrem Sample-Trigger ab. Wenn Sie manuell starten, setzen Sie es auf 0 (ADC10SC-Bit). Für den Rest müssen Sie wirklich Ihre Hardwarekonfiguration überprüfen. Das Timing hängt davon ab, welcher Takt, welche Frequenz usw. verwendet werden. Normalerweise würde ich mit dem grundlegenden Setup beginnen und dann Peripheriegeräte usw. verwenden.
Sie können den Ausgang erhalten, indem Sie eine Timer-Periode ändern und einen einfachen Piezzo (keine integrierte Elektronik) an einen Timer-Ausgang anschließen (mit einfachem Transistor-Wechselrichter, nicht direkt anschließen: Hochspannung (oder einen Vorwiderstand plus Zehnerdiode verwenden). Fragen Sie einfach jemanden an der HU oder einen Freund mit elektrotechnischem Hintergrund, wenn Sie sich dabei verloren fühlen.
@Olaf Ich kann natürlich eine LED blinken lassen oder so, aber ich kann mir auf diese Weise nicht sicher sein, ob die Ausgabe korrekt ist (kann sein, dass ich immer die Ausgabe vom letzten Mal lese oder so). Ich denke, REFBURSTes wird nicht benötigt, da ich den Referenzspannungsgenerator nicht verwende.
LED ist dafür nicht gut, da der Dynamikbereich zu gering ist. Ihre Ohren können einen viel größeren Bereich verfolgen. Sie können auch einen Frequenzzähler verwenden (einige Multimeter haben einen) - das kann sogar einen ziemlich genauen Messwert liefern. Um jemanden sagen zu lassen "es funktioniert!" er müsste die gleiche Hardware haben und den Code tatsächlich für Sie schreiben ...
@Olaf Trotzdem sagt mir das nicht, ob ich versehentlich das letzte Ergebnis lese oder ob es einen Heisenbug gibt. Ich möchte lieber wissen, ob ich die Dinge richtig mache, anstatt zu sagen: „Sieht so aus, als ob es funktioniert“, weshalb ich diese Frage stelle.
Vor allem, weil „es sieht so aus, als ob es funktioniert“ bedeutet aufhören oft „nein, es funktioniert nicht, aber du wirst es nicht scheitern sehen, bis es zu spät ist.“
"... immer den Ausgang vom letzten Mal ablesen ..." naja, wenn man beim Drehen des Potentiometers eine Veränderung sieht, klingt das für mich ganz richtig. Andernfalls benötigen Sie ein Oszilloskop plus Signalgenerator, um Ein- und Ausgabe zu verfolgen, und erwarten eine (nahezu) konstante Verzögerung für rechtwinklige Eingabe zu Ausgabe.
@Olaf Ich werde auch eine Änderung sehen, wenn ich immer die vorletzte Änderung sehe. Ich möchte wirklich sicher sein. Das führt mich nirgendwo hin ohne jemanden, der sagen kann: „Ja, du machst es richtig.“ (oder umgekehrt).
"... Ich möchte wirklich sicher sein ..." Willkommen in der wunderbaren Welt der Low-Cost-Bare-Metal-Embedded-System-Programmierung!
Habe es mit GRACE von TI versucht.
Diese Frage passt zur Embedded System SE-Site. Kannst du diese Frage bitte nochmal dort posten?
@prasad Was ist das? Ist es möglich, meine Frage zu migrieren?
@prasad Bist du sicher, dass es nicht hierher gehört? Ich finde viele ähnliche Fragen auf dieser Seite.
Ja, du hast recht. Aber es gibt sich überschneidende Fragen. Und da es sich um eine Firmware handelt, gehört es zur Embedded System SE-Site.

Antworten (1)

Deine Einstellungen sehen richtig aus. Ich habe jedoch das Gefühl, dass Sie sich beim Takten nicht sicher sind.

Bleiben Sie in Ihrer Sampling-Sequenz ADC10ONauf 0 gesetzt, bis die restlichen Register konfiguriert sind. Wenn Sie dann auf die Probenahme warten, warten Sie nicht eine bestimmte Anzahl von Zyklen. Stattdessen abfragen, ADC10BUSYbis es 0 ist.

Die 64 Takte, auf die in der Sample-and-Hold-Zeiteinstellung verwiesen wird, ADC10SHTxsind keine CPU-Takte (MCLK); sie sind Clocks relativ zu der Clock-Quelle, die Sie mit der ADC10SSELxEinstellung auswählen, dividiert durch den ADC10DIVxWert.

Mit Ihren aktuellen Einstellungen läuft Ihr ADC vom ADC10OSC(internen Oszillator des ADC), der mit ungefähr 5 MHz läuft, und Sie teilen diesen Takt durch 1. Ihre Abtastzeit ist auf 64 Takte oder 12,8 µs eingestellt. Sie können diese Abtastzeit mit 2, 4 oder 8 multiplizieren, indem Sie die Uhr durch denselben Wert teilen.

Wie lange Ihre Abtastzeit sein muss, hängt von Ihrer Hardware ab – insbesondere davon, wie lange es dauern würde, bis Ihre Spannungsquelle einen bestimmten Kondensator füllt. Wenn Sie nicht lange genug warten, erhalten Sie immer noch einen Messwert, aber er wird falsch sein. Das Benutzerhandbuch der MSP430-Familie enthält weitere Einzelheiten. Die Einstellung „Mach es einfach, ich habe alle Zeit der Welt“ würde jedoch die Verwendung der ACLK-Quelle (12 kHz, vorausgesetzt, ACLK wird intern vom VLO bezogen) geteilt durch 8 (= 1,5 kHz) mit 64-Takt-Samples verwenden für eine Abtastzeit von 42 ms. Wie Sie oben berechnet haben, dauert es tatsächlich 77 Takte, sodass das Lesen ungefähr 51 ms dauert. Das ist wirklich langsam und grober Overkill, aber es ist kein schlechter Ausgangspunkt, um abzustimmen.

Danke für deinen Kommentar. Ich habe das oben beschriebene Setup getestet (ich frage ab, ADC10BUSYanstatt zu warten), wobei die Uhr eine 512-Hz-Uhr war (externer 32768-Hz-Oszillator geteilt durch 64) und es scheint bis jetzt zu funktionieren. Danke für deine Antwort, hilft mir weiter.