Doel:€250.00
Donaties:€88.00

Per saldo:€-162.00

Steun ons nu!

Laatst bijgewerkt
op 03-06-2025

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

Modeltreinenbeurzen door hervé
Vandaag om 16:21:11
Werking Piko goldcap i.c.m. met niet-Piko decoder door meino
Vandaag om 16:10:59
Rheinburg, TP V/VI door Paul1969
Vandaag om 15:59:03
Verwisselen koppelingen Hamo 1205 door 1200blauw
Vandaag om 15:58:56
Schroefkoppeling voor H0. door MOVisser
Vandaag om 15:57:43
MSC HetSpoor-ClubTentoonstelling~Niklaas-Niklaas~6+7dec.'25 door hervé
Vandaag om 15:55:00
Mijn eerste baan, Hexental in ho. 380x 120cm door Paul1969
Vandaag om 15:53:15
Bruggen-IG - brug over de Poldervaart Schiedam/Kethel door Klaas Zondervan
Vandaag om 15:48:55
7 en 8 maart 2026 | Jubileumtentoonstelling MSV Post B door Rsd1000
Vandaag om 15:44:17
West-Brabantse modelspoordagen door Klaas Zondervan
Vandaag om 15:40:15
Zaterdag, 2 mei 2026 | 9e Ruilbeurs MSV Post B door Rsd1000
Vandaag om 15:35:31
Zaterdag, 31 januari 2026 | 8e Ruilbeurs MSV Post B door Rsd1000
Vandaag om 15:32:47
Zaterdag, 1 november 2025 | 7e Ruilbeurs MSV Post B door Rsd1000
Vandaag om 15:26:19
BMB-Module: “Corfe Castle Station” door bask185
Vandaag om 14:59:48
Van 2D afbeelding naar 3D model door Hans van de Burgt
Vandaag om 14:58:19
De IJmuider spoorlijn - korte geschiedenis en plaatjes door Vislijn
Vandaag om 14:57:24
W.V. Kalender 2026 door Wim Vink
Vandaag om 14:56:40
Onlangs gespot - gefotografeerd, de foto's door Arjen B.
Vandaag om 14:55:43
PB Models, ICR-rijtuigen door spoorijzer
Vandaag om 14:25:09
MODELSPOOR by MTD - 2025 - 18 & 19 oktober 2025 in Edegem (B) door Ronald Halma
Vandaag om 14:13:56
PIKO Loknummer wijzigen in SmartControl lukt niet door aad52
Vandaag om 13:39:22
Nederland jaren 50 op basis van mijn roots door Hans GJ
Vandaag om 13:29:09
Het einde van de RhB- Chiavenna Stazione Merci door Hollandserhbfan
Vandaag om 13:11:30
Spur 1 Tage 18 en 19 oktober 2025 door Kees-Jan
Vandaag om 12:41:28
Ombouw/Pimpen Bolle neuzen door Paulogic
Vandaag om 12:40:07
De Projecten van RetroJack door RetroJack
Vandaag om 12:26:53
Ermehuizen, dienstregelingsjaar 1973/1974 door Forever Rocofan
Vandaag om 12:14:57
Cherteau, fictieve Waals industriedorp door Hans GJ
Vandaag om 11:50:36
Märklin 2025 door spoorijzer
Vandaag om 11:31:23
Mijn eerste H0-modeltreinbaan in aanbouw door Harryku
Vandaag om 11:28:39
  

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

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4655
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #60 Gepost op: 04 December 2017, 21:44:39 »
Hoi Joop,

Ik ga even over de code zoals ik het tegen kom. Lijkt misschien gezeur om het zo te lezen maar zo bedoel ik het niet! Probeer je tot een goed programma te laten komen :)

typedef struct pwmPins {
  int pin;
  unsigned long cyclus;
  unsigned long startCyclus;
  unsigned long toggle;
} pwmPin;

byte is groot genoeg voor een pin nummer. De pinState kun je ook gewoon uitlezen. Daarnaast zet je de initiële waarde van de pinState op HIGH terwijl de pin initiëel laag is.

Ook mag het in C++ direct:
struct pwmPin_t{
  int pin;
  unsigned long cyclus;
  unsigned long startCyclus;
  unsigned long toggle;
  bool pinState;
};

pwmPin_t pwmObjects[] = {
  {3}, {5}
};
const byte NrPwmObjects = sizeof(pwmObjects)/sizeof(pwmObjects[0]);
//ik gebruik vaak de macro
//#define numberOf(x) (sizeof(x)/sizeof(x[0]))
//dan kan je schrijven
//const byte NrPwmObjects = numberOf(pwmObjects);

En eigenlijk ben je met die struct en de setPWM functie al goed op weg om het een object te maken ;)

const byte pinMotor1    = 4;
const byte pinMotor2    = 5;
Zou ook een uitgelezen plek zijn voor een array ;)


unsigned long currentMicros  = micros();Doet niets, je kunt pas een functie aanroepen in een functie.

const byte pinPotmeter  = 3;Als je A3 gebruikt ipv 3 kan je nooit voor gekke verrassingen komen te staan. Want er zijn een aantal Arduino's waar analogRead(3) en analogRead(A3) niet hetzelfde doen.

pwm1 is nooit gebruikt en potmeter als global is niet zo zinvol.

if (speed < 0) {digitalWrite(pinMotor1, LOW);} else {digitalWrite(pinMotor1, HIGH);}Probeer dingen niet op één regel te proppen. Regels (en spaties) zijn gratis (maar overdrijf het ook niet).
if (speed < 0) {
    digitalWrite(pinMotor1, LOW);
  }
  else {
    digitalWrite(pinMotor1, HIGH);
  }
En moet je pinMotor2 ook niet aan passen? Of welke H-brug gebruik je eigenlijk?

getPotmeterSetting()Het is ook niet erg logisch dat deze functie de richting zet. Zou je namelijk niet verwachten aan de naam ;)

Dan meer naar de werking:
unsigned int freq = snelheid + 30;Okay, frequentie tussen 30 en 130 dus.

pwmObjects[index].cyclus = 1.00 / freq * 1000000;De float cast maakt het wel wat lastig maar zorgt denk ik voor de correcte afronding. Maar is hetzelfde als
pwmObjects[index].cyclus = (1000000 + (freq / 2) ) / freq;Maar in ieder geval de duur van een periode in us.

pwmObjects[index].toggle=pwmObjects[index].cyclus*snelheid/100;Hoeveel daar van aan.

Duurde even voor ik dat door had. period en onPeriode ofzo zou het duidelijker hebben gemaakt.

Ik zou het daarna overigens niet eens meer in 500us intervallen hakken maar gewoon checken. Zou eerder het aantal analogReads() beperken. Zeker omdat 500us nu best een grove afronding geeft. Zie deze grafieken wat voor variatie je nu hebt.

Ik zou het dus allemaal iets directer doen :)

Hopelijk is het niet te veel commentaar :angel:


Timo
Verzonden vanaf mijn desktop met Firefox

jmu

  • Offline Offline
  • Berichten: 161
    • Tandradbaantje blog
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #61 Gepost op: 05 December 2017, 10:07:14 »
Dag Timo,

Bedankt voor je correcties. De source was idd nog niet op orde en was hier en daar snel bij elkaar gekopieerd. Maar goede tips zijn altijd welkom, daar hoef je je niet voor te excuseren!
Kost het uitlezen van de pinState meer processor stappen? Dat is de reden dat ik vaak uitwijk naar een var.

Jouw berekening pwmObjects[index].cyclus = (1000000 + (freq / 2) ) / freq; levert een andere uitkomst. Het scheelt weliswaar niet veel (een half), maar waarom zou je het op die wijze doen?

Op jouw grafiek moet ik nog even studeren en het finetunen moet nog gebeuren. Ik heb iig al de freq berekening aangepast, omdat naar mijn zijn de freq te snel steeg. De formule is nu freq = 0.3 * snelheid + 30;

Joop

jmu

  • Offline Offline
  • Berichten: 161
    • Tandradbaantje blog
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #62 Gepost op: 05 December 2017, 17:11:23 »
Ik heb nog geprobeerd om een software oscilloscoop aan de praat te krijgen, maar dat loopt op een teleurstelling uit. Zelfs al zet ik een toongenerator op de ingang, dan nog is het signaal niet bruikbaar. Helaas lukt het me niet om zo de blokgolf te kunnen onderzoeken. Als iemand nog een tip heeft houd ik me aanbevolen.

Joop

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4655
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #63 Gepost op: 05 December 2017, 21:05:14 »
Maar goede tips zijn altijd welkom, daar hoef je je niet voor te excuseren!
Gelukkig! 8) Het was namelijk nogal een rommelig zooitje tips geworden ::)

Kost het uitlezen van de pinState meer processor stappen? Dat is de reden dat ik vaak uitwijk naar een var.
Iets, maar als je ook digitalWrite() gebruikt is het verwaarloosbaar.

Jouw berekening pwmObjects[index].cyclus = (1000000 + (freq / 2) ) / freq; levert een andere uitkomst. Het scheelt weliswaar niet veel (een half), maar waarom zou je het op die wijze doen?
Zou kunnen dat jouw berekening juist niet correct afrondde (altijd naar beneden). Dat is precies wat ik hier fix met "+ (freq / 2) )". Voorbeeldje, met integer math 10 / 4 = 2. Terwijl als we het normaal doen is het 2,5 wat afgerond 3 geeft. Als je de teller verhoogd met de helft van de noemer zal integer math ook correct afronden. In het voorbeeld, (10 + (4/2) ) / 4 = (10 + 2) / 4 = 12 / 4 = 3. Correct afgerond  :)

Waarom je liever bij integer math blijft? De standaard, 8-bit, Arduino's hebben geen hardware voor floating point math. De compiler weet dit en werkt er om heen door het op te breken in een berg integer math. Maar dat is dus altijd een stuk trager dan het te doen in integer math. Dat is ook waarom je op 8-bit microcontroller (of meer algemeen, microcontroller zonder floating point hardware) liever gewoon de decimaal weg haalt. Dus als je euros wilt met centen achter de komma sla je hetgewoon op als centen. Wil je graden Celsius met één decimaal sla je het op als deci-graden Celsius. Dit punt zet je er zo weer in als je het wilt printen.

Op jouw grafiek moet ik nog even studeren en het finetunen moet nog gebeuren. Ik heb iig al de freq berekening aangepast, omdat naar mijn zijn de freq te snel steeg. De formule is nu freq = 0.3 * snelheid + 30;
Maar met die formule loopt je frequentie tussen de 30Hz en 60Hz... Dat is wel een heeeeeeel verschil met eerst. En weer, in integer math is het een stuk sneller. Okay, snelheid / 3 + 30 is niet helemaal hetzelfde maar wel een stuk sneller. Voorbeeldje:
volatile byte in = 10;
volatile byte out;
unsigned long tic, toc;

void setup(){
  Serial.begin(115200);

  Serial.println(F("---Float---"));
  tic = micros();
  for(in = 0; in <= 100; in++){
    out = 0.3 * in + 30;
  }
  toc = micros();
  Serial.print(F("Waarde: "));
  Serial.println(out);
  Serial.print(F("tijd: "));
  Serial.println(toc - tic);
 
  Serial.println(F("---Int---"));
  tic = micros();
  for(in = 0; in <= 100; in++){
    out = in / 3 + 30;
  }
  toc = micros();
  Serial.print(F("Waarde: "));
  Serial.println(out);
  Serial.print(F("tijd: "));
  Serial.println(toc - tic);
}

void loop(){
}
Uitkomst:
Citaat
---Float---
Waarde: 60
tijd: 2472
---Int---
Waarde: 63
tijd: 152
Goed, daar zie je al het verschil in uitkomst maar ook het enorme verschil in tijd. Namelijk 16 keer zo snel.

Zelf ooit wel een software oscilloscoop gebruikt maar niet veel en dat is lang geleden. Staat al een aardig tijdje een HP scope op me bureau :angel: Maar voor de geluidskaart oscilloscoop zal het nooit lukken om een blokgolf echt netjes weer te geven, zeker met die lage frequenties. Dat komt door de ontkoppel condensator in de geluidskaart waardoor je het altijd AC koppelt. Was ik even vergeten toen ik het noemde. Als je een goedkope USB geluidskaart gebruikt is deze condensator wel weg te halen. Maar voor blokgolven is de logic analyzergoedkope logic analyzer makkelijker.


Timo
Verzonden vanaf mijn desktop met Firefox