kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Verwendung von Lookup-Tabellen zur Erzeugung von Zeitsignalen am Beispiel von PWM

Wie bereits angedeutet, kann der zeitliche Verlauf von klar definierten Ausgangssignalen leicht vorausberechnet und in einem Array abgelegt werden. Bei allgemein umzusetzenden periodischen Zeitsignalen, müsste als Array-Größe ein ganzzahliges Vielfaches der auftauchenden Perioden in einer Basiseinheit (Abtastperiode des Arrays) gewählt werden. Im Falle von PWM-Signalen ist dies besonders einfach, da die Grundperiode aller auftretenden Signalvarianten gleich ist.

Entwurf eines Mehrkanal-PWM-Gebers für den Parallelport eines PCs

  • Für jede umzusetzende PWM-Breite existiert ein eigenes Array mit einer Periode des Signals.
  • Sowohl die Abtastfrequenz fscan, sowie die Arraylänge n und die Anzahl der Arrays arranz hängen dabei von der gewünschten Auflösung a [Schritte/Periode] und der Periodendauer dt ab.
Schematische Darstellung eines Lookup-table-basierten PWM-Gebers mit PWM-Breitenzuordnung über Referenz/Pointer.

Bild 0-1: Schematische Darstellung eines Lookup-table-basierten PWM-Gebers mit PWM-Breitenzuordnung über Referenz/Pointer.

Übung
  • Geben Sie eine Formel zur Bestimmung der Größen fscan, n, arranz aus a und dt.
  • Nehmen Sie eine sinnvolle Festlegung von a und dt für den Einsatz bei handelsüblichen Modellbauservos vor.
  • Bei der Verwendung eines Bytes (8 Servos) und einer Arraylänge von 255 ergeben sich gewisse Verbesserungsmöglichkeiten für die Performance. Ist diese Konstellation umsetzbar, wenn ja wie?
  • Die Umschaltungen zwischen zwischen den unterschiedlichen PWM-Breiten kann über eine Umschaltung zwischen verschiedenen Referenzen erfolgen.
  • Folgendes Programm zeigt im Prinzip, wie das gemeint ist:
public class PWM
{
  public static void main(String[] args)
  {
     int[][] lookup = new int[6][]; //Arraylänge n=6
     lookup[0] = new int[] {1,0,0,0,0,0}; //arranz=3, PWM-Breiten-Varianten
     lookup[1] = new int[] {1,1,0,0,0,0};
     lookup[2] = new int[] {1,1,1,0,0,0};
     lookup[3] = new int[] {2,0,0,0,0,0}; //ermöglicht bitweise & - Verknüpfung
     lookup[4] = new int[] {2,2,0,0,0,0};
     lookup[5] = new int[] {2,2,2,0,0,0};
     int[][] referenz = new int[2][]; //Speichern des Arrays mit der aktuellen PWM-Breite.
                                      //Für 2 Servos
     int zaehler = 0;
     int servo = 0;
     referenz[0]=lookup[0];
     referenz[1]=lookup[1+3];
     for(int i=0;i<12;i++)
     {
          servo = referenz[0][zaehler] | referenz[1][zaehler];
          System.out.println(  (servo & 1)+" "+(servo & 2) );
          zaehler++;
          zaehler%=6;
     }
     referenz[0]=lookup[1];  //Steuerung der PWM-Breite über Referenzzuweisungen
     referenz[1]=lookup[0+3];
     for(int i=0;i<12;i++) //immer gleich bleibende Threadmethode
     {
          servo = referenz[0][zaehler] | referenz[1][zaehler];
          System.out.println(  (servo & 1)+" "+(servo & 2) );
          zaehler++;
          zaehler%=6;
     }
     referenz[0]=lookup[2];
     referenz[1]=lookup[2+3];
     for(int i=0;i<12;i++)
     {
          servo = referenz[0][zaehler] | referenz[1][zaehler];
          System.out.println(  (servo & 1)+" "+(servo & 2) );
          zaehler++;
          zaehler%=6;
     }
  }
}

Code 0-1: Simulation eines PWM-Signal-Gebers mit Lookup-Table.

Übung
  • Nehmen Sie obiges Testprogramm zur Grundlage, um tatsächlich 8 Servos mit variierender PWM-Breite über den Parallelport ansteuern zu können.