Donnerstag, 15. März 2018

Arduino - variable PWM-Frequenz

Für meine Minieisenbahn (Diorama) habe ich mal einen Fahrregler mit einem Arduino gebaut, der mit einer variablen Gleichspannung und einem PWM-Signal mit variabler Impulsweite funktioniert.




Der Fahrregler funktioniert sehr gut.

Nun gab es den Vorschlag die Frequenz des PWM-Signal bei höheren Geschwindigkeiten zu erhöhen.

Um eine variable Frequenz des PWM-Signal zu testen, habe ich einen "frischen" Arduino Nano genommen und habe in Ermangelung eines Oszilloskops eine LED zur Visualsierung der variablen Frequenz genommen. Weil das menschliche Auge höhere Frequenzen nicht mehr als flackerndes Licht wahrnimmt, habe ich den Test für Frequenzen von ca. 30 bis 50 Hz durchgeführt. Der Fahrregler würde später von 30 bis 120 Hz betrieben werden.



Mann kann erkennen, dass das Licht zunehmend schneller flackert und dann dauernd leuchtet.

Die Grundlagen für den Code habe ich im www gefunden und auf meine Bedürfnisse angepasst.
Zu beachten ist, dass die verschiedenen PWM-Ports teilweise an unterschiedlichen Timern hängen und dass die Frequenzen unterschiedlich sind.
Der Code sollte ohne Änderungen auch auf einem UNO laufen.

Um einen größeren Frequenzbereich abzudecken muss man noch den Prescaler mit berücksichtigen und passend zur Frequenz setzen.




//----------------------------------------------------------------------
void setup()
{
  //untere (255 = ~30Hz) und untere (150 = ~50Hz) Frequenz
  f1 = 255;
  f2 = 150;
  
  //aufsteigend / vorwärts
  fwd = false;

  // ein paar Variablen für die Test-Zeitschleife
  time1 = millis();
  time2 = time1;
  

  //Initialize Timer2
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2 = 0;

  // Verwendung PIN 3 als Output
  // PIN3 und PIN11 gehen runter bis 30 Hz
  pinMode(3, OUTPUT);

  //setzen Register Timer2 (PIN3 wird von Timer2 bedient)
  bitSet(TCCR2A, COM2B1);
  
  // Setzen "Phase correct PWM"
  bitSet(TCCR2A, WGM20);
  bitSet(TCCR2B, WGM22);

  // Prescale auf max. Wert 1024 setzen um niedrige Frequenzen zu bekommen
  bitSet(TCCR2B, CS20);
  bitSet(TCCR2B, CS21);
  bitSet(TCCR2B, CS22);

  // Timer zählt hoch und runter (bei TOP 255 sind 510 Zyklen)
  // Zähler x Prescale x 0.0000625ms
  // (0.0000625 ms ist ein Zyklus bei 16MHz)
  // 510 x 1024 x 0.0000625 = 32.64ms      30.6 Hz   --> MIN
  //  2 x 1024 x 0.0000625 = 0.128 ms   7812.5 Hz   --> MAX
  // bei einem Prescale von 1024 sind PWM-Frequenzen 
  // von ca. 30 bis 7812 Hz möglich
  // und das ist so weit weg von stufenlos, 
  // aber ab ca. 122Hz kann man auf den 256er Prescale wechseln
  // somit ist der optimale Bereich bei einem Prescale 
  // von 1024 von ca. 30 bis 122Hz
  // dies entspricht TOP 255 - 64
  OCR2A = 255;

  //6% "duty cycle"  (zulässige Werte 1-155)
  OCR2B = 10;   

}//----------------------------------------------------------------------
void loop() {
    // Zeit seit Start Arduino abfragen
    time2 = millis();

    //Wenn mehr als 1 Sek. seit letzter Setzung der Frequenz vergangen
    if ((time2 - time1)>1000)
    {
      // neue Zeit merken
      time1 = time2;
      
      //wenn vorwärts / aufsteigend
      if (fwd==false){
        
        //Frequenzwert verkleinern (= Frequenz erhöhen)
        frq = frq - 10;

        //wenn aktuelle Frequenz kleiner gleich Minimalwert
        if (frq <= f2){
          //Richtung umkehren
          fwd = true;

          //Frequenz auf Minimum setzen
          frq = f2;
        }
      }else{
        //Frequenzwert erhöhen (= Frequenz verringern)
        frq = frq + 10;

        //wenn Frequenzwert größer gleich Maximum
        if (frq >= f1){
          //Richtung umkehren
          fwd = false;

          //Frequenz auf Maximum setzen
          frq = f1;
        }
      }
      
      //Frequenzwert dem Timer zuweisen
      OCR2A = frq;
    }
  }
//-----------------------------------------------------------------------

Freitag, 23. Februar 2018

Erstellung einer App zur Ermittlung der Kabeldämpfung von Koaxkabeln

Vorwort

Zur Ermittlung der Kabeldämpfungen von Koaxkabeln stehen von Herstellern, Händlern und Anderen Tabellen bzw. Diagramme zur Verfügung.

In den Tabellen sind zu den Kabeln Dämpfungen je 100 Meter abhängig von der Frequenz eingetragen. Die Wertetabellen sind hinsichtlich der enthaltenen Frequenzen und den dazugehörigen Dämpfungen sehr unterschiedlich. Ist eine Frequenz in einer Tabelle nicht enthalten, so muss man schätzen. Wenn man eine andere Länge als 100m benötigt, muss man interpolieren.

In den Diagrammen ist für jedes Kabel eine Kurve Dämpfung über Frequenz vorhanden. Den Dämpfungswert für 100 Meter Kabel muss man hier grafisch ermitteln und den ermittelten Wert auf die benötigte Kabellänge umrechnen.

Entwicklung

Diese Vorgehensweise ist nicht sehr komfortabel und soll durch eine Smartphone-App für Android unterstützt werden.
Für Android habe ich mich entschieden, weil Android Marktführer ist.

Die Entwicklung der App hat für mich auch das Ziel mich mit der Technologie vertraut zu machen.

Die Kabeldaten werden in der App als Funktion hinterlegt. Mit den Parametern Kabeltyp, Frequenz, Kabellänge und Eingangsleistung werden Dämpfung, Verlust in Prozent und Ausgangsleistung berechnet.




Zielgruppe für die Anwendung sind Funkamateure und CB-Funker. Die enthaltenen Kabel werden auf diese Zielgruppe abgestimmt. 
Der Name lautet erst mal "HAM COAX".


Bereitstellung und Installation

Ein erster Wurf ist fertig und ich werde noch versuchen das Design auf "Light" (dunkle Schrift auf hellem Grund) umzustellen.

Zurzeit verteile ich die App noch über Email. Falls genügend Interesse vorhanden ist, werde ich über eine Veröffentlichung im Play-Store nachdenken.

Zur Installation aus einer Mail muss man (temporär) unter Einstellungen, Sicherheit die Installation aus unbekannten Quellen zulassen. 



Hat man das Android Package (apk) als Anhang in einer Mail bekommen, so muss man lediglich einen Doppeltipp (heisst das so?) auf den Anhang machen und dann wird man gefragt ob die Anwendung installiert werden soll. Dies sollte man nur tun, wenn man dem Absender vertraut.



Die App erfordert keine besonderen Rechte.


Beschreibung

Beim ersten Start der Anwendung wird das Kabel RG 58 CU ausgewählt und einige Standard-Parameter eingetragen. Aus der Liste der 23 Kabel kann man nun ein anderes Kabel wählen und die Parameter Frequenz, Länge und Eingangsleistung anpassen. Die Berechnung der Ergebnisse - Dämpfung, Verlust in % und Ausgangsleistung - erfolgt ad-hoc. 




Beim Wechsel des Kabeltyps werden die Ergebnisse neu berechnet und man kann sofort die Auswirkung erkennen.



Das Programm merkt sich die letzten Einstellungen und stellt sie beim Neustart wieder her.


Universal Windows App

Unterdessen habe ich auch eine Version für mein Windows Phone erstellt. Weil für mich die Entwicklung von Windows-Anwendungen einfacher ist, ist sie auch gleich etwas hübscher geworden.


Auch diese Version ist nicht im Windows Store und wird im Entwicklermodus installiert.

.