Recent Changes - Search:

Puydorat Forest

Startseite


schreiben Sie mir! -> mailto:peter [period] bickel [snail] orange [period] fr?subject=Gartenbahn




© Peter Bickel 2009...2018
Revision 2018
PMWiki V 2.2.105

edit SideBar

PWM-Software

dieses Programm können Sie unverändert mit <Copy-and-Paste> in die ARDUINO-IDE übertragen
kopieren Sie nur den Teil zwischen den gestrichelten Linien (und ohne diese natürlich)
die IDE wird meckern, weil sie das Programm in einem gleichnamigen Ordner erwartet
sie schlägt Ihnen dann vor, diesen Ordner anzulegen - stimmen Sie zu

 //----------- 8< ---------------------------- 8< --------------
 /*
 SteuerSketch für INFINEON-Experimentier-Platine mit BTN8982TA
 * erzeugt das PWM-Signal für die Platine
 * Bedienung: zwei Schalter für Vorwärts/Rückwärts ON-OFF-ON
   und für Schneller/Langsamer (ON)-OFF-(ON)
 * die HALT-Funktion fährt den Motor schnell herunter
 * steuert Timer2 für PWM-Ausgabe auf Pins 3 und 11
 * nach einem Beispielsketch des RobotPower-Teams   http://robotpower.com

 * Version V 150718 vom 18/07/2015   (C) Peter Bickel   http://Puydorat.fr
 * dieses Programm ist freie Software

 Versions-Informationen
 V 150710   Funktionierende Version wie im Artikel beschrieben
 V 150718   dito ergänzt durch eine HALT-LED (zwischen Pin7 und +5V) 



 */

 byte mode = 1;           // Timer-Einstellung (siehe unten)
 char h_delay  = 5;       // HALT:       { Zähl-
 char s_delay  = 30;      // SCHNELLER:  { Geschwindig-
 char l_delay  = 30;      // LANGSAM:    { keitdigkeit
 int  countMin = 40;      // minimale Geschwindigkeit
 int  countMax = 255;     // maximale Geschwindigkeit

 // Vorwärts/Rückwärts-Teil
 char VR_VPin = 5;        //   Pin 5 = vorwärts   { Schalter-
 char VR_RPin = 6;        //   Pin 6 = rückwärts  { Anschlüsse
 char VR_V, VR_R;

 // Schneller/Langsamer-Teil
 int  count;              // Zähler für PWM-Vergältnis
 char SL_SPin = 2;        // Pin 2 = schneller   { Schalter-
 char SL_LPin = 4;        // Pin 4 = langsamer   { Anschlüsse
 char LEDpin  = 7;        // Pin 7 = HALT-LED
 char SL_S, SL_L;
 void decrementCount ();  // Fkt: zählt count auf countMin hinunter

 // PWM-Teil
 char PWMPin1 = 3;        //  { Pins von 
 char PWMPin2 = 11;       //  { Timer2 

 // ----------------------------------
 void setup()   {
 // Grenzwerte: Delay-Min = 5
   if (h_delay < 5)  h_delay = 5;
   if (s_delay < 5)  h_delay = 5;
   if (l_delay < 5)  h_delay = 5; 

 // Schneller/Langsamer-Teil
   pinMode (SL_SPin,INPUT_PULLUP);       // InputPins: Pullup-Widerstände
   pinMode (SL_LPin,INPUT_PULLUP);       // einschalten
   pinMode (LEDpin,OUTPUT);              // HALT-LED definieren
   digitalWrite (LEDpin, LOW);

 // Vorwärts/Rückwärts-Teil
   pinMode (VR_VPin,INPUT_PULLUP);       // InputPins: Pullup-Widerstände einschalten
   pinMode (VR_RPin,INPUT_PULLUP);

 // PWM-Teil
   pinMode(PWMPin1, OUTPUT);              // OutputPins für Timer2
   pinMode(PWMPin2, OUTPUT);
   TCCR2B = TCCR2B & 0b11111000 | mode;   // PWM-Frequenz einstellen   
 }

 // ----------------------------------
 void loop()   {
 // Schneller/Langsamer-Teil
   SL_S = digitalRead (SL_SPin);           // Schneller-Pin lesen
   SL_L = digitalRead (SL_LPin);           // Langsamer-Pin lesen
   analogWrite(PWMPin2, 0);                // Gegenpin Null setzen

   if (SL_S==LOW && count<countMax)  {     // aufwärts zählen = schneller
     if (count == 0)   {
       count = countMin;
     }
     count++;
     analogWrite (PWMPin1, count);         // PWM-duty setzen
     delay (s_delay);                      // warten
   } 

   else if (SL_L==LOW && count > countMin)  { // abwärtszählen = langsamer
     count--;
     if (count == countMin)   {
        count = 0;
     }
     analogWrite (PWMPin1, count);         // PWM-duty setzen
     delay (l_delay);                      // warten
   }

   // Vor/Rück-Teil
   VR_V = digitalRead (VR_VPin);           // vorwärts-Pin lesen
   VR_R = digitalRead (VR_RPin);           // rückwärts-Pin lesen
   if (VR_V == HIGH && VR_R == HIGH)  {    // Schalter in Mittelstellung: aus
     decrementCount ();                    // zurückzählen auf countMin
   }
   else if (VR_V == LOW)   {               // vorwärts
     PWMPin1 = 11;
     PWMPin2 = 3;
   }
   else if (VR_R == LOW)   {               // rückwärts
     PWMPin1 = 3;
     PWMPin2 = 11;
   }

   // HALT-LED
   if (count > 0) digitalWrite (LEDpin, HIGH);
   else           digitalWrite (LEDpin, LOW);
 }

 // -----------------------------
 // Zähler zurückfahren auf countMin
 void decrementCount ()  {      
   while (count>countMin) {                // Zähler nach countMin zurückzählen
     count--;
     analogWrite (PWMPin1, count);
     delay (h_delay);                      // warten
   }
   count = 0;
 //  analogWrite (PWMPin1, 0);               // PWM ausschalten
   digitalWrite(LEDpin, HIGH);
 }

 /*
 Kommentar zur Timer-Programmierung
 Basisfrequenz = 31'250Hz (abhängig vom Prozessortakt!)

 mode   divisor  Frequenz
 -----------------------------
  1	1	31250
  2	8	3906.25
  3	32	976.5625
  4	64	488.28125
  5	128	244.140625
  6	256	122.0703125
  7	1024	30.517578125
 ------------------------------
 */
 //----------- 8< ---------------------------- 8< --------------
Edit - History - Print - Recent Changes - Search
Page last modified on 2018-03-05, um 04:53