getPotmeterSetting(){ return analogRead(pinPotmeter) >> 4;}
lcd.print("Hz, "); lcd.print(DC_Hashing[iIndex]); lcd.print("%");
Bedankt voor je uitleg. Je stelt dat timer0 aangepast wordt; dat betekent toch ook dat tijdfuncties als millis() niet meer correct zijn?
Het nadeel van een shield is dat de uitgangen min of meer vast liggen. [knip] of met draadjes gaan aansluiten.
Een oplossing zou kunnen zijn dat ik timer1 ga gebruiken voor de tijd-gerelateerde functies, daar moet ik nog even induiken, want daar weet ik te weinig van.
Jij hebt het over een softwarematige PWM oplossing. Kan je mij daar iets meer over vertellen?
Dat PWM signaal van de Arduino is dan toch al een softwarematige oplossing, of zie ik dat verkeerd?
Ik ga er van uit dat de Arduino een PWM signaal genereert op poorten 5 en 6 en dat dit signaal door de shield wordt gebruikt (versterkt) om de lok aan te sturen.
// PWM-test-3// Translate potmeter position into frequence and duty cycle of PWM signal// Software PWMtypedef struct pwmPins { int pin; unsigned long cyclus; unsigned long startCyclus; unsigned long toggle; bool pinState;} pwmPin;/*-----( Define constants and variables )------*/unsigned long pwm1; // Value read from A03 to give PWM duty cycle output in terms // of 0-5Vunsigned long potMeter;unsigned long currentMicros = micros();unsigned long previousMicros = 0;unsigned long microInterval = 500;unsigned long lastDebug = 0; const byte pwmMax = 100;const int pinCount = 2;const byte pins[pinCount] = {3,5};pwmPin myPWMpins[pinCount];const byte pinButton = 2;const byte pinPotmeter = 3;const byte pinMotor1 = 4;const byte pinMotor2 = 5;const byte pinTimer2a = 3;const byte pinTimer2b = 11;const byte MaxStep = 64;const byte ledPin = 13;void setup(){ Serial.begin(9600); Serial.println( "Software PWM oplossing (test)"); // Initialize motor pins pinMode(ledPin , OUTPUT); // ledje voor aan/uit pinMode(pinMotor1, OUTPUT); // bepaalt de richting pinMode(pinMotor2, OUTPUT); // idem pinMode(pinButton, INPUT_PULLUP ); // Set motor pins unequal to ensure movement controlled by enable digitalWrite(pinMotor1, HIGH); digitalWrite(pinMotor2, LOW); setupPWMpins();}void setupPWMpins() { for (int index=0; index < pinCount; index++) { // zet pinnummer in structure: myPWMpins[index].pin = pins[index]; // initiele waardes: myPWMpins[index].pinState = HIGH; // noodzakelijk: pinMode(pins[index], OUTPUT); }}byte getPotmeterSetting(){ byte iCheck = 0; int speed = 0; // Read potmeter value; potMeter = analogRead(pinPotmeter); speed = map( potMeter, 0, 1023, -1 * pwmMax, pwmMax ); if (abs(speed) < 5){speed = 0;} // led uit bij snelheid onder 5: digitalWrite( ledPin, (abs(speed)>=5)); // bepaal richting: if (speed < 0) {digitalWrite(pinMotor1, LOW);} else {digitalWrite(pinMotor1, HIGH);} // Determine matching index value and return it return (abs(speed));}void setPWM( byte index, int snelheid ) { // index is 0 voor de eerste en 1 voor de tweede poort // snelheid is op een basis van 0 .. 100 // bereken de waardes voor de freq en de cyclus: unsigned int freq = snelheid + 30; myPWMpins[index].cyclus = 1.00 / freq * 1000000; // bepaal nu de duty cycle en druk die uit in micro sec: myPWMpins[index].toggle=myPWMpins[index].cyclus*snelheid/100; // Display various variables every 2 sec: if (millis() - lastDebug > 2000){ Serial.print(potMeter); Serial.print(" => "); Serial.print(snelheid); Serial.print(" / "); Serial.print(myPWMpins[index].cyclus); Serial.print(" µs - "); Serial.print(freq); Serial.print("Hz - toggle "); Serial.print(myPWMpins[index].toggle); Serial.println("µs"); lastDebug = millis(); }}void loop(){ // Check potmeter value and set frequency and duty cycle accordingly setPWM( 0, getPotmeterSetting( )); handlePWM();}void handlePWM() { unsigned long diffMicroSec; currentMicros = micros(); // check het interval if (currentMicros - previousMicros >= microInterval) { // alle pinnen aflopen in de array met structures: for (int index=0; index < pinCount; index++) { // bereken eerst het verschil ( wordt 2 keer gebruikt): diffMicroSec = currentMicros - myPWMpins[index].startCyclus; // forceer stroom uit bij snelheid 0: if (myPWMpins[index].toggle < 10) { myPWMpins[index].pinState = LOW; } else { // elke pin heeft eigen waardes if (diffMicroSec >= myPWMpins[index].toggle ) { // zet pin LOW: myPWMpins[index].pinState = LOW; } // bij bereiken van max terug naar start: if (diffMicroSec >= myPWMpins[index].cyclus ) { // zet pin HIGH en teller op nul: myPWMpins[index].pinState = HIGH; myPWMpins[index].startCyclus = currentMicros; } } // stuur de pin aan: digitalWrite(myPWMpins[index].pin, myPWMpins[index].pinState); } // reset micros() tick counter. previousMicros = currentMicros; }}