Die Header-Datei
class Motor { private: int en,m1,m2,i1,i2; int st[4]={0,2,3,1}; // Abfolge der Zustände volatile int pos; // Aktueller Zustand volatile long steps=0; // Einzelschritte (steps) volatile long stepsalt=0; volatile long talt,tneu;// Zeitpunkt der Messungen volatile float f; // Schrittfrequenz public: Motor(int e,int a,int b,int c,int d); void power(int p); void richtung(); /* * Wir immer ausgeführt, wenn eine Änderung bei * i1 oder i2 auftritt */ long getSteps(); // Liefert die bisher gemachten Eintelschritte float getF(); // Liefert die Frequenz Einzelschritte/Sekunde };
Für die Schrittfrequenz \(f\)gilt: $$f={{1}\over{T}}={{Anzahl \, der\, Schritte}\over{Benötigte\, Zeit}}$$
Um Ungenauigkeiten der Lichtschrankenpositionen weg zu mitteln, berechnen wir die Frequenz immer nach 4 Schritten.
In der Klasse müssen noch einige zusätzliche Daten gespeichert werden:
stepsalt
gibt die Schrittzahl bei der letzten Messung an.
In talt
und tneu
sind die Zeitpunkte der letzten und der aktuellen Messung gespeichert.
Und f
speichert schließlich die berechnete Frequenz.
Die Methode getF()
liefert die Frequenz \(f\) zurück.
Die cpp-Datei
void Motor::richtung() { ... if (pos==0) { tneu=micros(); // Aktuelle Zeit; f=1000000.0*float(steps-stepsalt)/float(tneu-talt); talt=tneu; stepsalt=steps; } }
Die eigentliche Berechnung findet in der Methode richtung()
statt.
Man beachte, dass die Zeit in \(10^{-6}\) s gemessen wird. Daher taucht bei der Frequenzberechnung der Faktor \(10^6=1000000.0\) auf.
float Motor::getF() { if (micros()-talt>40000) f=0.0; return f; }
getF()
gibt die Schrittfrequenz zurück. Liegt die letze Ferquenzberechnung länger als 40 ms zurück, wird f
auf 0 gesetzt
Anwendung der Klasse Motor
Methode | Bemerkung |
---|---|
Motor(int en,int m1,int m2,int i1,int i2); | Konstruktor der Klasse |
void power(int p); | Setzt die Motorleistung auf p \( (-255 \leq p \leq 255)\). Bei \(p<0\) läuft der Motor rückwärts. |
void richtung(); | Wird von einer Interruptmethode angesprungen und berechnet die Drehschritte und die Drehfrequenz. |
long getSteps(); | Liefert die bisher gemachten Einzelschritte. |
float getF(); | Liefert die Frequenz Einzelschritte/Sekunde. |
Das Beispiel kann hier herunter geladen werden.