1 /* 2 SteuerSketch fuer INFINEON-Experimentier-Platine mit BTN8982TA 3 * erzeugt das PWM-Signal fuer die Platine 4 * Bedienung: zwei Schalter fuer Vorwaerts/Rueckwaerts ON-OFF-ON 5 und fuer Schneller/Langsamer (ON)-OFF-(ON) 6 * die HALT-Funktion faehrt den Motor schnell herunter 7 * steuert Timer2 fuer PWM-Ausgabe auf Pins 3 und 11 8 * nach einem Beispielsketch des RobotPower-Teams http://robotpower.com 9 * Version 10/07/2015 (C) Peter Bickel http://Puydorat.fr 10 * dieses Programm ist freie Software 11 ------------------------------------*/ 12 13 /**** Einstellungen ************************************/ 14 byte mode = 1; // Timer-Einstellung (siehe unten) 15 char h_delay = 5; // HALT: { Zaehl- 16 char s_delay = 30; // SCHNELLER: { Geschwindig- 17 char l_delay = 30; // LANGSAM: { keitdigkeit 18 int countMin = 40; // minimale Geschwindigkeit 19 int countMax = 255; // maximale Geschwindigkeit 20 /*********************************************************/ 21 22 // Vorwaerts/Rueckwaerts-Teil 23 char VR_VPin = 5; // Pin 5 = vorwaerts { Schalter- 24 char VR_RPin = 6; // Pin 6 = rueckwaerts { Anschluesse 25 char VR_V, VR_R; 26 char ENPin = 7; // Pin 7 = inhibit --> Ein-/Ausschalten des Boards 27 28 // Schneller/Langsamer-Teil 29 int count; // Zaehler fuer PWM-Vergaeltnis 30 char SL_SPin = 2; // Pin 2 = schneller { Schalter- 31 char SL_LPin = 4; // Pin 4 = langsamer { Anschluesse 32 char SL_S, SL_L; 33 void decrementCount (); // Fkt: zaehlt count auf countMin hinunter 34 35 // PWM-Teil 36 char PWMPin1 = 3; // { Pins von 37 char PWMPin2 = 11; // { Timer2 38 39 // ---------------------------------- 40 void setup() { 41 // Grenzwerte: Delay-Min = 5 42 if (h_delay < 5) h_delay = 5; 43 if (s_delay < 5) h_delay = 5; 44 if (l_delay < 5) h_delay = 5; 45 46 // Schneller/Langsamer-Teil 47 pinMode (SL_SPin,INPUT_PULLUP); // InputPins: Pullup-Widerstaende einschalten 48 pinMode (SL_LPin,INPUT_PULLUP); 49 50 // Vorwaerts/Rueckwaerts-Teil 51 pinMode (VR_VPin,INPUT_PULLUP); // InputPins: Pullup-Widerstaende einschalten 52 pinMode (VR_RPin,INPUT_PULLUP); 53 54 // PWM-Teil 55 pinMode(PWMPin1, OUTPUT); // OutputPins fuer Timer2 56 pinMode(PWMPin2, OUTPUT); 57 TCCR2B = TCCR2B & 0b11111000 | mode; // PWM-Frequenz einstellen 58 } 59 60 // ---------------------------------- 61 void loop() { 62 // Schneller/Langsamer-Teil 63 SL_S = digitalRead (SL_SPin); // Schneller-Pin lesen 64 SL_L = digitalRead (SL_LPin); // Langsamer-Pin lesen 65 analogWrite(PWMPin2, 0); // Gegenpin Null setzen 66 67 if (SL_S==LOW && count countMin) { // abwaertszaehlen = langsamer 75 count--; 76 if (count == countMin) count = 0; 77 analogWrite (PWMPin1, count); // PWM-duty setzen 78 delay (l_delay); // warten 79 } 80 81 // Vor/Rueck-Teil 82 VR_V = digitalRead (VR_VPin); // vorwaerts-Pin lesen 83 VR_R = digitalRead (VR_RPin); // rueckwaerts-Pin lesen 84 if (VR_V == LOW) { // vorwaerts 85 PWMPin1 = 11; 86 PWMPin2 = 3; 87 } 88 else if (VR_R == LOW) { // rueckwaerts 89 PWMPin1 = 3; 90 PWMPin2 = 11; 91 } 92 else if (VR_V == HIGH && VR_R == HIGH) { // Schalter in Mittelstellung: aus 93 decrementCount (); // zurueckzaehlen auf countMin 94 } 95 } 96 97 // ----------------------------- 98 // Zaehler zurueckfahren auf countMin 99 void decrementCount () { 100 while (count>countMin) { // Zaehler nach countMin zurueckzaehlen 101 count--; 102 analogWrite (PWMPin1, count); 103 delay (h_delay); // warten 104 } 105 analogWrite (PWMPin1, 0); // PWM ausschalten 106 } 107 108 /* 109 Kommentar zur Timer-Programmierung 110 Basisfrequenz = 31'250Hz (abhaengig vom Prozessortakt!) 111 112 mode divisor Frequenz 113 ----------------------------- 114 1 1 31250 115 2 8 3906.25 116 3 32 976.5625 117 4 64 488.28125 118 5 128 244.140625 119 6 256 122.0703125 120 7 1024 30.517578125 121 ------------------------------*/