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.