#include <Bounce2.h>//Deze code werkt op een Arduino Uno/nano rev.3 met een L298n h-brug board.//Hardware: 4 aan-uit-aan schakelaars, 3 potmeters//frequentieregeling gebaseerd op code van http://www.oxgadgets.com/2011/04/creating-a-variable-frequency-pwm-output-on-arduino-uno.html//pin setupint P_SPEEDA = 14; //potmeter A int P_SPEEDB = 15; //potmeter Bint freq = 16; //potmeter voor frequentieregelingconst byte enA = 9; //enable A op h-brugconst byte enB = 10; //enable B op h-brugconst byte in1 = 3;const byte in2 = 4;const byte in3 = 5;const byte in4 = 6;#define dirA_F 7 //pin schakelaar A vooruit#define dirA_R 8 //pin schakelaar A achteruit#define dirB_F 11 //pin schakelaar B vooruit#define dirB_R 12 //pin schakelaar B achteruit// debounce voor de schakelaarsBounce debouncer1 = Bounce();Bounce debouncer2 = Bounce();Bounce debouncer3 = Bounce();Bounce debouncer4 = Bounce();unsigned long duty1,duty2; // Duty Cycle in percentage.unsigned long pwm1; // Value read from A0 and A2 to give PWM duty cycle output in terms // of 0-5Vunsigned long pwm2;float xxx; // Float numbers to calculate duty for PWM 1 and PWM 2float yyy;int freqmap = 0;//SETUP-----------SETUP-----------SETUP-----------SETUP-----------SETUP-----------SETUPvoid setup(){Serial.begin(9600);delay(100);TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode// TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1A0) | _BV(COM1B0) ;//phase/frequency correct mode. SELECT THIS FOR INVERTED OUTPUTS.TCCR1B = _BV(WGM13) | _BV(CS11);// Select mode 8 and select divide by 8 on main clock.pinMode(enA,OUTPUT);pinMode(enB,OUTPUT);pinMode(in1,OUTPUT);pinMode(in2,OUTPUT);pinMode(in3,OUTPUT);pinMode(in4,OUTPUT);pinMode(dirA_F,INPUT);pinMode(dirA_R,INPUT);pinMode(dirB_F,INPUT);pinMode(dirB_R,INPUT);debouncer1.attach(dirA_F); debouncer1.interval(5); // interval in msdebouncer2.attach(dirA_R); debouncer2.interval(5); // interval in msdebouncer3.attach(dirB_F); debouncer3.interval(5); // interval in msdebouncer4.attach(dirB_R); debouncer4.interval(5); // interval in ms}//LOOP-----------LOOP-----------LOOP-----------LOOP-----------LOOPvoid loop() {debouncer1.update();debouncer2.update();debouncer3.update();debouncer4.update();// Get the updated value: int value1 = debouncer1.read(); int value2 = debouncer2.read(); int value3 = debouncer2.read(); int value4 = debouncer2.read();//bepalen van de rijrichting regelaar Aif(value1==HIGH){ digitalWrite(in1,LOW); digitalWrite(in2,HIGH); Serial.println("A vooruit"); }else if(value2==HIGH){ digitalWrite(in1,HIGH); digitalWrite(in2,LOW); Serial.println("A achteruit"); }else{ digitalWrite(in1,LOW); digitalWrite(in2,LOW); Serial.println("A stop"); }//bepalen van de rijrichting regelaar Bif(value3==HIGH){ digitalWrite(in3,LOW); digitalWrite(in4,HIGH); Serial.println("B vooruit"); }else if(value4==HIGH){ digitalWrite(in3,HIGH); digitalWrite(in4,LOW); Serial.println("B achteruit"); }else{ digitalWrite(in3,LOW); digitalWrite(in4,LOW); Serial.println("B stop"); }//frequentieregeling en snelheidfreqmap = analogRead(freq);ICR1 = map(freqmap, 0, 1023, 15000 , 5000); // 50000 = 20Hz en 10000 = 100Hz//Serial.println(ICR1); pwm1 = analogRead(P_SPEEDA);pwm2 = analogRead(P_SPEEDB);xxx = float(pwm1);// Turn read values from the POTs to float for mathematical// adjustment.yyy = float(pwm2);xxx = xxx * ICR1;// Multiply with ICR1 and divide by 1023 to give required percentageyyy = yyy * ICR1;xxx = xxx / 1023;yyy = yyy / 1023;//Assign values to OCR Registers, which output the PWM duty cycle.OCR1A = int(xxx);OCR1B = int(yyy);}
Bij mijn eerste poging kwam er geen beweging maar wel rook uit het treintje. Wat betreft elektronica en programmeren heb ik nog heel wat te leren. Na wat gepuzzel kwam ik erachter dat de frequentie te hoog was om het treintje op gang te helpen. Ik heb vervolgens de frequentie regelbaar gemaakt. Een frequentie tussen de 20 en 100 hertz lijkt goed te werken.
Een tweede vraag is wat ik kan doen om de boel te ontstoren. Ik heb een arduino asar besturing voor de servo's. Zodra het treintje begint te rijden gaan de servo's aardig tekeer. Ik heb wat gelezen over een condensator tussen de rails, draden wikkelen en zilverfolie om de draden van de servo. Wat is effectief? Wat voor condensator en hoe moet ik dit aansluiten? Dit heb ik nog niet kunnen vinden. In het treintje zit geen condensator o.i.d. Hoe kan ik er voor zorgen dat de motorregeling geen storingen op de servo's veroorzaakt?
Dat is voor PWM-begrippen heel erg laag. In decoders wordt niet voor niets al jaren met 22 kiloHertz en (inmiddels) hoger gewerkt.
Vandaar dat ik toen ik een analoge regeling had gemaakt met een microcontroller 30kHz hardware PWM en daar dan 80Hz software PWM (met lage duty) bovenop. Dat laatste overkwam de "motorkleef" waarna de 30kHz de loc prima kon regelen.