Inhaltsverzeichnis:

Arduino-Timing-Methoden mit Millis () - Gunook
Arduino-Timing-Methoden mit Millis () - Gunook

Video: Arduino-Timing-Methoden mit Millis () - Gunook

Video: Arduino-Timing-Methoden mit Millis () - Gunook
Video: ARDUINO BASICS #16 - INTERRUPTS für Timer und Taster verwenden 2024, Juli
Anonim
Arduino-Timing-Methoden mit Millis()
Arduino-Timing-Methoden mit Millis()

In diesem Artikel stellen wir millis(); und verwenden Sie sie, um verschiedene Timing-Beispiele zu erstellen.

Millise? Nichts mit Lippensynchronisation zu tun… hoffentlich hast du Milli als numerisches Präfix für Tausendstel erkannt; das heißt, eine Maßeinheit mit 0,001 (oder zehn hoch minus 3) zu multiplizieren.

Interessanterweise zählen unsere Arduino-Systeme die Anzahl der Millisekunden (Tausende einer Sekunde) vom Beginn einer laufenden Skizze, bis die Zählung die maximale Anzahl erreicht, die im Variablentyp unsigned long gespeichert werden kann (eine 32-Bit [vier Byte] ganze Zahl). – das reicht von null bis (2^32)-1, (2^32)-1, oder 4294967295 Millisekunden werden in 49,71027-ungerade Tage umgewandelt.

Der Zähler wird zurückgesetzt, wenn der Arduino zurückgesetzt wird, er den Maximalwert erreicht oder eine neue Skizze hochgeladen wird. Um den Wert des Zählers zu einem bestimmten Zeitpunkt abzurufen, rufen Sie einfach die Funktion auf – zum Beispiel:

start=millis();

Wobei start eine lange Variable ohne Vorzeichen ist. Hier ist ein sehr einfaches Beispiel, um millis() in Aktion zu zeigen:

/* millis()-Demonstration */

unsignierter langer Start, beendet, abgelaufen;

Void-Setup ()

{ Serial.begin (9600); }

Leere Schleife ()

{ Serial.println ("Start …"); start=millis(); Verzögerung (1000); fertig=millis(); Serial.println ("Fertig"); abgelaufen=Beendet-Start; Serial.print (verstrichen); Serial.println ("Millisekunden verstrichen"); Serial.println(); Verzögerung (500); }

Der Sketch speichert den aktuellen Millise-Zähler in Start, wartet dann eine Sekunde und speichert dann den Millis-Wert wieder in Fertig. Schließlich berechnet es die verstrichene Zeit der Verzögerung. Im folgenden Bildschirmauszug des seriellen Monitors können Sie sehen, dass die Dauer nicht immer genau 1000 Millisekunden betrug, wie im Bild gezeigt.

Schritt 1:

Bild
Bild

Einfach ausgedrückt, nutzt die Millis-Funktion einen internen Zähler im ATmega-Mikrocontroller im Herzen Ihres Arduino. Dieser Zähler inkrementiert jeden Taktzyklus – was (bei Standard-Arduino und kompatiblen) mit einer Taktrate von 16 MHz geschieht. Diese Geschwindigkeit wird durch den Kristall auf dem Arduino-Board gesteuert (das silberne Ding mit dem T16.000 darauf gestempelt).

Schritt 2:

Bild
Bild

Die Kristallgenauigkeit kann je nach Außentemperatur und der Toleranz des Kristalls selbst variieren. Dies wirkt sich wiederum auf die Genauigkeit Ihres Millis-Ergebnisses aus. Anekdotische Erfahrungen haben berichtet, dass die Abweichung der Timing-Genauigkeit etwa drei oder vier Sekunden pro 24 Stunden betragen kann.

Wenn Sie ein Board oder Ihre eigene Version verwenden, die einen Keramikresonator anstelle eines Quarzes verwendet, beachten Sie, dass diese nicht so genau sind und die Möglichkeit höherer Driftniveaus mit sich bringen. Wenn Sie ein viel höheres Maß an Timing-Genauigkeit benötigen, sollten Sie spezielle Timer-ICs wie den Maxim DS3231 in Betracht ziehen.

Jetzt können wir die Millis für verschiedene Zeitfunktionen verwenden. Wie in der vorherigen Beispielskizze gezeigt, können wir die verstrichene Zeit berechnen. Um diese Idee voranzubringen, machen wir eine einfache Stoppuhr. Dies kann so einfach oder komplex wie nötig sein, aber für diesen Fall werden wir uns dem Einfachen zuwenden.

Aus der Hardware-Perspektive haben wir zwei Tasten – Start und Stop – mit den 10k-Ohm-Pulldown-Widerständen, die mit den digitalen Pins 2 bzw. 3 verbunden sind. Wenn der Benutzer auf Start drückt, notiert die Skizze den Wert für Millis – nach dem Drücken von Stop notiert die Skizze erneut den Wert für Millis, berechnet und zeigt die verstrichene Zeit an. Der Benutzer kann dann Start drücken, um den Vorgang zu wiederholen, oder für aktualisierte Daten stoppen. Hier ist die Skizze:

/* Super-Basic-Stoppuhr mit millis(); */

unsignierter langer Start, beendet, abgelaufen;

Void-Setup ()

{ Serial.begin (9600); pinMode (2, EINGANG); // Startknopf PinMode (3, INPUT); // Stopptaste Serial.println ("Drücken Sie 1 für Start/Reset, 2 für die verstrichene Zeit"); }

void displayResult()

{ Float h, m, s, ms; lange vorbei unsigniert; abgelaufen=Beendet-Start; h=int(verstrichen/3600000); über=verstrichen%3600000; m=int(über/60000); über=über%60000; s=int(über/1000); ms=über%1000; Serial.print ("Roh verstrichene Zeit: "); Serial.println (verstrichen); Serial.print ("Verstrichene Zeit: "); Seriendruck (h, 0); Serial.print ("h"); Seriendruck (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println("ms"); Serial.println(); }

Leere Schleife ()

{ Wenn (digitalRead (2) = = HOCH) { start = Millis (); Verzögerung (200); // zum Entprellen Serial.println ("Gestartet …"); aufrechtzuerhalten. Wenn (digitalRead (3) = = HOCH) { fertig = Millis (); Verzögerung (200); // zum Entprellen displayResult(); } }

Die Aufrufe von delay() werden verwendet, um die Schalter zu entprellen – diese sind optional und ihre Verwendung hängt von Ihrer Hardware ab. Das Bild ist ein Beispiel für die serielle Monitorausgabe der Skizze – die Stoppuhr wurde gestartet und dann die Taste zwei über einen bestimmten Zeitraum sechsmal gedrückt.

Schritt 3: Tachometer…

Image
Image

Hätte man am Anfang und Ende einer festen Strecke einen Sensor, könnte man die Geschwindigkeit berechnen: Geschwindigkeit = Strecke ÷ Zeit.

Sie können auch einen Tachometer für eine Bewegungsform mit Rädern herstellen, zum Beispiel ein Fahrrad. Zur Zeit haben wir kein Fahrrad zum Herumbasteln, aber wir können den Vorgang beschreiben – es ist ganz einfach. (Haftungsausschluss – tun Sie dies auf eigene Gefahr usw.)

Lassen Sie uns zunächst die erforderlichen Mathematikwerte überprüfen. Sie müssen den Umfang des Rades kennen. Hardware – Sie benötigen einen Sensor. Zum Beispiel – ein Reedschalter und ein Magnet. Betrachten Sie den Reed-Schalter als Schließer und verbinden Sie ihn wie gewohnt mit einem 10k Ohm Pull-Down-Widerstand.

Andere verwenden möglicherweise einen Hall-Effekt-Sensor – jeder für sich). Denken Sie daran, aus dem Mathematikunterricht den Umfang zu berechnen – verwenden Sie die Formel: Umfang = 2πr wobei r der Radius des Kreises ist.

Da Sie nun den Radumfang haben, kann dieser Wert als unsere „feste Distanz“betrachtet werden, und daher kann die Geschwindigkeit berechnet werden, indem die verstrichene Zeit zwischen einer vollen Umdrehung gemessen wird.

Ihr Sensor sollte – sobald er montiert ist – auf die gleiche Weise wie ein normalerweise geöffneter Knopf funktionieren, der bei jeder Umdrehung gedrückt wird. Unsere Skizze misst die zwischen jedem Impuls vom Sensor verstrichene Zeit.

Dazu wird in unserem Beispiel der Sensorausgang mit dem digitalen Pin 2 verbunden – da er einen Interrupt zur Berechnung der Geschwindigkeit auslöst. Die Skizze zeigt ansonsten die Geschwindigkeit auf einem normalen I2C-Interface-LCD-Modul an. Die I2C-Schnittstelle wird empfohlen, da dies nur 4 Drähte von der Arduino-Platine zum LCD erfordert – je weniger Drähte, desto besser.

Hier ist die Skizze für Ihre Einsicht:

/*Einfacher Tachometer mit millis(); */

#include "Wire.h" // für I2C-Bus-LCD

#include "LiquidCrystal_I2C.h" // für I2C-Bus-LCD-Modul - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // setze die LCD-Adresse auf 0x27 für eine 16-stellige und 2-zeilige Anzeige

Schwimmstart, fertig;

Float abgelaufen, Zeit; float circMetric=1,2; // Radumfang relativ zur Sensorposition (in Metern) float circImperial; // mit 1 Kilometer = 0,621371192 Meilen float speedk, speedm; // enthält berechnete Geschwindigkeitswerte in metrischen und imperialen

Void-Setup ()

{ attachInterrupt (0, speedCalc, RISING); // Interrupt aufgerufen, wenn Sensoren Digital 2 High (jede Radumdrehung) sendet start = millis (); // LCD einrichten lcd.init (); // lcd initialisieren lcd.backlight (); // LCD-Hintergrundbeleuchtung einschalten lcd.clear (); lcd.println("Helm tragen!"); Verzögerung (3000); lcd.clear(); Serial.begin(115200); circImperial=circMetric*.62137; // Konvertieren Sie Metrik in Imperial für MPH-Berechnungen }

void speedCalc()

{ verstrichen=millis()-start; start=millis(); speedk=(3600*circMetric)/verstrichen; // km/h speedm=(3600*circImperial)/verstrichen; // Meilen pro Stunde }

Leere Schleife ()

{ lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print("km/h"); lcd.print (int (speedm)); lcd.print("MPH"); lcd.setCursor(0, 1); lcd.print (int (verstrichen)); lcd.print("ms/rev"); Verzögerung (1000); // an persönliche Vorlieben anpassen, um Flimmern zu minimieren }

Es ist nicht viel los – jedes Mal, wenn das Rad eine Umdrehung beendet, geht das Signal des Sensors von niedrig auf hoch – was einen Interrupt auslöst, der die Funktion speedCalc() aufruft.

Dies nimmt einen Messwert von Millis() und berechnet dann die Differenz zwischen dem aktuellen Messwert und dem vorherigen Messwert – dieser Wert wird die Zeit zum Zurücklegen der Strecke (das ist der Umfang des Rads relativ zum Sensor – gespeichert in.)

float circMetric=1,2;

und wird in Metern gemessen). Es berechnet schließlich die Geschwindigkeit in km/h und MPH. Zwischen den Unterbrechungen zeigt die Skizze aus Neugierde die aktualisierten Geschwindigkeitsdaten auf dem LCD sowie den Rohzeitwert für jede Umdrehung an. Im wirklichen Leben glaube ich nicht, dass jemand ein LCD an einem Fahrrad montieren würde, vielleicht wäre ein LED-Display relevanter.

In der Zwischenzeit können Sie im folgenden kurzen Videoclip sehen, wie dieses Beispiel funktioniert. Anstelle einer Fahrradrad- und Reedschalter-/Magnetkombination habe ich den Rechteckwellenausgang eines Funktionsgenerators mit dem Interrupt-Pin verbunden, um die Impulse vom Sensor zu simulieren, damit Sie sich ein Bild davon machen können, wie es funktioniert.

Schritt 4:

Das fasst die Verwendung von millis() vorerst zusammen. Es gibt auch die micros(); Funktion, die Mikrosekunden zählt.

Da haben Sie es also – eine weitere praktische Funktion, mit der mehr Probleme über die Arduino-Welt gelöst werden können. Wie immer liegt es jetzt an Ihnen und Ihrer Fantasie, etwas zu finden, das Sie kontrollieren oder anderen Spielereien nachgehen können.

Dieser Beitrag wird Ihnen von pmdway.com bereitgestellt - alles für Macher und Elektronik-Enthusiasten, mit kostenloser Lieferung weltweit.

Empfohlen: