Zum Inhalt springen

2. Erweiterung: Berechnung der Schrittfrequenz

Die h-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

MethodeBemerkung
Motor(int en,int m1,int m2,int i1,int i2);Konstruktor der Klasse
en: Enablepin
m1: Motorpin 1
m2: Motorpin 2
i1: Inputpin1
i2: Inputpin2
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.