/* This software is published under the GNU GPL V3 license. See http://www.gnu.org/licenses/gpl-3.0.en.html for Details. Author: Martin Henschke, 2014 Änderungen: Wolfgang Schmidt - Die analogen Eingänge A4 bis A7 werden eingelesen und als Digitaleingänge ausgewertet. - dann high oder low an enable, MS1, MS2, MS3 ausgeben - A4 -> enable - A5 -> MS1 - A6 -> MS2 - A7 -> MS3 */ // Variablen: int adc_i = 0; // ADC als integer word adc_u = 0; word pause[62]; int i; float tmp; const int grenzwert = 400; // Grenzwert für analog 0 oder 1 vom analog input // eigene Abfragen int enablePin = A4; // select the input pin for the potentiometer int enableValue = 0; // variable to store the value coming from the sensor int ms1Pin = A5; // select the input pin for the potentiometer int ms1Value = 0; // variable to store the value coming from the sensor int ms2Pin = A6; // select the input pin for the potentiometer int ms2Value = 0; // variable to store the value coming from the sensor int ms3Pin = A7; // select the input pin for the potentiometer int ms3Value = 0; // variable to store the value coming from the sensor void setup() { // read the value from the sensor: enableValue = analogRead(enablePin); ms1Value = analogRead(ms1Pin); ms2Value = analogRead(ms2Pin); ms3Value = analogRead(ms3Pin); // zum debuggen // Serial.begin(57600); // opens serial port, sets data rate to 57600 bps // Timer 1, 16 bit, evtl. Arduino-Benutzung Ueberschreiben: TCCR1A = B00000000; // Normaler Modus, ist noetig, obwohl eigentlich nicht. TCCR1B = B00000011; // letzte 3 Bits = Prescaler, 001=1, 010=8, 011=64, 100=256, 101=1024 TCCR1C = B00000000; // kein "output compare" TIMSK1 = B00000000; // keine Interrupts, nix besonderes // ADC pinMode(A3, INPUT); // Poti-Auswertung ADMUX = B01000011; // 01 = ACVCC; 00 = ADLAR, unused; 0011 = ADC-Wahl: ADC3 = A3, ADC6 = A6, etc ADCSRB = B00000000; // Analog Input, Free Running Mode ADCSRA = B11110111; // ADC enable, ADC start, ADC auto trigger, ADC interrupt not enabled, prescaler = 128 delay(1); // ADC soll sich einlaufen // Pins setzen: pinMode(5, OUTPUT); // DIR pinMode(6, OUTPUT); // Step pinMode(7, OUTPUT); // Sleep pinMode(8, OUTPUT); // Reset pinMode(9, OUTPUT); // MS3 pinMode(10, OUTPUT); // MS2 pinMode(11, OUTPUT); // MS1 pinMode(12, OUTPUT); // Enable pinMode(13, OUTPUT); // LED digitalWrite(5, LOW); // DIR digitalWrite(6, LOW); // Step digitalWrite(7, HIGH); // nicht schlafen digitalWrite(8, HIGH); // nicht reset // MS1,MS2,MS3 setzen nach Schaltereingaenge: if (ms3Value > grenzwert) { digitalWrite(9, HIGH); } else { digitalWrite(9, LOW); } if (ms2Value > grenzwert) { digitalWrite(10, HIGH); } else { digitalWrite(10, LOW); } if (ms1Value > grenzwert) { digitalWrite(11, HIGH); } else { digitalWrite(11, LOW); } /* // 1/16 bzw. 1/32: digitalWrite(9, HIGH); // MS3 digitalWrite(10, HIGH); // MS2 digitalWrite(11, HIGH); // MS1 */ // Enableausgang setzen nach Schaltereingang: if (enableValue > grenzwert) { digitalWrite(12, HIGH); } else { digitalWrite(12, LOW); } /* // fuer Pololu-Treiber: digitalWrite(12, HIGH); // Ausschalten (inverted) delay(200); digitalWrite(12, LOW); // Einschalten (inverted) */ /* // fuer 1/128 er Treiber mit THB6128: digitalWrite(12, LOW); // Ausschalten delay(200); digitalWrite(12, HIGH); // Einschalten */ // Pausenfeld: tmp = 2.0; pause[61] = word(tmp + 0.5); for (i = 60; i >= 1; i--){ tmp *= 1.189; pause[i] = word(tmp + 0.5); } pause[0] = pause[1]; // eigentlich ueberfluessig } void loop() { TCNT1 = 0; // Wert des Timer-Zaehlers, zaehlt mit 250.000 Hz PORTD |= B01000000; // schneller als "digitalWrite(6, HIGH);" Step = Port D6 // ADC auswerten adc_i = ADCL | (ADCH << 8); // ADC-Wert zwischen 0 und 1023 if (adc_i < 512) PORTD &= B11011111; else PORTD |= B00100000; // DIR = Port D5 adc_i -= 512; // Zahl zw. -512 und 511 adc_u = abs(adc_i); // Zahl zw. 0 und 512, 0 = langsam, 512 = schnell adc_u = adc_u >> 3; // Zahl zw. 0 und 64 adc_i = adc_u - 3; // Zahl zw. -3 und 61, im mittleren Bereich steht der Motor // Serial.println(adc_i); if (adc_i < 1) { PORTB |= B00100000; // statt digitalWrite(13, HIGH); // LED ein bei Mittelstellung, Port B5 } else { // drehen PORTD &= B10111111; // schneller als "digitalWrite(6, LOW);" Step = Port D6 if (TCNT1 <= pause[adc_i]) { // Zeit verbraten PORTB &= B11011111; //statt digitalWrite(13, LOW); // LED aus, Port B5 while (TCNT1 < pause[adc_i]) { __asm__("nop\n\t"); } } else { PORTB |= B00100000; // statt digitalWrite(13, HIGH); // LED ein, Port B5 } } }