- Erforderliche Materialien
- ADC auf STM8S103F3P6
- Schaltplan zum Lesen der ADC-Werte auf dem STM8S und der Anzeige auf dem LCD
- ADC-Bibliothek für STM8S103F3P6
- STM8S-Programm zum Lesen der analogen Spannung und Anzeige auf dem LCD
- Ablesen der analogen Spannung von zwei Potentiometern mit STM8S
Wenn Sie ein regelmäßiger Leser sind, der unsere STM8S-Mikrocontroller-Tutorials befolgt, wissen Sie, dass wir in unserem letzten Tutorial gelernt haben, wie man ein 16x2-LCD mit STM8s verbindet. Wenn Sie nun mit diesem Tutorial fortfahren, lernen Sie, wie Sie die ADC-Funktion auf unserem STM8S103F3P6-Mikrocontroller verwenden. Ein ADC ist ein sehr nützliches Peripheriegerät in einem Mikrocontroller, das häufig von eingebetteten Programmierern verwendet wird, um Einheiten zu messen, die sich ständig ändern, z. B. Spannung, Strom, Temperatur, Luftfeuchtigkeit usw.
Wie wir wissen, „leben wir in einer analogen Welt mit digitalen Geräten“, was bedeutet, dass alles um uns herum wie Windgeschwindigkeit, Lichtintensität, Temperatur und alles, was wir tun, wie Geschwindigkeit, Geschwindigkeit, Druck usw., analoger Natur sind. Unsere Mikrocontroller und Mikroprozessoren sind jedoch digitale Geräte und können diese Parameter ohne ein wichtiges Peripheriegerät namens Analog-Digital-Wandler (ADC) nicht messen. In diesem Artikel erfahren Sie, wie Sie ADC auf einem STM8S-Mikrocontroller mit COMIC C-Compiler verwenden.
Erforderliche Materialien
In diesem Artikel lesen wir zwei analoge Spannungswerte von zwei Potentiometern und zeigen ihren ADC-Wert auf einem 16x2-LCD-Display an. Dazu benötigen wir folgende Komponenten.
- STM8S103F3P6 Entwicklungsplatine
- ST-Link V2 Programmierer
- 16x2 LCD
- Potentiometer
- Kabel anschließen
- 1k Widerstand
ADC auf STM8S103F3P6
Es gibt viele Arten von ADCs und jeder Mikrocontroller hat seine eigenen Spezifikationen. Auf dem STM8S103F3P6 haben wir einen ADC mit 5-Kanal- und 10-Bit-Auflösung; Mit einer Auflösung von 10 Bit können wir den digitalen Wert von 0 bis 1024 messen. Ein 5-Kanal-ADC zeigt an, dass der Mikrocontroller 5 Pins hat, die ADC unterstützen. Diese 5 Pins sind in der Abbildung unten hervorgehoben.
Wie Sie sehen können, werden alle diese fünf Pins (AIN2, AIN3, AIN4, AIN5 und AIN6) mit anderen Peripheriegeräten gemultiplext. Dies bedeutet, dass diese Pins nicht nur als ADC-Pin fungieren, sondern auch für andere Kommunikationen wie beispielsweise verwendet werden können Die Pins 2 und 3 (AIN5 und AIN 6) können nicht nur für ADC, sondern auch für serielle Kommunikation und GPIO-Funktionen verwendet werden. Beachten Sie, dass es nicht möglich ist, denselben Pin für alle drei Zwecke zu verwenden. Wenn wir also diese beiden Pins für ADC verwenden, können wir keine serielle Kommunikation durchführen. Weitere wichtige ADC-Eigenschaften für STM8S103P36 finden Sie in der folgenden Tabelle aus dem Datenblatt.
In der obigen Tabelle steht Vdd für Betriebsspannung und Vss für Masse. In unserem Fall auf unserer Entwicklungsplatine, in der der Mikrocontroller mit 3,3 V betrieben wird, können Sie den Schaltplan der Entwicklungsplatine von Anfang an mit dem STM8S-Lernprogramm überprüfen. Mit 3,3 V als Betriebsspannung kann unsere ADC-Taktfrequenz zwischen 1 und 4 MHz eingestellt werden und unser Umwandlungsspannungsbereich liegt zwischen 0 V und 3,3 V. Dies bedeutet, dass unser 10-Bit-ADC 0 liest, wenn 0 V (Vss) bereitgestellt werden, und maximal 1024 liest, wenn 3,3 V (Vdd) bereitgestellt werden. Wir können diese 0-5 V leicht ändern, indem wir bei Bedarf die Betriebsspannung der MCU ändern.
Schaltplan zum Lesen der ADC-Werte auf dem STM8S und der Anzeige auf dem LCD
Das vollständige Schaltbild, das in diesem Projekt verwendet wird, ist unten angegeben. Es ist dem zuvor besprochenen STM8S-LCD-Tutorial sehr ähnlich.
Wie Sie sehen können, sind die einzigen zusätzlichen Komponenten neben dem LCD zwei Potentiometer POT_1 und POT_2 . Diese Potis sind mit den Ports PC4 und PD6 verbunden, bei denen es sich um die ANI2- und ANI6-Pins handelt, wie oben im Pinbelegungsbild erläutert.
Die Potentiometer sind so angeschlossen, dass wir beim Variieren 0-5 V an unseren analogen Pins erhalten. Wir werden unseren Controller so programmieren, dass er diese analoge Spannung im digitalen Wert (0 bis 1024) liest und auf dem LCD-Bildschirm anzeigt. Dann berechnen wir auch den äquivalenten Spannungswert und zeigen ihn auf dem LCD an. Denken Sie jedoch daran, dass unser Controller mit 3,3 V versorgt wird. Selbst wenn wir den ADC-Pin mit 5 V versorgen, kann er nur von 0 V bis 3,3 V lesen.
Sobald die Verbindungen hergestellt sind, sieht meine Hardware wie unten gezeigt aus. Sie sehen die beiden Potentiometer rechts und den ST-Link-Programmierer links.
ADC-Bibliothek für STM8S103F3P6
Um ADC-Funktionen auf STM8S zu programmieren, verwenden wir den Cosmic C-Compiler zusammen mit den SPL-Bibliotheken. Um die Prozesse zu vereinfachen, habe ich eine weitere Header-Datei erstellt, die auf GitHub unter dem folgenden Link zu finden ist.
ADC-Bibliothek für STM8S103F3P6
Wenn Sie wissen, was Sie tun, können Sie mit dem obigen Code eine Header-Datei erstellen und sie dem Verzeichnis "Include-Dateien" auf Ihrer Projektseite hinzufügen. Befolgen Sie andernfalls die ersten Schritte mit dem STM8S-Lernprogramm, um zu erfahren, wie Sie Ihre Programmierumgebung und Ihren Compiler einrichten. Sobald Ihr Setup fertig ist, sollte Ihre IDE die folgenden Header-Dateien haben, zumindest die rot eingekreisten.
Die obige Header-Datei besteht aus einer Funktion namens ADC_Read () . Diese Funktion kann in Ihrem Hauptprogramm aufgerufen werden, um den ADC-Wert an jedem Pin zu erhalten. Beispielsweise gibt ADC_Read (AN2) als Ergebnis den ADC-Wert an Pin AN2 zurück. Die Funktion ist unten dargestellt.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int result = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (ENABLE); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); Ergebnis = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Wie Sie sehen, können wir dieser Funktion acht Parameter übergeben. Dies definiert, wie der ADC konfiguriert ist. In unserem obigen Bibliothekscode haben wir den Konvertierungsmodus auf kontinuierlich gesetzt und dann die Kanalnummer an einen Parameter übergeben. Und dann müssen wir die CPU-Frequenz unseres Controllers einstellen. Wenn Sie keinen externen Quarz angeschlossen haben, arbeitet Ihr STM8S standardmäßig mit einem internen 16-MHz-Oszillator. Daher haben wir " ADC1_PRESSEL_FCPU_D18 " als Pre-Scaler-Wert erwähnt. Innerhalb dieser Funktion verwenden wir andere Methoden, die in der SPL- Headerdatei stm8s_adc1.h definiert sind. Wir beginnen mit der De-Initialisierung der ADC-Pins und dann mit ADC1_Init () , um das ADC-Peripheriegerät zu initialisieren. Die Definition dieser Funktion aus dem SPL-Benutzerhandbuch ist unten dargestellt.
Als nächstes setzen wir den externen Trigger mit einem Timer und deaktivieren den externen Trigger, da wir ihn hier nicht verwenden werden. Und dann haben wir die Ausrichtung rechts eingestellt und die letzten beiden Parameter werden verwendet, um den Schmitt-Trigger einzustellen, aber wir werden ihn für dieses Tutorial deaktivieren. Um es kurz zu machen, wir werden unseren ADC im kontinuierlichen Konvertierungsmodus an dem erforderlichen ADC-Pin arbeiten, wobei der externe Trigger und der Schmitt-Trigger deaktiviert sind. Sie können das Datenblatt überprüfen, wenn Sie weitere Informationen zur Verwendung des externen Triggers oder der Schmitt-Triggeroption benötigen. Dies wird in diesem Lernprogramm nicht behandelt.
STM8S-Programm zum Lesen der analogen Spannung und Anzeige auf dem LCD
Der vollständige Code in der Datei main.c befindet sich unten auf dieser Seite. Nach dem Hinzufügen der erforderlichen Header- und Quelldateien sollten Sie in der Lage sein, die Hauptdatei direkt zu kompilieren. Die Erklärung des Codes in der Hauptdatei lautet wie folgt. Ich werde das STM8S LCD-Programm nicht erklären, da wir dies bereits im vorherigen Tutorial besprochen haben.
Der Zweck des Codes besteht darin, ADC-Werte von zwei Pins zu lesen und in einen Spannungswert umzuwandeln. Wir werden auch sowohl den ADC-Wert als auch den Spannungswert auf dem LCD anzeigen. Daher habe ich eine Funktion namens LCD_Print Var verwendet, die eine Variable im Ganzzahlformat aufnimmt und in ein Zeichen konvertiert, um sie auf dem LCD anzuzeigen. Wir haben die einfachen Modul- (%) und Divisions- (/) Operatoren verwendet, um jede Ziffer aus der Variablen zu erhalten und Variablen wie d1, d2, d3 und d4 einzugeben, wie unten gezeigt. Dann können wir die Funktion LCD_Print_Char verwenden, um diese Zeichen auf dem LCD anzuzeigen.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }}
Als nächstes haben wir unter der Hauptfunktion vier Variablen deklariert. Zwei davon werden verwendet, um den ADC-Wert (0 bis 1024) zu speichern, und die anderen beiden werden verwendet, um den tatsächlichen Spannungswert zu erhalten.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Als nächstes müssen wir die GPIO-Pins und die Taktkonfiguration vorbereiten, um die analoge Spannung zu lesen. Hier lesen wir die analoge Spannung von den Pins AIN2 und AIN6, die die Pins PC4 bzw. PD6 sind. Wir müssen diesen Pin in einem schwebenden Zustand definieren, wie unten gezeigt. Wir werden auch das Clock-Peripheriegerät für ADC aktivieren.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Peripherietakt für ADC aktivieren GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Nachdem die Pins fertig sind, müssen wir in die Endlosschleife gelangen, um die analoge Spannung abzulesen. Da wir unsere Header-Datei haben, können wir die analoge Spannung von den Pins AIN2 und AIN 6 mithilfe der folgenden Zeilen leicht ablesen.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Der nächste Schritt besteht darin, diesen ADC-Wert (0 bis 1023) in eine analoge Spannung umzuwandeln. Auf diese Weise können wir den genauen Spannungswert anzeigen, der an Pin AIN2 und AIN6 angegeben ist. Die Formeln zur Berechnung der analogen Spannung können gegeben werden durch:
Analoge Spannung = ADC-Messwert * (3300/1023)
In unserem Fall auf STM8S103F3-Controllern haben wir einen ADC mit 10-Bit-Auflösung, also haben wir 1023 (2 ^ 10) verwendet . Auch bei unserer Entwicklung wird der Controller mit 3,3 V mit 3300 V betrieben, sodass wir 3300 durch 1023 in den obigen Formeln geteilt haben. Ungefähr 3300/1023 ergibt 3,226, daher haben wir in unserem Programm die folgenden Zeilen, um die tatsächliche ADC-Spannung unter Verwendung der ADC-Spannung zu messen.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) ADC-Wert 1 in 0 in 3300 mV konvertieren ADC_voltage_2 = ADC_value_2 * (3.226); // ADC-Wert 1 in 0 in 3300 mV konvertieren
Der verbleibende Teil des Codes wird nur verwendet, um diese vier Werte auf dem LCD-Bildschirm anzuzeigen. Wir haben auch eine Verzögerung von 500 ms, so dass das LCD alle 500 ms aktualisiert wird. Sie können dies weiter reduzieren, wenn Sie schnellere Updates benötigen.
Ablesen der analogen Spannung von zwei Potentiometern mit STM8S
Kompilieren Sie den Code und laden Sie ihn auf Ihr Development Board hoch. Wenn beim Kompilieren ein Fehler auftritt, stellen Sie sicher, dass Sie alle Header- und Quelldateien wie oben beschrieben hinzugefügt haben. Sobald der Code hochgeladen wurde, sollte eine kleine Begrüßungsnachricht mit der Aufschrift „ADC on STM8S“ angezeigt werden. Anschließend sollte der folgende Bildschirm angezeigt werden.
Die Werte D1 und D2 geben den ADC-Wert von Pin Ain2 bzw. AIN6 an. Auf der rechten Seite werden auch die äquivalenten Spannungswerte angezeigt. Dieser Wert sollte gleich der Spannung sein, die an Pin AIN2 bzw. AIN6 auftritt. Wir können dies mit einem Multimeter überprüfen. Wir können auch die Potentiometer variieren, um zu überprüfen, ob sich auch der Spannungswert entsprechend ändert.
Komplette Arbeiten finden Sie auch im Video unten. Ich hoffe, Ihnen hat das Tutorial gefallen und Sie haben etwas Nützliches gelernt. Wenn Sie Fragen haben, lassen Sie diese im Kommentarbereich unten. Sie können auch unsere Foren verwenden, um eine Diskussion zu beginnen oder andere technische Fragen zu stellen.