Google+
Doel:€250.00
Donaties:€19.30

Per saldo:€-230.70

Steun ons nu!

Laatst bijgewerkt
op 12-12-2017
Algemeen

De stichting

Recente berichten

Nieuwbouw container overslag terminal door NS1220
Vandaag om 11:05:01
Starten met digitaal rijden door HansKarel
Vandaag om 10:57:41
AVT geluidsmodule koppelen met loconet: hoe? door powerwork
Vandaag om 10:52:22
Toon hier je nieuwe (model) spooraanwinst(en)... door Arjan6511
Vandaag om 10:49:07
BNLS/RCU Booster-Hub vraagbaak door dpring
Vandaag om 10:43:46
Mijn eerste H0 modeltreinbaan in aanbouw door Wim Vink
Vandaag om 10:27:18
H0 baan in segmenten: Maasfeld, NL baan met Inglenook puzzel door Nederlaantje
Vandaag om 10:23:35
DR4024 servo decoder kapot? door JohnT
Vandaag om 10:22:02
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door mdjr78
Vandaag om 10:04:52
BNLS-module: "De Kolk" door Basmans
Vandaag om 10:02:50
Bramsburg door Debvd
Vandaag om 09:49:07
B-Models Sggmrss90 MAERSK Koelcontainer: in welke trein in te zetten? door Daan!
Vandaag om 09:48:29
Ombouw/Pimpen Bolle neuzen door bollen neus
Vandaag om 09:44:16
Welke modellen staan bij jou boven aan je verlanglijstje (v.h. Neurenberg 2016) door Corné81
Vandaag om 09:43:13
Project Halleberg, een digitale tandrad pendelbaan door Marco EB
Vandaag om 09:32:53
Leuk Amerikaans baantje door ruudns
Vandaag om 09:31:27
Rijtuigen spoorwegbouwbedrijf. 2 kleurig in 1955 door Jeff
Vandaag om 09:15:26
EifelBurgenBahn door HIJ
Vandaag om 09:12:15
Fotowedstrijd BeneluxSpoor.net door Bob R.
Vandaag om 09:03:08
Nummerplaat stoomlocomotief NS 4700 vragen... door Rick
Vandaag om 07:49:15
Line-up foto's van modellen door Mark1979
Vandaag om 06:58:54
19 Toen door Rondje_HO
Vandaag om 00:26:36
Piko/Gutzold BR 52 2006 met kondenztender door b+j
13 december 2017, 23:45:57
Rangeren met de Sik - 120x40 in H0 door Jes
13 december 2017, 23:16:25
Bouw Tagh0train Conducteurswagen CHD-Dg (spoor 0) door FritsT
13 december 2017, 23:06:15
3d Printen door jerrytrein
13 december 2017, 22:47:27
Onlangs gespot - gefotografeerd, de foto's door Eric B
13 december 2017, 22:42:07
Modeltreinenbeurs Zutphen, 16-17 december, Zutphen door Martin Hornis
13 december 2017, 22:34:19
LED-verlichting, op rol verkrijgbaar. Binnenverlichting maken. door Debvd
13 december 2017, 22:25:45
BNLS Werkspoor - Restauratie van een Philotrain NS 6000 door naoorlogsNS
13 december 2017, 22:23:45
  

Auteur Topic: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan  (gelezen 4594 keer)

Hansepansje

  • Offline Offline
  • Berichten: 638
    • Perrongeluk - van de regen uit de drup
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #45 Gepost op: 21 oktober 2017, 21:50:10 »
Werkt scrollen niet op je scherm?
Ik heb wat returns tussengevoegd. Hopelijk helpt dat.

Groets, Hans
Dachbodenheim: N-spoor, Fleischmann Piccolo, HCCM elektronica, eigen software

72sonett

  • Team encyclopedie
  • Offline Offline
  • Berichten: 705
    • [i]El Carrilet[/i]
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #46 Gepost op: 21 oktober 2017, 22:04:30 »
Jawel, maar horizontaal scrollen is vervelend en onhandig.

Nu is het OK.
El Carrilet

Not sent from my Pocketline Swing 380, Xperia Z2, iPhone, C5503 or SM-G900F using Tapatalk.

MH

dickkoning

  • Offline Offline
  • Berichten: 136
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #47 Gepost op: 21 oktober 2017, 23:10:02 »
Hi
Ziet er mooi uit
Ga ik proberen

Hansepansje

  • Offline Offline
  • Berichten: 638
    • Perrongeluk - van de regen uit de drup
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #48 Gepost op: 23 oktober 2017, 12:59:45 »
Ik ben benieuwd naar jullie ervaringen!  ::)

Groets, Hans

PS
Mocht je de waarden van de hashingtabellen eenvoudig willen aanpassen m.b.v. de spreadsheet, stuur me dan even een berichtje met je email adres, dan kan ik die naar je toe mailen.
Dachbodenheim: N-spoor, Fleischmann Piccolo, HCCM elektronica, eigen software

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 3540
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #49 Gepost op: 11 november 2017, 21:58:47 »
Hoi Hans,

Leuk gedaan! :)

Paar opmerkingen over de (geen kritiek, maar mogelijke verbeteringen.

Die spreadsheets zou je makkelijk op Google drive kunnen zetten :)

Wat jij hashing tables noemt zijn geen hasing tables maar lookup tables ;)

DC_Hashing is natuurlijk beetje zinloos aangezien DC_Hashing[index] gewoon index is ;) Maar goed, valt wat voor te zeggen als je wel tot 100% wilt. Maar dan nog is het lineair dus nog makkelijk te doen voor de micro.

De PWM kan je beter op de enable zetten van de H-brug. Heb je maar één PWM pin nodig en maar één loopup etc. Doe je maar je gebruikt pin 11 gewoon niet :angel:

Goed dat je const gebruikt voor de pinnen, maar zou nog meer schelen voor de lookup tables. En nog meer als je ze in PROGMEM zet.

getPotmeterSetting() is nu beetje een omgekeerde loopup. Als je van 65 stappen naar 64 stappen gaat is het een stuk makkelijker ;)
getPotmeterSetting(){
  return analogRead(pinPotmeter) >> 4;
}

Gebruik als naam wat je er werkelijk mee doet, niet wat het op de Arduino voorstelt. Dus PinMotor1A ipv pinTimer2a. Lijkt erg op elkaar maar ik zie daardoor mensen ook dingen wel eens PwmPin11 noemen terwijl het de pin is die de verlichting stuurt. De namen zijn er om je te helpen en duidelijk te maken wat je doet.

Zelfde voor de functie namen. setTimer2 doet meer dan de naam doet vermoeden bijvoorbeeld. Splits het in SetTimer2() en updateLcd() bijvoorbeeld.

lcd.print("Hz, "); lcd.print(DC_Hashing[iIndex]); lcd.print("%");Hier gaan bij veel de nekharen overeind staan en maakt foutzoeken onnodig lastig. Niets volgt een ; ;) Het geeft het einde van de code in de regel aan. Uitzondering in een for-loop en commentaar.

Haal de delay() eruit. delay()'s maken het praktisch onmogelijk later meer tegelijk te doen met je programma en vertragen nu de response. Beter zou zijn om bijvoorbeeld alleen de timer een update te geven als de potmeter is verandert. En ook niet constant het hele scherm leeg te halen maar alleen het deel met waardes opnieuw te sturen.

Maak dingen alleen global als je het nodig hebt. potMeter (betere naam: potmeterValue) gebruik je alleen in getPotmeterSetting(). En pwm1 gebruik je nooit.

Probeer één stijl te hanteren. Voorbeelden, of { aan het eind van de regel of altijd op een nieuwe. Maar ook voor namen, nu gebruik je namenAlsDeze MaarOokDeze En_Deze. De meest geaccepteerde standaard binnen Arduino is ditVoorVariabele (/objecten), DitVoorConstVariable (of classes maar hebben dezelfde eigenschap dat je ze niet kunt wijzigen) en DIT_VOOR_MACROS (maar macros alleen gebruiken als er echt geen alternatief is).


Goed, lijkt heel negatief maar zo bedoel ik het niet! (y) Vind het juist leuk om andere bezig te zien met elektronica en microcontrollers. Maar ik probeer dan wel altijd tips te geven om het project te verbeteren of om betere/makkelijker/duidelijkere code te schrijven.
Verzonden vanaf mijn desktop met Firefox

jmu

  • Offline Offline
  • Berichten: 145
    • Tandradbaantje blog
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #50 Gepost op: 20 november 2017, 11:01:28 »
Al zoekende naar een oplossing voor mijn probleem kwam ik op dit onderwerp. Ik zal eerst mijn opzet schetsen. Ik rijd met H0e materiaal van Egger, Bemo, Joueff en Roco en mijn baan betreft een (automatisch) pendelbaantje met een helling en stopplaats halverwege. Voor de aansturing maak ik gebruik van een Arduino Uno en een DFRobot motorshield L298P.

De problemen waartegen ik aanloop zijn:
Verschillende locs hebben verschillende snelheden
Per loc verschilt de snelheid voor- en achteruit
De motorkleef is lastig op te lossen

Ik heb geprobeerd om de PWM op een andere frequentie te zetten en dat levert weer andere rij eigenschappen op, maar het draait allemaal nog niet soepel. En bijkomend probleem: doordat de motorshield vast op poort 5 en 6 zit, verandert timer0 ook, dus ook alle bijbehorende timers.

Begrijp ik nu goed uit het bovenstaande dat de PWM frequentie aangepast wordt aan de snelheid? Zo ja, weten jullie of het mogelijk is om dit ook toe te passen op mijn motorshield? Dan zal ik wss de pinnen moeten verplaatsen, of anders aansluiten.

Nog een vraag over de motoren van de locjes: hier zit vaak een kleine spoel en condensator op. Hebben deze invloed op de rei eigenschappen als je een PWM signaal gebruikt?

Joop
 

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 3540
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #51 Gepost op: 20 november 2017, 21:04:34 »
Hoi JMU,

Deze software past ook de timer aan dus timer0 is nog steeds niet te gebruiken.

En in dit geval wordt de frequentie inderdaad geschaald met de snelheid. Dat is wat de originele Weistra regelaar ook deed en om die te imiteren was hier het doel. Of dat het absoluut beste rijgedrag geeft, geen idee, dat zou je moeten proberen. Maar het gaat niet magisch het verschil in snelheid tussen locs oplossen. Ook analoog zit er veel snelheidsverschil tussen loc's.

Je zou natuurlijk gewoon de motor driver naar een ander PWM pin kunnen doorlussen. En als je de oorspronkelijke pin (pin 5 of 6) gewoon als input laat hoef je deze niet los te koppelen.

Andere oplossing is om niet de hardware PWM te gebruiken. De frequenties van een Weistra regelaar zijn laag genoeg dat je deze met software PWM (bitbang PWM) kan doen. Gebruik alleen geen delay() (moet je überhaupt nooit doen ;D)  maar doe het op basis van millis().

Zelf heb ik in het verleden een combinatie gebruikt. Ik gebruikte de hardware PWM voor het regelen en deze stond ook redelijk snel (+-30kHz). Maar naast dat gebruikte ik een lage (+-80Hz) software PWM er overheen om de kleef te overwinnen. Beste van twee werelden zeg maar ;D


Timo
Verzonden vanaf mijn desktop met Firefox

jmu

  • Offline Offline
  • Berichten: 145
    • Tandradbaantje blog
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #52 Gepost op: 21 november 2017, 10:21:51 »
Dag Timo,

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. Ik zit dus vast aan D5 en D6 en die zitten weer vast aan timer0. Volgens mij kan ik daar weinig aan doen, of ik moet het shield gaan aanpassen (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? 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. Dat PWM signaal van de Arduino is dan toch al een softwarematige oplossing, of zie ik dat verkeerd?

Joop

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 3540
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #53 Gepost op: 21 november 2017, 21:23:48 »
Bedankt voor je uitleg. Je stelt dat timer0 aangepast wordt; dat betekent toch ook dat tijdfuncties als millis() niet meer correct zijn?
Nouwja, het principe wat hier gedaan wordt gebruikt een timer. Alleen wordt hier timer2 gebruikt (vandaar pin 3 en pin 11) en deze doet niets met de timing van millis() en aanverwante. Zelfde zou je ook gewoon op timer1 kunnen toepassen maar niet op timer0 voor pin 5 en 6.

Het nadeel van een shield is dat de uitgangen min of meer vast liggen. [knip] of met draadjes gaan aansluiten.
Nouw, dat! ;D Gewoon een draadje van pin 3 naar pin 5 en van pin 11 naar pin 6 en je bent klaar ;)

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.
Dat is dan ook niet zo makkelijk. Dan moet je een groot deel van de Arduino core gaan aanpassen. Niet onmogelijk, maar twee draadjes is wel enkele uren sneller ;D

Jij hebt het over een softwarematige PWM oplossing. Kan je mij daar iets meer over vertellen?
PWM is niets meer als het snel aan en uit zetten van een uitgang. En hoe groter deel van de tijd aan hoe sneller/feller. Dat is de duty cycle. De PWM pinnen van de Arduino kunnen dit in hardware. Dat wil zeggen, je stelt het in en daarna hoeft de code niets te doen om een bepaalde duty cycle te houden.

Maar als je kijkt naar blink Sketch is dat eignelijk ook PWM maar dan traag en in software. Maar je zou prima de tijden aan kunnen passen naar 3ms en 7ms en dan lijkt het voor jou gewoon dat je een ledje dimt ipv laat knipperen. Maar goed, dat wil je niet met delay() doen want dan kan je niets anders doen. Maar dat kan je ook met millis() doen. Zie daarvoor blink without delay.

Dat PWM signaal van de Arduino is dan toch al een softwarematige oplossing, of zie ik dat verkeerd?
Bij de hardware PWM pinnen is het dus set-and-forget (blijft ook door gaan ook al zou je delay(10000000) doen. Terwijl je met software PWM continue voor de juiste staat van de pin moet zorgen (en dus met de juiste timing). Nu is dat met maximaal 100Hz alleen niet zo heel lastig :) Maar bedenk dat hardware PWM gewoon 62kHz kan doen ;D

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.
Soort van inderdaad. Het schakelt de hogere railspanning net zo in en uit als het PWM signaal. En daarnaast kan het de polariteit omdraaien door andere pinnen hoog/laag te maken.


Timo
Verzonden vanaf mijn desktop met Firefox

jmu

  • Offline Offline
  • Berichten: 145
    • Tandradbaantje blog
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #54 Gepost op: 22 november 2017, 10:22:44 »
Dag Timo,

Bedankt voor dit verhelderende college. Ik ga er mee aan de slag.

Joop

jmu

  • Offline Offline
  • Berichten: 145
    • Tandradbaantje blog
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #55 Gepost op: 03 december 2017, 15:00:02 »
Ik heb de schakeling gemaakt en stuur nu via pin 3 mijn DFRobot shield aan. En ik moet zeggen, dat gaat prima! De lokjes reageren erg goed en kunnen echt heel langzaam rijden. Ook het starten gaat prima.
Vervolgens heb ik de tabellen met waardes in een formule omgezet (kwadratische formule, gaat tot ong 95% goed, daarna een  kleine afwijking). En alles aangesloten op een testbaantje met 2 reedcontacten. De pendelbaan loopt prima.

Maar ik zit nog met een vraag: ik stuur nu via pin 3 één van de uitgangen van de shield aan. Ik zou echter ook de tweede uitgang via pin 11 willen aansturen, maar wel onafhankelijk van pin 3. Als ik het goed begrijp wordt register OCR2A gebruikt voor de frequentie en register OCR2B voor de snelheid (pulsbreedte), maar wel allemaal gebaseerd op timer 2 en pin 3. Die frequentie geldt dan ook voor pin 11 (zelfde timer), maar hoe kan ik dan de pulsbreedte van pin 11 onafhankelijk aanpassen? Welk register wordt daarvoor gebruikt? Dat de freq niet afzonderlijk aangepast kan worden, daar kan ik mee leven.

Ik wil de tweede poort van de shield gebruiken voor een stukje rangeerspoor waar een lokje wat heen en weer rijdt.

Joop

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 3540
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #56 Gepost op: 04 december 2017, 10:07:25 »
Hoi Joop,

Zou je de code hier ook willen plaatsen? Altijd leuk om te zien. Graag wel tussen code-tags ([code][/code]).

Wat betreft een tweede pin, even wat reverse engineeren.

PWM van pin 11 en 3 is OC2A en OC2B respectievelijk.
WMG is 101 ofwel mode 5: "PWM, Phase Correct" met OCR2A als TOP.
COM2A0 (icm WMG mode 5) geeft "Toggle OC2A on Compare Match".
COM2B1 geeft "Clear OC2B on Compare Match when up-counting. Set OC2B on Compare Match when down-counting" ofwel non-iverted.

OCR2A is het compare register voor OC2A ofwel pin 11 en OCR2B is het compare register voor OC2B ofwel pin 3. Probleem zit hem er in dat mode 5 gebruikt wordt. Daarbij wordt OCR2A niet alleen gebruikt voor OC2A maar ook als TOP. Hiermee is het inderdaad mogelijk de PWM frequentie aan te passen. Maar hierdoor is het alleen niet meer mogelijk een losse compare match te doen voor pin 11.

Vier opties voor een tweede uitgang:
  • Gebruik niet mode 5 maar mode 1. Nadeel is dat je dan geen top in kunt stellen. Om de freqentie aan te passen zal je dan de timer zelf moeten seeden iedere cycle. Maar door het op en neer tellen van de counter is dat alleen niet heel makkelijk.
  • Je zou ook naar CTC kunnen gaan en dan met behulp van de twee match registers zelf de PWM kunnen maken. Maar dan blijft dat je niet makkelijk de freqentie van de tweede uitgang kunt aanpassen.
  • Andere optie die lijkt op het origineel en ook netjes de freqentie-snelheid relatie in stand houdt is voor de tweede uitgang gewoon een andere timer te pakken. Je gebruikt nu timer2 en de algemene timing hangt af van timer0 dus je hebt nog timer1 over. Let wel op, dit is een 16-bit timer dus het zal allemaal net wat anders zijn.
  • Of stap af van hardware PWM. 100Hz is niet zo heel snel dus ook nog wel in software te doen, eventueel gecombineerd met een timer (soort van optie 2, maar dat maakt het wel complexer). loop() is snel zat dat je het gewoon met micros() kunt doen. Alleen zorgen dat niets anders de boel op houdt. (Geen delay()'s of trage LCD updates.

Ik denk dat ik voor optie 3 of 4 zou gaan. Mijn eerste gedachten was überhaupt optie 4 maar aangezien deze phase correct best netjes is en je timer1 toch niet nodig hebt (geen servo's of tone()) is dat ook een makkelijke optie.


Timo
Verzonden vanaf mijn desktop met Firefox

jmu

  • Offline Offline
  • Berichten: 145
    • Tandradbaantje blog
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #57 Gepost op: 04 december 2017, 13:25:17 »
Dag Timo,

Wederom dank voor jouw uitleg. Dit is wel hogere wiskunde en zelfs voor iemand met een technische achtergrond niet eenvoudig te doorgronden. Maar ik ga er steeds meer van snappen!
Doordat OCR2A als topwaarde gebruikt wordt, en dus direct voor de freq verantwoordelijk is, is het dus niet mogelijk hiermee een regelbare tweede uitgang te realiseren. De andere opties die jij geeft lijken me allemaal een beetje een "te ver van mijn bed" oplossing, maar optie 4 lijkt me steeds meer iets waarmee ik aan de slag wil gaan. Ik ben alleen benieuwd of ik de max freq van ongeveer 70 Hz ga halen in een Loop waarin nog meer acties worden uitgevoerd. Helaas heb ik geen scoop om het te controleren, wellicht kan ik softwarematig nog wat inbouwen om te "meten".

De code zal ik wat opschonen en binnenkort plaatsen.

Joop

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 3540
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #58 Gepost op: 04 december 2017, 13:41:52 »
70Hz of zelfs 100Hz is nog steeds ergggggggggggg traag voor een Arduino die draait op 16Mhz. Dat is 160.000 cycles per uitgangscycle. je moet alleen zorgen dat het allemaal stappen zijn die de boel niet ophouden (non-blocking). Wat wil je allemaal nog meer gaan doen?

Wat betreft geen scope, een multimeter met duty en freqentie meting kan al helpen. Of een soundcard scope kan handig zijn.


Timo
Verzonden vanaf mijn desktop met Firefox

jmu

  • Offline Offline
  • Berichten: 145
    • Tandradbaantje blog
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #59 Gepost op: 04 december 2017, 17:52:42 »
Dag Timo,

Bij deze een eerste opzet van een software PWM. Ik ben nog niet tevreden met het resultaat, want het frequentie verloop klopt volgens mij niet. Dat resulteert in een slecht rijdende lok. Dus dat is nog wat knutselen. En ik heb nog niet de tweede uitgang getest.

// PWM-test-3
// Translate potmeter position into frequence and duty cycle of PWM signal
// Software PWM

typedef 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-5V
unsigned 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;
  }
}