web counter

Analoge servosturing

Beladen kolenwagons

Digitale servosturing

Wissels aansturen met een MS1

S88 Terugmelders


Zelfbouw LocoNet projecten

Contact:
Geert.Giebens(at)gmail.com


 

NIEUW: LocoNet projecten

! Omwille van overschakelen naar LocoNet protocol wordt tijdelijk deze webpagina niet meer geüpdate. 

 

Marklin Motorola Wissel Decoder met servopuls-sturing met eindeloopcontacten en geďntegreerde S88 terugmelding en dit voor 16 wissels.

Kunt ge volgen? lees verder…

Inhoud:

Een MMWD-S-EC-PS88N in een PIC16F887 microcontroller
    Betekenis
    Er zijn ook Extra’s ingebouwd
    Toekomstige uitbreidingen?

Werking
    Het Marklin Motorola wissel protocol (MM-wissel protocol)
    Serieel overdracht van het MM-wissel data pakket en foutdetectie
    Bitdetectie door µcontroller
    Praktische verwerking in de µcontroller
    Servo stuurprogramma

Praktische uitwerking op componentenniveau
Wat kost zoiets?
Assembler program
 

Een kleine verduidelijking i.v.m. de servosturing: de roterende servobeweging wordt omgezet naar een lineaire beweging via een stang. Het is deze stang die verbonden is met het wisselmechanisme  (naar boven toe op volgende figuur). Op deze stang, die verbonden is met de massakant van de 5V voeding, zit ook een meetpin die beweegt tussen twee vaste eindeloopcontacten (eigenlijk ook twee pinnen). De afstand tussen deze twee eindeloopcontacten komt overeen met afstand die de wisseltong moet verplaatsen. Heel het mechanisme wordt ondergronds (beter eigenlijk onder de treintafel) gemonteerd. De servo’s zelf staan al of niet gegroepeerd aan de zijkant van de treintafel zodat deze goed bereikbaar zijn voor vervanging. De servo’s die ik gebruik hebben een draaibereik tussen 0° en 180° respectievelijk pulsbreedte van 0,5ms en 2,5ms. Middenstand (90°) komt overeen met een pulsbreedte van 1,5ms.
 

Een MMWD-S-EC-PS88N  in een PIC16F887 microcontroller

Een afkorting met redelijk wat inhoud want er zit heel wat in deze Microcontroller (µcontroller). Het hierna volgend schematische voorstelling geeft aan wat er allemaal geprogrammeerd zit in deze microcontroller. (de blokjes in het gele kader)

 

Betekenis:

PIC 16F887 Is een redelijk veelzijdig µcontroller van Microchip. Het is een 40 pins IC met een ingebouwde oscillator van 8MHz. 35 van die pinnen zijn programmeerbaar voor in- of output en 1 enkel voor input (totaal 36).

MMWD staat voor Marklin Motorola Wissel Decoder. Deze decoder is geschikt om 16 wissels aan te sturen. (4 keer een K83 eigenlijk)

S staat voor Servosturing. De µcontroller kan 16 analoge servo’s aansturen die elk een wisseltong kunnen verplaatsen. Als de servo zijn positie heeft bereikt dan stopt ook het uitsturen van de pulsen naar de servo. Geen servo getril meer, ook jitter of brommen genoemd. Dit komt ten goede aan de levensduur van de servo en voeding. De overgang tussen de 2 wisselstanden gebeurt langzaam zoals dat ook in het echt gebeurd.

EC staat voor Eindeloop Contact. De juiste positie van de wisseltong, nl. rechtdoor of afbuigen wordt ter plaatse (net onder de wisseltong) gemeten door 2 vaste eindeloop contacten. De µcontroller weet aan de hand van deze contacten of de servo zijn positie heeft bereikt en stopt het uitsturen van pulsen. Dit meetprincipe heeft veel voordelen: speling en slijtage aan mechaniek zoals o.a. aan servo en stangen en temperatuur invloed (uitzetting) worden allemaal opgeheven.

PS88N Staat voor Parallelle S88N terugmelding module. Een S88 kent iedereen wel, dit is de standaard 16 ingang terugmelder van Marklin. In deze µcontroller zitten er zo 2 S88-en, goed voor 32 terugmeldingen. De 16 wissels hebben elk twee eindposities vandaar 32 terugmeldingen. De toevoeging N geeft aan dat de databus van de S88 op een RJ45 connector zit (dezelfde type connector die je gebruikt om je computer met internet te verbinden, of je moet draadloos verbonden zijn…) Op de RJ45 connector zit ook het digitale signaal van de centrale of booster. Dit digitale signaal hebben we immers nodig om te kunnen decoderen. De P geeft aan dat de S88 terugmelders elk parallel worden opgevraagd. De S88 bus blijft wel serieel, maar elke paar S88-en wordt één voor één afzonderlijk ingelezen telkens 32bits. Vandaar dat er geen DATA IN-pin van de S88-bus op de µcontroller zit. (ook de S88 RESET ontbreekt, is niet nodig als je werkt met µcontrollers) Dit principe heeft voordelen omdat we zo overdrachtsfouten kunnen detecteren. Overigens de MMWD-S-EC-PS88N kan ook in een standaard S88 bus opgenomen worden, maar dan enkel als laatste. Natuurlijk hoeft je deze optie niet te gebruiken, het zit er gewoon gratis in omdat er nog wat pinnen over waren op de µcontroller…
 

Er zijn ook Extra’s ingebouwd:

Softwarematige Inschakelvertraging: Als er heel veel servo’s tegelijkertijd aangestuurd worden, dan kan het wel eens voorkomen dat de servo 5V voeding de enorme vraag aan stroom niet meer kan leveren en het begeeft. L Via een softwarematige inschakelvertraging kunnen we dit spreiden. De inschakelvertraging is instelbaar in seconden en de µcontroller wacht dit aantal seconde af voor deze begint met een zelftest. Voor elke µcontroller stellen we, indien gewenst,  een andere tijd in. Eigenlijk is een hardwarematige inschakelvertraging nog beter. Ik bedoel hiermee dat de voedingsspanning van de servo’s vertraagt en verspreid wordt geschakeld. 

Zelftest: Eigenlijk is dat de taak van de (trein)centrale om na te gaan of de servo’s wel goed werken. Bijvoorbeeld door de wissels aan te sturen en na te gaan of de terugmeldingen wel correct binnen komen. Toch is er een zelftest geprogrammeerd dat dit automatisch doet na de inschakelvertraging. Ik noem dit ‘even losgooien van de servo-armpjes’ of ’even opwarmen voor dienst’. J Het opvragen hoe de zelftest is afgelopen voor elke servo kan via de S88 bus. Zie verder hoe…

Geforceerde middenstand servo’s: Via een extra wisselnummer bv. 253 kan je al de 16 servo’s naar de middenstand sturen. Dit is handig om de mechaniek van de wissels correct af te stellen.
 

Mogelijke toekomstige uitbreidingen?

  • Het programmeren via CV’s voor o.a. verandering van de verschillende wissel-adressen; de minimum-, maximum- en middenstand pulsduur van de servo’s; de inschakelvertraging enz….  Nu moet dat steeds in het assembler program zelf geprogrammeerd worden. Werkt bij mij ook zo goed hoor.
  • Multiprotocol zoals DCC en Mfx, zelf heb ik daar nu wel niets aan, maar wie weet ooit? (dan kan ik dit wel geen MMWD-S-EC-PS88N  meer noemen)
  • Andere suggesties altijd welkom. J    Laat het me weten…
     

Werking:

De volgende voorstelling van de werking van de MMWD-S-EC-PS88N is sterk vereenvoudigd gepresenteerd. De bedoeling is dat je het principe kunt volgen. Desondanks is dit toch nog een hele boterham. Een beetje basiskennis van digitale techniek is hier wel aangewezen.
 

Het Marklin Motorola wissel protocol (MM-wissel protocol):

Het Marklin Motorola wissel protocol wordt voorgesteld als een rij van 9 opeenvolgend paar databits. Met paar bedoel ik dat deze telkens bestaat uit twee bits:

‘A1’ ‘A2’ ‘A3’ ‘A4’ ‘00’ ‘D1’ ‘D2’ ‘D3’ ‘SS’, vanaf nu een ‘MM-wissel data pakket’ genoemd

Waarbij:
Adresbits
‘A1’ ‘A2’ ‘A3’ en ‘A4’ het adres is van de wisseldecoder. Elk paar adresbits heeft drie mogelijke toestanden, ‘00’, ’11’ of ‘10’. Dit komt oorspronkelijk van de Motorola Decoder-Encoder IC’s MC145026 en MC145027. Een ingangspin van dit IC kent namelijk 3 toestanden (trinair). Ofwel verbonden met massa= ‘00’, ofwel verbonden met de plus = ‘11’ ofwel geen verbinding (open) = ‘10’. Het New Marklin Motorola formaat kent ook toestand ‘01’, maar dit laten we even buiten beschouwing.

Databits ‘00’ (cijfers 0 en 0) geeft aan dat de data bestemd is voor een wisseldecoder. (Bij ‘11’ is de data bestemd voor relais aansturing zoals voor seinen enz…)

Databits ‘D1’ ‘D2’ en ‘D3’ geven aan welke wisselspoel geactiveerd moet worden (indien ‘SS’=‘11’) Elk databit paar van ‘D1’,’D2’ en ‘D3’ heeft maar twee toestanden ‘00’ of ‘11’. Totaal zijn er zo 8 wisselspoelen aanstuurbaar, goed voor 4 wissels.

Databits ‘SS’ geeft aan of de wisselspoel geactiveerd moet worden: ‘SS’=’11’ of dat de wisselspoelen gedeactiveerd moeten worden: ‘SS’=’00’. Deze deactivering is voor al de 8 spoelen gelijktijdig. De deactivering optie gebruiken we niet zoals we verder zullen zien. (activeren=onder spanning brengen, deactiveren=spanning er terug af)

In totaal hebben we dus 18bits die het ‘MM-wissel data pakket’ vormen.
 

Serieel overdracht van het MM-wissel data pakket en foutdetectie:

Het MM-wissel data pakket wordt serieel (bit per bit na elkaar) doorgestuurd via de digitale treinvoeding (booster) of rechtstreeks uit de treincentrale, en wel in deze volgorde:

Eerst de twee bits van ‘A1’ dan de twee bits van ‘A2’ en zo verder tot en met de twee bits van ‘SS’. Dit data pakket van 18 bits wordt door de centrale 2 keer na elkaar doorgestuurd met een tussenpauze. De twee identieke data pakkets worden met elkaar vergeleken in de µcontroller om zo op een correcte dataoverdracht te kunnen testen. (foutdetectie)
 

Bitdetectie door µcontroller:

De 18bits zelf worden door de digitale centrale als volgt doorgestuurd:

Bit ‘0’ als een positieve puls van 13µs gevolgd door een pauze van 91µs. (totaal 104µs) Bit ‘1’ als een positieve puls van 91µs gevolgd door een pauze van 13µs. (totaal 104µs) Voor de duidelijkheid, bij een digitale voeding (booster) is een positieve puls = +15ŕ18V en een pauze = -15ŕ18V.

De verhouding puls/pauze nl. 1/7 (13/91) zijn overeenkomstig de specificaties Motorola encoder chip MC145026. Volgens sommige bronnen zijn er (trein)centrales die andere verhoudingen gebruiken. Het belangrijkste voor ons is wel dat de totale duur puls + pauze ongeveer 104µs blijft en dat er op tijdstip 52µs, nadat de puls opgekomen is, er een duidelijke positief signaal ofwel er een duidelijke pauze aanwezig is. Het is op dit tijdstip immers dat de µcontroller kijkt of de bit een ‘0’ of een ‘1’ is.

Of iets functioneler uitgelegd: (en te volgen op figuur hiernaast) op het moment dat er een positief signaal op MM-pin van de µcontroller komt, dan wacht de µcontroller 52µs. Na deze 52µs kijkt de µcontroller of er op MM-pin het signaal nog hoog is dan is het bit een logische ‘1’, of dat het signaal laag geworden is dan is het bit een logisch ‘0’. Het ingelezen bit wordt ingeschoven in een schuifregister van 18bits.

Als er nu rond 104µs, praktisch genomen voor 156µs, (zie verder) een nieuwe positieve puls komt, en dit 18 keer na elkaar, dan zijn deze 18bits een MM-wissel data pakket. Gebeurd dat één keer niet, dan is de data geen MM-wissel data pakket. Voor de volledigheid moet ik er wel bijvoegen dat een MM-‘relais’ data pakket, voor seinen enz…,  wel correct ingelezen wordt, maar niet door de MM-wissel decoder komt omdat het 5de paar binaire databits geen ‘00’ is maar ‘11’.

Nu moet er ook nog onderscheid gemaakt worden tussen databits van een MM-‘locomotief’, een DCC- of een Mfx data pakket. (kan bijvoorbeeld voorkomen bij multiprotocol centrales)

Die 156µs is niet zomaar gekozen, een MM-‘locomotief’ data pakket bestaat ook uit 18 bits, maar de tijden zijn dubbel zo lang nl. verhouding 26µs/182µs ‘0’ en verhouding 182µs/26µs ‘1’, of een totaal van 208µs. Daar moeten we dus ruim onder blijven. Voor de zekerheid nemen we het midden tussen 104µs en 208µs nl. 156µs. Met die 156µs hebben we wat speling naar boven en naar onder toe.

Het DCC formaat kent wel opeenvolgende pulsen die korter zijn dan 152µs nl. een logische ‘1’ = verhouding 58µs/58µs=116µs. Een logische ‘0’ is geen probleem nl. verhouding 100µs/100µs=200µs. Bij Mfx ligt het iets anders. Elke bit begint bij een ompoling van het digitale signaal. Dit kan van pauze naar puls zijn of andersom. Het belangrijkste is hetgeen de volgende 100µs gebeurd. Indien na 50µs er terug een ompoling is van het digitale signaal, dan is het bit een logische '1' (inclusief de resterende 50µs om zo tot 100µs te komen).  Gebeurd dat pas na 100µs, dan is het bit een logische '0'. Klinkt ingewikkeld, maar is het eigenlijk niet. 

Echter, de kans is zo goed als onbestaande dat deze data formaten (Mfx en DCC) twee maal dezelfde reeks van 18bits doorsturen, waarbij er dan nog tussen elk bit een tussentijd zit kleiner dan 152µs.
 

Praktische verwerking in de µcontroller:

De bit detectie door de µcontroller is volledig interrupt gestuurd. Met interrupt wordt bedoeld dat het normale programma verloop onderbroken wordt voor een kort interrupt program, vanaf nu ISR genoemd (Interrupt Service Routine). Het ISR kan opgeroepen worden als er bijvoorbeeld een ingangspin van toestand veranderd of dat er een timer afloopt. (om dat laatste eenvoudig uit te drukken)

Op het moment dat er op MM-pin een overgang is van laag naar hoog dan wordt het ISR opgeroepen. Het ISR start nu een timer dat afloopt over 52µs. Het ISR wacht niet tot de timer afloopt, maar zorgt er voor dat het normale programma verloop hervat wordt. Als nu de timer afloopt dan genereert deze timer ook een interrupt. Het ISR wordt terug opgeroepen en weet dat het interrupt afkomstig is van deze timer. Op dat moment leest het ISR de logische toestand ‘1’ of ‘0’ op de MM-pin en schuift dit door in een 18bit schuifregister. Ook houdt het ISR bij hoeveel bits er al ingelezen zijn. We moeten er 18 hebben! Het ISR start terug een timer maar nu voor 104µs (52µs+104µs=156µs, zie hoger)

Nu komt de truc, wie zal het volgende interrupt genereren? Wel nu, indien het MM-pin binnen die 104µs terug hoog wordt (dat zal normaal gezien al gebeuren rond 52µs), dan zal het ISR de 104µs timer stoppen en de 52µs timer weer opstarten. Eigenlijk wat hierboven al deels beschreven stond. Echter, loopt de 104µs timer af en genereert deze het interrupt, dan is de puls op MM-pin te laat. Nu weet het ISR dat het data pakket geen MM-wissel data pakket meer kan zijn. De teller die het aantal ingelezen  bits bijhoud wordt gereset.

Als er nu 18 bits foutloos ingelezen zijn, dan zal het ISR, na het lezen van het 18de bit er voor zorgen dat het 18bits schuifregister gekopieerd wordt in een andere 18bit register voor verwerking.  Aan het normale programma wordt duidelijk gemaakt, via een Flag, dat er een correct ingelezen MM-wissel data pakket staat te wachten.

Omdat er na deze 18bits van het MM-wissel data pakket een pauze komt >152µs, zal deze pauze er voor zorgen dat de bit teller gereset wordt. Het ISR kan opnieuw beginnen bits te tellen.

Het normale programma ziet dat de Flag geset is, en zal nu het gekopieerde MM-wissel data pakket vergelijken met het vorig foutloos ingelezen MM-wissel data pakket. Zijn ze gelijk, dan kan het programma dit data pakket gaan decoderen. Zijn ze niet gelijk dan is dat spijtig, het programma onthoudt nu dat laatste ingelezen data pakket om weer te kunnen vergelijken met een volgend foutloos in te lezen data pakket hopelijk op meer succes.

De verdere verwerking van het datapakket is vrij eenvoudig. Het programma kijkt eerst of het wel een MM-wisseldata pakket is: 5de paar databits  =‘00’. Dan kijkt het programma of het wel gaat over activeren van wissels: ‘SS’=‘11’. Daarna pas gaat het programma na of de 4 paar adresbits ‘A1’, ‘A2’, ‘A3’ en ‘A4’ dat samen een 8bits adresbyte vormt, wel voorkomt in een lijst zoals geprogrammeerd in de EEPROM van de µcontroller (zie voor byte tabel hieronder. Komt adresbyte voor in de lijst van 4 mogelijke wisseladressen, dan zal het programma aan de hand van ‘D1’, ‘D2’ en ‘D3’ een Flip-Flop Setten of Resetten. En dit volgens volgende werkwijze: ‘D2’ en ‘D3’ vormen het nummer van betreffende wissel:

‘D2’=’00’ en ‘D3’=’00’= eerste wissel;                     ‘D2’=’11’ en ‘D3’=’00’= tweede wissel

‘D2’=’00’ enD3’=’11’= derde wissel;                     ‘D2’=’11’ en ‘D3’=’11’= vierde wissel

‘D1’ is de toestand van de Flip-Flop ‘D1’=‘00’ dan Reset de Flip Flop, ‘D1’=‘11’ dan Set de Flip-Flop. Het deactiveren van de wissels ‘SS’=’00’ is niet nodig want de Flip-Flop blijft Geset of Gereset. In totaal hebben we zo 16 Flip-Flop’s, één voor elke servo. Elke Flip-Flop geeft nu de gewenste toestand aan van de wissel. Het servo stuurprogramma gaat er nu voor zorgen dat deze wens uitkomt.


 

Servo stuurprogramma:

Het servo stuurprogram, wat eigenlijk het normale programmaverloop regelt, zal aan de hand van de inhoud van de Flip Flop de servo aansturen en wel op volgende wijze:

Per servo hoort een 1 byte timer (1 byte kan een waarde bevatten tussen 0-255) die de pulsbreedte bijhoud, vanaf nu pulsduur timer genoemd. De waarde van de pulsduur timer moet je delen met 100 om de werkelijke pulsbreedte te bekomen in ms. Bijvoorbeeld de middenstand van de servo heeft een pulsbreedte van 1,5ms wat overeenkomt met een waarde van 150 in de pulsduur timer. Deze timer kan variëren tussen een minimum pulsbreedte van 50 (0,5ms) en een maximum pulsbreedte van 250 (2,5ms). Er zijn zo in totaal 16 pulsduur timers, eentje voor elke servo.

De logische toestand van de Flip-Flop nl. ‘0’ geeft aan dat de pulsen korter moeten zijn dan 1,5ms, en ‘1’ dat de pulsen langer moet zijn dan 1,5ms.

De 16 servo’s wordt aangestuurd met elk hun eigen uitgangspin op de µcontroler. Op deze uitgangspinnen komen de positieve pulsen te staan.

Bij elke servo horen ook 2 eindeloopcontacten. Deze beide eindeloopcontacten worden onderling verbonden en  via een ingangspin ingelezen door de µcontroller. Het enige wat hier van belang is dat op de middenstand van de servo nl. bij 1,5ms pulsbreedte, geen van de beide eindeloopcontacten contact mag maken met aan de massa verbonden meetpen. (zie schema)

Wel nu, als de Flip Flop gereset is dan kijkt het servo stuurprogram naar de waarde van de pulsduur timer. Is deze hoger dan 150, dan zal de pulsduur timer verminderd moeten worden. Eerst verminderen tot 150 zonder rekening te houden met toestand van de eindeloopcontact. Als de waarde van de timer lager is dan 150, dan houd het servo stuurprogramma wel rekening met de toestand van het eindeloopcontact. Op het moment dat het eindeloopcontact laag wordt (aan massa) dan stopt het verminderen van de pulsduur timer. Ook het uitsturen van pulsen naar de servo stopt nu. Ook handig om weten is dat als het eindeloopcontact niet wordt bereikt (een probleempje?) de pulsen ook stoppen als de pulsduur timer waarde 50 heeft bereikt.  Het zelfde principe geld ook indien de Flip Flop geset wordt, maar nu wordt de pulsduur timer verhoogd totdat het eindeloopcontact bereikt wordt. Ook nu weer geen rekening houden met eindeloopcontact bij waarde pulsduur timer lager dan 150 en ook stoppen met pulsen uit te sturen bij 250.

Het verhogen of verlagen van de pulsduur timer per servo gebeurd niet direct achter elkaar, maar cyclisch om de 20ms (50Hz) telkens eentje hoger respectievelijk lager. Zo zal de timer in het uiterste geval van 50 naar 250 (en andersom) er 4s over doen.( (250-50)X20ms=4000ms=4s  )

Nu moet de puls nog op een uitgangspin van de µcontroller komen. Praktisch gebeurd dat zo:  Weer cyclisch om de 20ms zal het stuurprogramma servo per servo het volgende uitvoeren: Indien er een puls op de uitgang moet komen,  de bijbehorende pin hoog (+5V) maken en een timer starten met een waarde die overeenkomt met de waarde van de pulsduur timer. Deze timer is ook interrupt gestuurd,  zodat  het programma ondertussen andere taken kan uitvoeren.

Als de timer afloopt en het ISR oproept, dan zal het ISR al de 16 uitgangen gelijktijdig laag maken ook al is er maar één uitgang hoog. Het kost anders het ISR te veel tijd (lees klokcycli) om uit te zoeken welke pin van de 16 er hoog is. Alle pinnen gelijktijdig laag maken kan het ISR via 2 instructies. Waarom is een zo kort mogelijk ISR programma zo belangrijk? Omdat tijdens het uitvoeren van het ISR al de eventuele andere opkomende interrupts in een wachtrij komen te staan. Zo ook het MM-pin interrupt en de timer interrupt die  hier bij hoort. Je voelt het al aankomen, we moeten er voor zorgen dat de wachttijd van 52µs niet te groot kan worden. Het starten van die 52µs timer kan immers vertraging oplopen doordat het MM-pin interrupt moet wachten. Maar ook de 52µs timer interrupt kan vertraging oplopen.  Er zijn ook andere nog niet beschreven interrupts, zoals we verder zullen zien, die ook nog zouden kunnen voorkruipen…

Als het ISR de uitgangen laag heeft gemaakt, dan zal ook nu een flag geset worden dat aangeeft dat de servopuls voorbij is. Nu weet het servo stuurprogramma aan de hand van deze flag dat eventueel een volgende servo aangestuurd mag worden. Weer op dezelfde manier: de desbetreffende pin hoog maken; timer starten met waarde = inhoud pulsduur timer enz…

In de veronderstelling dat al de 16 servo’s gelijktijdig aangestuurd worden naar een hogere pulstijd nl. richting 2,5ms, dan komen we niet toe met de 20ms cyclustijd! In het uiterste geval duurt het aansturen van de 16 servo’s 16X2,5ms = 40ms. Om deze reden zal het servo stuurprogramma maar 8 servo’s gelijktijdig aansturen (max = 20ms). Pas als er een servo een eindeloopcontact heeft bereikt en geen pulsen meer uitstuurt, kan een andere 8ste servo naar zijn gewenste stand gestuurd worden. Komt zelden voor natuurlijk dat al de 16 servo’s gelijktijdig worden aangestuurd. Dit komt wel voor bij de geprogrammeerde zelftest en op verzoek alle servo’s naar de middenstand. (16X1.5ms = 24ms)

De volgende figuur geeft als voorbeeld het pulsverloop weer op uitgang servo 1 tot 8. Alle uitgangen worden binnen de 20ms één voor één aangestuurd behalve uitgang 4. Deze heeft zijn eindeloop al bereikt. Je ziet dat indien alle 16 servo’s moesten aangestuurd worden we in de problemen komen met de 20ms.

Waarom is er hier gekozen om servopuls na servopuls door te sturen? Zo wordt de 5V servovoeding gespreid belast. Immers op het einde van de servopuls zal de servomotor pas aangestuurd worden. (zie analoge wisselsturing voor iets meer uitleg werking servo’s)

Nog een woordje over de 20ms cyclustijd. Ook deze is interrupt gestuurd. Ook hier zal het ISR een flag zetten zodat het servo stuurprogramma weet dat het terug mag beginnen met pulsen uit te sturen, indien nodig.
 

De extra’s

Ben ik nog aan het testen en schrijven…
 

Praktische uitwerking op componentenniveau:

Ook nu weer, je hoeft geen tijd te steken in het ontwerpen van een printje. Een stukje gaatjesprint met koperbanen is al voldoende zie schema:

Wat hebben we nodig: een PIC µcontroller 16F887; één SIL weerstandsnetwerk van 10x10kOhm, deze bestaat maar ik had er enkel van 9x10kOhm liggen, vandaar is het tiende weerstandje gewoon een losse van 10kOhm. Een (ontstoor)condensator van 100nF. Een weerstand van 22kOhm om de MM-pin te verbinden met het digitale signaal. Gebruik best ook een 40pins IC voetje. Voor zij die het schema al bekeken hebben, ‘Contact Servo 9’ t.e.m. ‘Contact Servo 14’ hebben geen 10kOhm weerstandje t.o.v. +5V. Sommige IC-pinnen van de PIC 16F887 hebben dat al ingebouwd, spijtig voor ons niet allemaal.

Wat kost zoiets?

Bij digikey kost een PIC 16F887 2,15 US$. Als je voldoende er van besteld nog minder. Laten we zeggen met gedeelte verzendkosten BTW enz… 3€. De overige componenten (R, SIL, C en IC-voet) 1€. Een stukje gaatjesprint 1€. Gebruiken we de optie S88N dan komt er een RJ45 connector bij van pakweg 1€. Totaal 6€ of 0,375€ per wissel. Dit is wel de prijs zonder aansluit connectoren; 5V servovoeding; bekabeling; mechanische bevestigingsonderdelen; staaf; enz…  De servo zelf kost 2€ met verzendkosten kwam dat voor mij op 2,25€ voor een heel zakje servo’s. Samen komt dat op 2,63€ per servo wisselaansturing.
 

Assembler program:  servosturingMM_v1p2.asm (versie 9/12/2011)

 Reeds praktisch getest:

-Zelftest ŕ OK

-MM-wissel decoder getest met MR-direct op een PC. De 16 wissel zijn goed aanstuurbaar. (wissel 1 tot 16 getest) Wissel 16 doet soms nog wat moeilijk. Reden?, zal wel iets stoms zijn zoals gewoonlijk…

-Werking eindeloopcontacten.

-Inschakelvertraging ŕ OK

-Middenstand alle servo’s: wisselnummer 253 ŕ OK

 

Nog niet getest:

-PS88N terugmelding

-Zelftest eindeloopcontacten op PS88N bus: wisselnummer 254

 

! Omwille van overschakelen naar LocoNet protocol wordt tijdelijk deze webpagina niet meer geüpdate.