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

Al mijn goede ideeën... door Monobrachius
Vandaag om 15:01:17
US diorama in H0 door Wim Vink
Vandaag om 14:58:23
U-vorm beperkte ruimte (H0 C-rails) door Jelmer
Vandaag om 14:58:04
Onlangs gespot - gefotografeerd, de links door Jeroen Water
Vandaag om 14:33:00
N spur scenery elementen maken van gips of klei? door Dave.......
Vandaag om 14:30:06
De overeenkomst tussen een Ovaalramer en een Motorpost. door RK
Vandaag om 14:28:54
Onlangs gespot - gefotografeerd, de foto's door mass am see
Vandaag om 14:18:46
Gebruik je Arduino zonder te "programmeren" ;) door bask185
Vandaag om 14:12:48
BMB-Module: “Corfe Castle Station” door Hans van de Burgt
Vandaag om 14:07:52
OVP voor wagons van blauw naar wit door Railman
Vandaag om 13:40:42
GSS Jubileumbaantje (0e / 0n30) door MacArthur
Vandaag om 12:55:30
Hengelo in 1981-1982, maar dan anders: Kassenberg in N door spoorijzer
Vandaag om 12:33:37
Toon hier je nieuwe (model-) spooraanwinst(en)... door Sven
Vandaag om 12:28:41
NTM P1 in Schaal-1 door MaraNCS
Vandaag om 11:39:38
Mijn eerste H0-modeltreinbaan in aanbouw door Jack Black (NS1220)
Vandaag om 11:33:00
Rio Grande Southern - Lizard Head Pass door Hans GJ
Vandaag om 11:30:20
Ombouw/Pimpen Bolle neuzen door bollen neus
Vandaag om 11:27:15
Bauarbeiten im gange door Dave.......
Vandaag om 10:55:26
Variaties op Station Zetten Andelst in HO door Duikeend
Vandaag om 10:54:40
De IJmuider spoorlijn - korte geschiedenis en plaatjes door Vislijn
Vandaag om 10:42:29
Onze Nederlandse Stoomlocomotieven (nieuwe druk) door R v/d Hoven
Vandaag om 09:24:48
Internationale Spoor 0 en 1 dagen in Gießen, 23 en 24 maart, 2024 door bernhard67
Vandaag om 08:42:53
De Hondsrugbaan door mass am see
Vandaag om 08:15:11
Pfarrerwinkel bahn door Jelmer
Vandaag om 08:00:19
M.s.v. De Percee bouwt aan nieuwe clubbaan door J. Moors
Vandaag om 01:00:05
30 maart Modelspoorbeurs Houten & HCC Kennisdag door WimM
Vandaag om 00:42:50
Raadplaatje door Magic
27 maart 2024, 23:27:03
Ronald en Wanda's "Southern Comfort" swamp layout! door Ronald Halma
27 maart 2024, 23:17:30
Bouw van materieel 40 treinstellen door Pauldg
27 maart 2024, 22:45:06
Martijn's rariteitenkabinet door Martijn193
27 maart 2024, 22:30:17
  

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

Klaas Zondervan

  • Offline Offline
  • Berichten: 25180
    • 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

  • Offline Offline
  • Berichten: 25180
    • 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