- Vergleich von ADC in Arduino und STM32F103C8
- ADC in STM32
- Wie ein analoges Signal in ein digitales Format umgewandelt wird
- ADC-Pins in STM32F103C8T6
- Erforderliche Komponenten
- Schaltplan und Erklärungen
- Programmierung von STM32 zum Lesen von ADC-Werten
Eine gemeinsame Funktion, die in fast jeder eingebetteten Anwendung verwendet wird, ist das ADC-Modul (Analog-Digital-Wandler). Diese Analog-Digital-Wandler können die Spannung von analogen Sensoren wie Temperatursensor, Neigungssensor, Stromsensor, Flex-Sensor und vielem mehr lesen. In diesem Tutorial erfahren Sie, wie Sie ADC in STM32F103C8 verwenden, um analoge Spannungen mit der Energia IDE zu lesen. Wir werden ein kleines Potentiometer an die Blue Pill-Platine STM32 anschließen und einen analogen Pin mit variierender Spannung versorgen, die Spannung ablesen und auf dem 16x2-LCD-Bildschirm anzeigen.
Vergleich von ADC in Arduino und STM32F103C8
In der Arduino-Karte enthält es einen 10-Bit-ADC mit 6 Kanälen (8 Kanäle beim Mini und Nano, 16 beim Mega) und einem Eingangsspannungsbereich von 0 V bis 5 V. Dies bedeutet, dass Eingangsspannungen zwischen 0 und 5 Volt auf ganzzahlige Werte zwischen 0 und 1023 abgebildet werden. Im Fall von STM32F103C8 haben wir jetzt 10 Kanäle, 12-Bit-ADC mit einem Eingangsbereich von 0 V bis 3,3 V. Eingangsspannungen zwischen 0 und 3,3 Volt werden in ganzzahlige Werte zwischen 0 und 4095 abgebildet.
ADC in STM32
Der in STM32-Mikrocontroller eingebettete ADC verwendet das SAR-Prinzip (Sukzessive Approximation Register), bei dem die Konvertierung in mehreren Schritten durchgeführt wird. Die Anzahl der Konvertierungsschritte entspricht der Anzahl der Bits im ADC-Konverter. Jeder Schritt wird von der ADC-Uhr gesteuert. Jeder ADC-Takt erzeugt vom Ergebnis bis zur Ausgabe ein Bit. Das interne ADC-Design basiert auf der Schaltkondensatortechnik. Wenn Sie STM32 noch nicht kennen, lesen Sie unser Tutorial Erste Schritte mit STM32.
12-Bit-Auflösung
Dieser ADC ist ein 10-Kanal-12-Bit-ADC. Hier impliziert der Begriff 10 Kanal, dass es 10 ADC-Pins gibt, mit denen wir die analoge Spannung messen können. Der Begriff 12-Bit impliziert die Auflösung des ADC. 12-Bit bedeutet 2 hoch zehn (2 12), was 4096 entspricht. Dies ist die Anzahl der Abtastschritte für unseren ADC, sodass der Bereich unserer ADC-Werte zwischen 0 und 4095 liegt. Der Wert erhöht sich von 0 auf 4095 basierend auf dem Wert der Spannung pro Schritt, der durch eine Formel berechnet werden kann
SPANNUNG / SCHRITT = REFERENZSPANNUNG / 4096 = (3,3 / 4096 = 8,056 mV) pro Einheit.
Wie ein analoges Signal in ein digitales Format umgewandelt wird
Da Computer nur binäre / digitale Werte (Einsen und Nullen) speichern und verarbeiten. Daher müssen analoge Signale wie der Sensorausgang in Volt zur Verarbeitung in digitale Werte umgewandelt werden und die Umwandlung muss genau sein. Wenn STM32 an seinen analogen Eingängen eine analoge Eingangsspannung zugeführt wird, wird der analoge Wert gelesen und in einer ganzzahligen Variablen gespeichert. Dieser gespeicherte analoge Wert (0-3,3 V) wird unter Verwendung der folgenden Formel in ganzzahlige Werte (0-4096) umgewandelt:
EINGANGSSPANNUNG = (ADC-Wert / ADC-Auflösung) * Referenzspannung
Auflösung = 4096
Referenz = 3,3 V.
ADC-Pins in STM32F103C8T6
In STM32 gibt es 10 analoge Pins von PA0 bis PB1.
Überprüfen Sie auch, wie ADC in anderen Mikrocontrollern verwendet wird:
- Wie verwende ich ADC in Arduino Uno?
- Schnittstelle zwischen ADC0808 und 8051-Mikrocontroller
- Verwenden des ADC-Moduls des PIC-Mikrocontrollers
- Raspberry Pi ADC Tutorial
- Verwendung des ADC in MSP430G2 - Messung der analogen Spannung
Erforderliche Komponenten
- STM32F103C8
- LCD 16 * 2
- Potentiometer 100k
- Steckbrett
- Kabel anschließen
Schaltplan und Erklärungen
Das Schaltbild eine Schnittstelle 16 * 2 LCD und Analogeingang an einen STM32F103C8T6 Platine ist unten gezeigt.
Die Verbindungen, die für LCD hergestellt werden, sind unten angegeben:
LCD Pin Nr |
LCD-Pin-Name |
STM32 Pin Name |
1 |
Boden (Gnd) |
Boden (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin von der Mitte des Potentiometers |
4 |
Register Select (RS) |
PB11 |
5 |
Lesen / Schreiben (RW) |
Boden (G) |
6 |
Aktivieren (EN) |
PB10 |
7 |
Datenbit 0 (DB0) |
Keine Verbindung (NC) |
8 |
Datenbit 1 (DB1) |
Keine Verbindung (NC) |
9 |
Datenbit 2 (DB2) |
Keine Verbindung (NC) |
10 |
Datenbit 3 (DB3) |
Keine Verbindung (NC) |
11 |
Datenbit 4 (DB4) |
PB0 |
12 |
Datenbit 5 (DB5) |
PB1 |
13 |
Datenbit 6 (DB6) |
PC13 |
14 |
Datenbit 7 (DB7) |
PC14 |
15 |
LED positiv |
5V |
16 |
LED negativ |
Boden (G) |
Die Verbindungen werden gemäß der oben angegebenen Tabelle hergestellt. In der Schaltung sind zwei Potentiometer vorhanden, das erste wird für den Spannungsteiler verwendet, der zum Variieren der Spannung und zum Bereitstellen eines Analogeingangs für STM32 verwendet werden kann. Der linke Pin dieses Potentiometers erhält eine positive Eingangsspannung vom STM32 (3,3 V) und der rechte Pin ist mit Masse verbunden, der mittlere Pin des Potentiometers ist mit dem analogen Eingangspin (PA7) des STM32 verbunden. Das andere Potentiometer dient zum Variieren des Kontrasts des LCD-Displays. Die Stromquelle für STM32 wird über ein USB-Netzteil von einem PC oder Laptop bereitgestellt.
Programmierung von STM32 zum Lesen von ADC-Werten
In unserem vorherigen Tutorial haben wir uns mit der Programmierung der STM32F103C8T6-Karte über den USB-Anschluss vertraut gemacht. Wir brauchen jetzt also keinen FTDI-Programmierer. Schließen Sie es einfach über den USB-Anschluss des STM32 an den PC an und starten Sie die Programmierung mit der ARDUINO IDE. Das Programmieren Ihres STM32 in ARDUINO IDE zum Lesen der analogen Spannung ist sehr einfach. Es ist das gleiche wie Arduino Board. Die Überbrückungsstifte des STM32 müssen nicht gewechselt werden.
In diesem Programm wird der Analogwert gelesen und die Spannung mit diesem Wert berechnet. Anschließend werden sowohl analoge als auch digitale Werte auf dem LCD-Bildschirm angezeigt.
Erste LCD Stifte definieren geführt. Diese definieren, an welchen Pin des STM32 die LCD-Pins angeschlossen sind. Sie können gemäß Ihren Anforderungen ändern.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // Erwähne die Pin-Namen, mit denen das LCD verbunden ist
Als nächstes fügen wir die Header-Datei für die LCD-Anzeige hinzu. Dies ruft die Bibliothek auf, die den Code für die Kommunikation des STM32 mit dem LCD enthält. Stellen Sie außerdem sicher, dass die Funktion Flüssigkristall mit den oben definierten Pin-Namen aufgerufen wird.
#einschließen
Innerhalb der setup () -Funktion würden wir nur eine Intro-Nachricht geben, die auf dem LCD-Bildschirm angezeigt wird. Sie können lernen, wie Sie LCD mit STM32 verbinden.
lcd.begin (16, 2); // Wir verwenden ein 16 * 2 LCD lcd.clear (); // Lösche den Bildschirm lcd.setCursor (0, 0); // In der ersten Zeile erste Spalte lcd.prin t ("CIRCUITDIGEST"); // Drucke diesen lcd.setCursor (0, 1); // In der zweiten Zeile erste Spalte n lcd.print ("STM32F103C8"); Drucken // thi s Verzögerung (2000); // warte zwei Sekunden lcd.clear (); // Lösche den Bildschirm lcd.setCursor (0, 0); // In der ersten Zeile erste Spalte lcd.print ("USING ADC IN"); // Diesen lcd.setCursor (0,1) drucken; // In der zweiten Zeile der ersten Spalte lcd.print ("STM32F103C8"); // Diese Verzögerung drucken (2000); // warte zwei Sekunden lcd.clear (); // Bildschirm löschen
Schließlich beginnen wir innerhalb unserer Endlosschleifenfunktion () mit dem Lesen der analogen Spannung, die vom Potentiometer an den PA7-Pin geliefert wird. Wie bereits erwähnt, ist der Mikrocontroller ein digitales Gerät und kann den Spannungspegel nicht direkt ablesen. Mit der SAR-Technik wird der Spannungspegel von 0 auf 4096 abgebildet. Diese Werte werden als ADC-Werte bezeichnet. Um diesen ADC-Wert zu erhalten, verwenden Sie einfach die folgende Zeile
int val = analogRead (A7); // Lesen Sie den ADC-Wert von Pin PA 7
Hier wird mit der Funktion analogRead () der Analogwert des Pins gelesen. Schließlich speichern wir diesen Wert in einer Variablen namens " val ". Der Typ dieser Variablen ist eine Ganzzahl, da nur Werte zwischen 0 und 4096 in dieser Variablen gespeichert werden.
Der nächste Schritt wäre die Berechnung des Spannungswerts aus dem ADC-Wert. Dazu haben wir folgende Formeln
Spannung = (ADC-Wert / ADC-Auflösung) * Referenzspannung e
In unserem Fall wissen wir bereits, dass die ADC-Auflösung unseres Mikrocontrollers 4096 beträgt. Der ADC-Wert befindet sich auch in der vorherigen Zeile und speichert die Variable val. Die Referenzspannung ist gleich der Spannung, bei der der Mikrocontroller arbeitet. Wenn die STM32 Platte über USB - Kabel mit Strom versorgt wird, dann ist die Betriebsspannung 3,3V. Sie können die Betriebsspannung auch mit einem Multimeter über dem Vcc- und Erdungsstift auf der Platine messen. Die obige Formel passt also wie unten gezeigt in unseren Fall
Float-Spannung = (Float (Val) / 4096) * 3,3; // Formeln zum Konvertieren des ADC-Werts in voltag e
Sie könnten mit der Zeile float (val) verwechselt werden . Dies wird verwendet, um die Variable "val" vom Datentyp int in den Datentyp "float" zu konvertieren. Diese Konvertierung ist erforderlich, da wir sie nur multiplizieren können, wenn wir das Ergebnis von val / 4096 in float erhalten. 3.3. Wenn der Wert in einer ganzen Zahl empfangen wird, ist er immer 0 und das Ergebnis ist ebenfalls Null. Nachdem wir den ADC-Wert und die Spannung berechnet haben, müssen Sie nur noch das Ergebnis auf dem LCD-Bildschirm anzeigen. Dies kann mithilfe der folgenden Zeilen erfolgen
lcd.setCursor (0, 0); // setze den Cursor auf Spalte 0, Zeile 0 lcd.print ("ADC Val:"); lcd.print (val); // ADC-Wert anzeigen lcd.setCursor (0, 1); // setze den Cursor auf Spalte 0, Zeile 1 lcd.print ("Voltage:"); lcd.print (Spannung); // Spannung anzeigen
Der vollständige Code und das Demonstrationsvideo sind unten angegeben.