Doel:€250.00
Donaties:€50.00

Per saldo:€-200.00

Steun ons nu!

Laatst bijgewerkt
op 03-01-2024

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

Piko NS 2015 stroomafname probleem door Rick
Vandaag om 13:24:51
Punt- en hartstukken door 1200blauw
Vandaag om 13:12:58
welk jaar ging Marklin OVP voor wagons van blauw naar wit door Bahn-AG
Vandaag om 12:42:50
US diorama in H0 door moonlicht
Vandaag om 12:40:54
De (3d) knutsels van Ronald. door MaraNCS
Vandaag om 12:26:42
Doornvliet door raymond erdtsieck
Vandaag om 12:23:03
U-vorm beperkte ruimte (H0 C-rails) door eitreb
Vandaag om 12:06:06
Leids spoor (voorheen Blauwpoortsbrug) door gdh
Vandaag om 11:55:50
7 april De Karel on tour door NL-modelspoor
Vandaag om 11:51:04
NS Tals wagons (kalktrein) door Arjan6511
Vandaag om 11:41:59
Ombouw/Pimpen Bolle neuzen door bollen neus
Vandaag om 11:19:47
Beekdaelen in H0 door VulcanRaven
Vandaag om 11:00:45
Stroomdetectie bij goederenwagens door henk
Vandaag om 10:32:03
MARDEC, de Multifunctionele ARduino dcc DECoder. door NTeering
Vandaag om 10:23:47
nieuw te leggen sporen passend maken door Jelmer
Vandaag om 10:05:07
MSV Post B, even voorstellen... door Rsd1000
Vandaag om 10:01:44
30 maart Modelspoorbeurs Houten & HCC Kennisdag door Jelmer
Vandaag om 09:52:49
FFA koelwagen door martijnhaman
Vandaag om 09:46:10
Mijn eerste H0-modeltreinbaan in aanbouw door DJV
Vandaag om 09:42:59
Zoekfunctie ? door henk
Vandaag om 09:18:44
Bouw van materieel 40 treinstellen door Pauldg
Vandaag om 07:52:09
NS 8400 van Werps door MathynK
Vandaag om 07:05:15
Onlangs gespot - gefotografeerd, de foto's door GerardvV
28 maart 2024, 23:37:18
Al mijn goede ideeën... door bask185
28 maart 2024, 23:12:12
Gebruik je Arduino zonder te "programmeren" ;) door bask185
28 maart 2024, 22:51:58
21 april Het stoomgenootschap door bloemenvelden door Seinhuis
28 maart 2024, 22:46:29
Raadplaatje door Magic
28 maart 2024, 22:23:21
LokSound 4 decoders, files verbeteren (voor Roco b.v. TEE RAm, NS2400, etc) door Biesje
28 maart 2024, 22:06:44
Geluid NS Mat'46 vs NS Mat'54 door Rob Bennis
28 maart 2024, 21:54:12
Engelse wagon uit 1930 opgegraven in Antwerpen door willem2
28 maart 2024, 21:52:45
  

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

Klaas Zondervan

  • Online Online
  • Berichten: 25182
    • Pagina van klaas
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #30 Gepost op: 14 september 2017, 14:21:48 »
Voor wie er nog interesse in heeft hier de grafieken die ik heb opgenomen van de Weistra regelaar.

De eerste grafiek geeft het verband tussen de potmeterstand enerzijds en de pulsfrequentie en duty-cycle anderzijds.



De tweede grafiek geeft het verband tussen potmeterstand en baanspanning/snelheid.



Wat opvalt is dat de frequentie redelijk lineair verloopt. De grafiek van de duty-cycle is enigszins hol, terwijl baanspanning en snelheid juist bol verlopen. Strikt genomen klopt dat niet, duty-cycle en baanspanning zouden theoretisch dezelfde vorm moeten hebben.
In de eerste 20% van de potmeter gebeurt er niks terwijl boven 70% de snelheid aardig uit de hand loopt. Ik overweeg dan ook om aan de onderkant en de bovenkant van de potmeter vaste weerstanden toe te voegen, zodat de potmeter zelf alleen het bereik tussen 20 en 70% bestrijkt.

De snelheidsproef is gedaan met een Roco TEE treinstel dat is omgebouwd naar analoog (af fabriek zit er standaard een decoder in).
Verder is het treinstel voorzien van andere wormsets. Waar het eerst een slak was is het nu een racemonster geworden.

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #31 Gepost op: 15 september 2017, 09:39:08 »
Hoi Klaas,

Interessante meting :) Frequentie is inderdaad aardig lineair met de potmeter maar de duty iets minder. Maar denk dat een lineaire interpretatie wel goed te maken is. Maar liever zou je natuurlijk de boel lineair maken met de snelheid of baanspanning. Hoe heb je dat laatste gemeten? Gemiddelde of RMS?


Timo
Verzonden vanaf mijn desktop met Firefox

Klaas Zondervan

  • Online Online
  • Berichten: 25182
    • Pagina van klaas
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #32 Gepost op: 15 september 2017, 09:42:22 »
De baanspanning heb ik gemeten op het gelijkspanningsbereik. Dan meet je vanzelf de gemiddelde waarde.

Hansepansje

  • Offline Offline
  • Berichten: 672
    • Perrongeluk - van de regen uit de drup
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #33 Gepost op: 03 oktober 2017, 17:56:01 »
Leuk topic!
Omdat ik zowel treintjes als Arduino's leuk vind, ben ik maar eens begonnen om te kijken of ik een 'Weistrarduino regelaar' kan maken.

Inmiddels ben ik op een proefbordje met Arduino, potmeter, L293D, motortje en LCD display zover dat ik de motor heen en weer kan laten draaien o.b.v. de stand van de potmeter, en wat info op het display tonen.
Nu ben ik aan het kijken of ik de PWM frequentie van de Arduino aangepast kan krijgen. Als dat ook lukt, dan liggen de ingredienten voor de 'Weistrarduino regelaar' voor het oprapen om er wat leuks van te bakken.  ::)

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

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #34 Gepost op: 03 oktober 2017, 21:58:37 »
De frequenties van de Weistra regelaar zijn erg laag. Ook is deze steeds iets anders per stand. De hardware PWM is dan alleen maar lastig. Denk dat je naar software PWM moet en deze maken op basis van een timer interrupt. Verder alleen geen tijd gehad dit verder uit te werken... ::)


Timo
Verzonden vanaf mijn desktop met Firefox

Hansepansje

  • Offline Offline
  • Berichten: 672
    • Perrongeluk - van de regen uit de drup
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #35 Gepost op: 04 oktober 2017, 08:15:24 »
Timo,

De frequentie van de 'standaard PWM' is inderdaad te hoog. Maar de frequentie en duty cycle van een timer is softwarematig aangepast.
Gisteravond een eerste poging gedaan en er zit schot in: Het aangesloten testmotortje komt in beweging, nog beter zelfs als de startfrequentie bij lage duty cycle onder de 30 Hz zakt, bijv 15 Hz.
Nu dit in de basis lijkt te werken, wil ik verdergaan en er een lokmotortje op aansluiten. Ik heb ook een Weistra regelaar, dus indien nodig kan ik mooi vergelijken. Alleen heb ik geen scope, dus precies meten van frequenties en duty cycles gaat lastig worden.

Wordt vervolgd.

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

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #36 Gepost op: 04 oktober 2017, 11:05:52 »
Je kan het inderdaad wijzigen. Maar niet onafhankelijk ;) De PWM frequentie kan je maar instellen op een paar waardes met behoudt van de volle range voor de duty cycle. Bij benadering zijn dat 30Hz, 60Hz, 122Hz, 244Hz, 490Hz, 980Hz, 3,9kHz, 7,8kHz, 31kHz en 62kHz. Alle andere frequenties beïnvloed de resolutie van de duty cycle.


Timo
Verzonden vanaf mijn desktop met Firefox

Hansepansje

  • Offline Offline
  • Berichten: 672
    • Perrongeluk - van de regen uit de drup
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #37 Gepost op: 04 oktober 2017, 17:31:05 »
Ja Timo, dat heb ik gezien, maar me bij de eerste pogingen niet teveel in verdiept. Ga ik zeker nog doen.
Even kort door de bocht: Als ik van 30 Hz met 255 stappen 'terug' ga naar 90 Hz, dan zou ik nog zo'n 85 stappen overhouden. Of misschien zelfs van 511 stappen terug naar 170. Dat lijkt me een voldoende range om daarmee de duty cycle nog genuanceerd te kunnen regelen.

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

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #38 Gepost op: 04 oktober 2017, 22:12:59 »
85 stappen is niet zo veel voor gladde overgangen en als je de verschillen tussen de stappen een beetje gelijk wilt hebben. En bedenk dat je vaak niet tot 100% duty wilt omdat het anders een TGV is.

Maar lastiger is het rekenwerk om steeds de juiste duty en freqenctie te bepalen. Toegegeven, dit kan in een lookup. Maar ik denk dat je een vloeiendere lijn krijgt als je zelf aan de slag gaat met een timer :)


Timo
Verzonden vanaf mijn desktop met Firefox

Hansepansje

  • Offline Offline
  • Berichten: 672
    • Perrongeluk - van de regen uit de drup
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #39 Gepost op: 20 oktober 2017, 11:45:19 »
Een eerste versie is gelukt! Zie hier  8)
(M'n excuses voor de matige beeldkwaliteit van het filmpje)

Benodigdheden voor deze pilot zijn minimaal: 12 volt voeding, Arduino, L293D regelaar, wat draadjes en voor de liefhebbers die 'binnenin' willen kijken een LCD display.
Op het filmpje is te zien dat de loksnelheid mooi te regelen is. De hierbij gebruikte instellingen zijn als volgt:
- frequentie bereik: 30-100 Hz
- duty cycle bereik: 0-75%
- aantal stappen: 64

Het idee achter deze pilot (net als bij de Weistra regelaar): de stand van de potmeter wordt (in beginsel zo lineair mogelijk) omgezet in frequentie en duty cycle van het Arduino PWM signaal.
Het rekenwerk voor de omzettingen (van potmeterstand naar frequency/duty cycle naar timer trigger levels valt reuze mee.
Maar om snel wat waarden in te kunnen stellen/veranderen (nulstand potmeter, start/stop waarde van frequentie en max. duty cycle gebruik ik een paar hashing tabellen. Om bij het programmeren me niet te verslikken in alle getalletjes op een rij, heb ik een spreadsheet gemaakt. Hiervandaan kan ik de definities van de verschillende hashing tabellen zo in de code kopieren.

Als toelichting op wat je op het filmpje ziet, op het LCD display:
  162[10] 193/21
  41Hz, 12%
dan betekent dit:
  162: ingelezen stand van de potmeter [bereik: 0-1023]
  [10]: hieruit afgeleide stap [bereik: 0-64]
  193: bovenste timer trigger level (OCnA, bepaalt frequentie)
  21: onderste timer trigger level (OCnB, bepaalt samen met OCnA de duty cycle)
  41Hz: frequentie van PWM signaal
  12%: duty cycle van PWM signaal

Vanuit stilstand heel langzaam optrekken en vloeiend versnellen lijkt hiermee prima mogelijk.
Binnenkort de boel maar eens aansluiten op een railovaal, zodat het rijgedrag over de hele range goed te bestuderen is. De eerste indruk op een stuk flexrail is in ieder geval bemoedigend.  ::)

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

Daan Neijenhuis

  • Offline Offline
  • Berichten: 1508
  • HCC!m-IG
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #40 Gepost op: 20 oktober 2017, 12:11:21 »
Cool !   (y)
Wanneer lees je nou een handleiding?   ;D

dickkoning

  • Offline Offline
  • Berichten: 140
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #41 Gepost op: 20 oktober 2017, 12:31:02 »
Leuk gedaan
Kun je een schema en je code eens posten
Dick

hepost

  • Offline Offline
  • Berichten: 58
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #42 Gepost op: 20 oktober 2017, 15:38:35 »
Mooi! Die trein kruipt echt weg. Ik ben benieuwd of het voor mijn treintje ook zo goed zal werken.

Hansepansje

  • Offline Offline
  • Berichten: 672
    • Perrongeluk - van de regen uit de drup
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #43 Gepost op: 21 oktober 2017, 20:27:33 »
Op verzoek, hierbij wat meer info van m'n pilot.

Het schema ziet er als volgt uit:


De motorspanning die op pen 8 van de L293D wordt aangeboden heb ik afgetakt van de inkomende externe voeding van de Arduino, die ik voor deze pilot op 12 volt heb aangesloten.

De code voor de Arduino is als volgt:
// PWM-test-2
// Translate potmeter position into frequence and duty cycle of PWM signal

/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
#include <LCD.h>
// Get the LCD I2C Library here: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include <LiquidCrystal_I2C.h>
// set the LCD address to 0x27 for a 16 chars 2 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

/*-----( 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;

const byte pinPotmeter = 3;
const byte pinMotor1    = 4;
const byte pinMotor2    = 5;
const byte pinTimer2a  = 3;
const byte pinTimer2b  = 11;
const byte MaxStep      = 64;
int potmeterLimits[] = {10, 26, 42, 57, 73, 89, 105, 121, 137, 152, 168, 184, 200, 216, 232, 247, 263,
279, 295, 311, 327, 342, 358, 374, 390, 406, 422, 437, 453, 469, 485, 501, 517, 532, 548, 564, 580,
596, 611, 627, 643, 659, 675, 691, 706, 722, 738, 754, 770, 786, 801, 817, 833, 849, 865, 881, 896,
912, 928, 944, 960, 976, 991, 1007, 1023};
// For display purpose only, required values for PWM Frequency and Duty Cycle.
int Freq_Hashing[] = {31, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, 79, 80, 81,
82, 83, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100};
int DC_Hashing[] = {0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 25, 26, 27,
28, 29, 30, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 59,
60, 61, 62, 63, 64, 66, 67, 68, 69, 70, 71, 73, 74, 75};
// Values for OCnA and OCnB, calculated from PWM Frequency and Duty Cycle.
int OCnA_Hashing[] = {255, 255, 247, 238, 231, 223, 217, 210, 204, 199, 193, 188, 183, 179, 174, 170,
166, 162, 159, 155, 152, 149, 146, 143, 140, 137, 135, 132, 130, 128, 125, 123, 121, 119, 117, 115, 113,
112, 110, 108, 107, 105, 104, 102, 101, 99, 98, 97, 95, 94, 93, 92, 91, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 79};
int OCnB_Hashing[] = {0, 2, 4, 7, 9, 12, 14, 16, 18, 20, 21, 23, 24, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54,
54, 55, 54, 55, 55, 56, 56, 56, 57, 57, 57, 57, 58, 59};

void setup()
{
  // Initialize motor pins
  pinMode(pinMotor1, OUTPUT);
  pinMode(pinMotor2, OUTPUT);

  // Set motor pins unequal to ensure movement controlled by enable
  digitalWrite(pinMotor1, HIGH);
  digitalWrite(pinMotor2, LOW);

  // Set timer 2 op phase-correct PWM with OCRA controlling top limit, prescaler 1024
  pinMode(pinTimer2a, OUTPUT);
  pinMode(pinTimer2b, OUTPUT);
  TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM20);
  TCCR2B = _BV(WGM22)  | _BV(CS22)   | _BV(CS21) | _BV(CS20);  // Prescaler Value is 1024

  // Initialize lcd screen
  lcd.begin(16, 2);  // initialize the lcd for 16 chars 2 lines
  lcd.backlight();    // Turn backlight on
}

byte getPotmeterSetting()
{
  byte iCheck = 0;
  // Read potmeter value;
  potMeter = analogRead(pinPotmeter);

  // Determine matching index value and return it
  while ((potMeter > potmeterLimits[iCheck]) && (iCheck < MaxStep)) { iCheck++; }
  return iCheck;
}

void setTimer2(int iIndex)
{
  //Assign values to OCR Registers, which determine PWM frequency and duty cycle.
  OCR2A = OCnA_Hashing[iIndex];
  OCR2B = OCnB_Hashing[iIndex];

  // Display various variables on LCD screen
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(potMeter); lcd.print("["); lcd.print(iIndex); lcd.print("] ");
  lcd.print(OCnA_Hashing[iIndex]); lcd.print("/"); lcd.print(OCnB_Hashing[iIndex]);
  lcd.setCursor(0, 1);
  lcd.print(Freq_Hashing[iIndex]);
  lcd.print("Hz, "); lcd.print(DC_Hashing[iIndex]); lcd.print("%");
}

void loop()
{
  // Check potmeter value and set frequency and duty cycle accordingly
  setTimer2(getPotmeterSetting());
  // Wait half a second
  delay(500);
}

Vragen of opmerkingen zijn welkom.

Groets, Hans
« Laatst bewerkt op: 21 oktober 2017, 21:49:37 door Hansepansje »
Dachbodenheim: N-spoor, Fleischmann Piccolo, HCCM elektronica, eigen software

72sonett

  • Team encyclopedie
  • Offline Offline
  • Berichten: 2083
    • El Carrilet
Re: PWM met frequentieregeling met Arduino t.b.v. besturing analoge DC-treinbaan
« Reactie #44 Gepost op: 21 oktober 2017, 21:36:38 »
Kun je de dataregels in het codeblok korter maken, het past niet op het scherm.
El Carrilet
"te dom om te poepen"
MH