Een eenvoudig te bedienen servo-driver met behulp van microcontroller technologie:
Met deze geprogrammeerde PIC microcontroller (µC) zijn diverse servo schakelingen mogelijk:
Schakeling 1:
Dit is de eenvoudigste schakeling. Door schakelaar 1 (S1) te openen of sluiten kan je de servo van stand veranderen. Dit zijn de twee uiterste standen die je met een standaard servo kan bereiken. Met standaard servo bedoel ik servo's die werken met servopulsen tussen 1ms en 2ms. (Servopulsen zijn referentiepulsen gestuurd naar de servo waarbij, afhankelijk van de tijdsduur ervan, de inwendige servo elektronica weet naar welke hoekstand deze moet draaien) Deze schakeling schakelt tussen deze 2 uiterste waarden van servopulsen en doet dit met een overgang die ongeveer 1s duurt. Vermits de schakeling om de 20ms (50Hz) servopulsen stuurt zal de overgang van 1ms naar 2ms in 1s in 50 stappen gaan namelijk: 1ms ; 1,02ms ; 1,04ms ... 1,98ms en 2ms. Na het bereiken van de uiterste stand zullen de servopulsen stoppen na 1s.
(https://lh6.googleusercontent.com/-wySIy88PVKk/U0_jlLgZolI/AAAAAAAAAHc/Zy1rFDGbt1o/w517-h478-no/servoschakeling1.png)
Schakeling 2:
Zet je op ingangen 6 en 7 van de µC twee potmeters P1 en P2 (variabele weerstand of ook trimmer genoemd) dan kan je hiermee de 2 uiterste standen instellen op een andere waarde. Op elke potmeters kan je voor het gemak een schaal plakken die gaat van 1ms tot 2ms. Als S1 gesloten is, dan zal de schakeling servopulsen uitsturen die overeenkomen met de waarde van P1. Is S1 openen, dan zal de schakeling servopulsen uitsturen die overeenkomen met de waarde van P2. De overgang van de twee ingestelde standen gaat weer elke 20ms met stapjes van 0,02ms. Bijvoorbeeld P1= 1,3ms en P2=1,6ms dan zal dit in stapjes gaan van 1,30ms ; 1,32ms ... 1,58ms en 1,60ms. (tijd van 1,30ms 1,60ms duurt 0,3s) Door P1 een hogere waarde te geven dan P2 kan je de servo van richting doen veranderen bij het openen of sluiten van S1.
Bij het inregelen van P1 (S1 toe) of P2 (S1 open) zal de schakeling pulsen beginnen uitsturen waarbij de servo de instelling volgt. Dit is handig om de servostand in te stellen naar zijn gewenste eindposities. Als er na 1s geen verandering is in de stand van één van de twee potmeters, dan zullen de servopulsen stoppen.
(https://lh4.googleusercontent.com/-afC_-QsBnlI/U0_jlDK4QhI/AAAAAAAAAHk/GD_pCHeBRSM/w519-h486-no/servoschakeling2.png)
Schakeling 3:
Deze schakeling zal de waarde van P1 volgen. Inregelbaar tussen 1ms en 2ms servopulsen. We gebruiken hiervoor best een potmeter met een draaiknop op. Zodat je geen schroevendraaier of ander hulpstuk nodig hebt om de potmeter te verdraaien. Ook nu weer, als er geen verandering is van P1, zal na 1s de schakeling stoppen met uitsturen van pulsen. (die extra pulsen gedurende 1s is bij elke schakeling zo, en zal ik niet blijven herhalen)
(https://lh3.googleusercontent.com/-mLWb92RklpE/U0_jlFeT9TI/AAAAAAAAAHg/ZWBd3RZKbn8/w515-h475-no/servoschakeling3.png)
Schakeling 4:
Met deze schakeling werken we niet met een schakelaar (S1), maar met twee drukknoppen D1 en D2. Als D1 even wordt ingedrukt, dan zal de servo draaien naar de gewenste instelling van P1. Als D2 even wordt ingedrukt, dan zal de servo draaien naar de gewenste instelling van P2. Drukknop D1 heeft altijd voorrang op D2 indien deze tegelijkertijd worden ingedrukt.
(https://lh4.googleusercontent.com/-kWuZWMp0LRc/U0_jmeC6eAI/AAAAAAAAAH0/y8XkTj5XVDc/w518-h482-no/servoschakeling4.png)
Schakeling 5:
Bij deze schakeling voegen we en extra potmeter P3 toe. Met P3 kunnen we de omlooptijd van de servo instellen. (omlooptijd is tijd die de servo er over doet om van de ene stand naar de andere stand te gaan) Voor het gemak kunnen we op P3 een schaal plakken van 1s tot 30s. Deze schaal komt overeen met de tijd die de servo er zal overdoen indien de servo van 1ms pulsen naar 2ms moet overgaan. De instelling die we doen met P3 is niet direct merkbaar als D1 of D2 niet ingedrukt wordt. Pas als we de servo laten overgaan naar een ander stand (via D1 of D2) kunnen we het effect zien. Het is belangrijk om weten dat de maximum omlooptijd van 30s enkel geld als de servo overgaat van 1ms naar 2ms pulsen (of andersom). Bij een ingestelde overgang van bijvoorbeeld 1,30ms naar 1,60ms pulsen zal de maximale omlooptijd 3/10 van 30s zijn!
De omlooptijd, via potmeter P3, kan uiteraard ook gecombineerd worden met schakeling 1, 2 en 4.
(https://lh5.googleusercontent.com/-sGPvWFjWcno/U0_jmRqUU2I/AAAAAAAAAH4/p1pi0_D-Vbw/w600-h476-no/servoschakeling5.png)
Schakeling 6:
Deze schakeling is afgeleid van schakeling 5. Nu zijn de drukknoppen vervangen door massadetectie M1 en M2 aan een drierail spoor. (kan ook bij tweerail via o.a. reed-contacten te schakelen naar massa) Het zijn nu de geleidende wielen van een loc of wagon die een verbinding maken met de massa om de schakeling te bedienen. Let op dat de massa van de schakeling moet verbonden worden met de bruine draad van de voeding uit de centrale. (of regelbare transformator bij AC analoog locs) Via deze opstelling kan je bijvoorbeeld wissels omzetten, slagbomen bedienen enz... De twee extra weerstanden van 1kOhm zijn bedoeld om de schakeling te beschermen tegen te hoge spanningen bij eventueel ontsporing bij M1 of M2.
(https://lh4.googleusercontent.com/-qm-iwNt3ICw/U0_jmSVCaMI/AAAAAAAAAH8/kAI8X1i4CRY/w667-h500-no/servoschakeling6.png)
Code:
;************************************************************************
;* Eenvoudige servosturing waarbij bereik en omlooptijd instelbaar zijn *
;* Geschreven door Geert Giebens *
;* *
;* Versie: Servo12F683_V1.1 PIC: 12F683 *
;* Filenaam: servosturing met PIC12F683 Datum: 17/apr/2014 *
;* *
;* *
;* ____________ *
;* +5V 1| * * |8 Massa *
;* Servopuls 2| GP5 ** GP0 |7 Potentiometer 1 (ICSPDAT) *
;* IN2 3| GP4 GP1 |6 Potentiometer 2 (ICSPCLK) *
;* (Vpp) IN1 4| GP3 GP2 |5 Potentiometer 3 *
;* ____________ *
;* *
;************************************************************************
LIST P=12F683
#INCLUDE "P12F683.INC"
ERRORLEVEL -302
__CONFIG _FCMEN_ON & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _IESO_OFF & _CP_OFF & _BOD_ON & _INTRC_OSC_NOCLKOUT
#DEFINE POT1 GPIO,GP0
#DEFINE POT2 GPIO,GP1
#DEFINE POT3 GPIO,GP2
#DEFINE IN2 GPIO,GP3
#DEFINE IN1 GPIO,GP4
#DEFINE SERVOPULS GPIO,GP5
#DEFINE RICHTING FLAG1,0
#DEFINE START1 FLAG2,0 ;1s na opstart niets doen
#DEFINE EENSEC FLAG2,1 ;na 1s, 1s servopulsen uitsturen
#DEFINE V_RICHTING FLAG2,2 ;waarde vorige richting voor opslag EEPROM
;Variabelen
cblock 0x20
FLAG1
FLAG2
SERVOWAARDE ;houd stand servo bij 0=1ms 250=2ms
WENSPULS ;gewenste stand servo
WPOT1 ;waarde potentiometer 1
WPOT2 ;waarde potentiometer 2
WPOT3 ;waarde potentiometer 3
ADTEL ;gebruikt bij AD convertor sub programma
TEL5 ;basisprogram werkt op 250Hz, servo stuurt elke 50Hz een puls uit. Deze teller telt tot 5 om tot 50Hz te komen
STARTTEL1 ;de eerste seconde na opstart geen pulsen uitsturen
SECTEL ;na de eerste seconde na opstart worden er 1 seconde pulsen uitgestuurd en bij het bereiken gewenste positie
VERTRAGINGTEL ;gebruikt bij vertraging overgang
endc
;***************** START ASSEMBLER PROGRAM ****************
ORG 0x0000
GOTO MAIN
;******************** LEES WAARDE POTMETERS ***************
LEESPOTMETER DECFSZ ADTEL,F
GOTO $+3
MOVLW 6
MOVWF ADTEL
MOVF ADTEL,W
ADDWF PCL,F
NOP
GOTO READPOT3
GOTO START_ADC
GOTO READPOT2
GOTO START_ADC
GOTO READPOT1
GOTO START_ADC
READPOT1 MOVF ADRESH,W
MOVWF WPOT1
BTFSC STATUS,Z ;geen nul voor waarde POT1
INCF WPOT1,F
MOVLW b'00000101' ;zet poort AN1 open
MOVWF ADCON0
RETURN
READPOT2 MOVF ADRESH,W
MOVWF WPOT2
BTFSC STATUS,Z ;geen nul voor waarde POT2
INCF WPOT2,F
MOVLW b'00001001' ;zet poort AN2 open
MOVWF ADCON0
RETURN
READPOT3 MOVF ADRESH,W
MOVWF WPOT3
BCF STATUS,C
RRF WPOT3,F
BCF STATUS,C
RRF WPOT3,F
BCF STATUS,C
RRF WPOT3,F
BTFSC STATUS,Z ;geen nul voor waarde POT3
INCF WPOT3,F
MOVLW b'00000001' ;zet poort AN0 open
MOVWF ADCON0
RETURN
START_ADC BSF ADCON0,GO
RETURN
;******************** SERVO ****************************
SERVO BTFSS START1 ; de eerste seconde na opstart µC niets doen
GOTO SERVO_SPR0
DECFSZ STARTTEL1,f
RETURN
BCF START1
SERVO_SPR0 MOVF WENSPULS,W ;is gewenste puls = huidige puls dan nog één seconde pulsen blijven doorsturen
XORWF SERVOWAARDE,w
BTFSS STATUS,Z
GOTO SERVO_SPR2
BTFSS EENSEC ;één extra seconde pulsen voorbij?
RETURN
DECFSZ SECTEL,F
GOTO SERVO_SPR1
BCF EENSEC
RETURN
SERVO_SPR2 movlw .250 ;is de gewenste puls niet gelijk aan huidige puls dan reset één seconde teller
movwf SECTEL
bsf EENSEC
INCF VERTRAGINGTEL,F ;ga na of pulstijd aangepast moet worden
MOVF WPOT3,W ;rekening houdend met vertraging
SUBWF VERTRAGINGTEL,W
BTFSS STATUS,C
GOTO SERVO_SPR1
CLRF VERTRAGINGTEL
BCF STATUS,C ;pas servowaarde aan richting wenswaarde
MOVF WENSPULS,W
SUBWF SERVOWAARDE,w
BTFSC STATUS,C
GOTO $+3
INCF SERVOWAARDE,F
GOTO $+2
DECF SERVOWAARDE,F
SERVO_SPR1 DECFSZ TEL5,F ;wacht tot 5 keer 1/250s voorbij is = 1/50s
RETURN
MOVLW 5
MOVWF TEL5
BSF SERVOPULS ;uitgang servopuls hoog
banksel PR2 ;eerst een vaste puls van 1µs
MOVLW .250
MOVWF PR2
banksel T2CON
BSF T2CON,TMR2ON
BTFSS PIR1, TMR2IF
GOTO $-1
BCF T2CON,TMR2ON
BCF PIR1,TMR2IF
MOVF SERVOWAARDE,W
banksel PR2 ;dan variabele puls 0-1ms
MOVWF PR2
banksel T2CON
BSF T2CON,TMR2ON
BTFSS PIR1, TMR2IF
GOTO $-1
BCF T2CON,TMR2ON
BCF PIR1,TMR2IF
BCF SERVOPULS ;uitgang terug laag
RETURN
;********************* RICHTING ***********************
LEESRICHTING BTFSS START1 ;bij opstart servowaarde= waarde potmeter (richting)
GOTO INTEST
BTFSC RICHTING
GOTO $+4
MOVF WPOT1,W
MOVWF SERVOWAARDE
GOTO INTEST
MOVF WPOT2,W
MOVWF SERVOWAARDE
INTEST BTFSS IN2 ;ga na of er een ingang IN1of IN2 actief is en verander eventueel richting
BCF RICHTING
BTFSS IN1
BSF RICHTING
POT BTFSC RICHTING ;afhankelijk van richting waarde pot1 of pot2 opslaan in wenspuls
goto $+4
MOVF WPOT1,W
MOVWF WENSPULS
GOTO OPSLAAN
MOVF WPOT2,W
MOVWF WENSPULS
OPSLAAN BTFSS RICHTING ;ga na of richting veranderd is, en sla op in EEPROM
GOTO $+6
BTFSS V_RICHTING
GOTO $+2
RETURN
BSF V_RICHTING
GOTO $+5
BTFSC V_RICHTING
GOTO $+2
RETURN
BCF V_RICHTING
MOVF FLAG1,W
banksel EECON1 ;nieuwe richting opslaan in EEPROM
MOVWF EEDAT
MOVLW LOW FLAG1
MOVWF EEADR
BSF EECON1,WREN
BCF INTCON,GIE
BTFSC INTCON,GIE
GOTO $-2
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
BSF INTCON,GIE
banksel 0
RETURN
;***************** INIT ***********************************
INIT
;**********INIT µC ********************************
BCF STATUS,IRP
banksel OSCCON
BSF OSCCON,4 ;van 4 naar 8MHz interne clock
BSF OSCCON,SCS
banksel ANSEL
BCF ANSEL,ANS3 ;GP0,GP1 en GP2 blijven analoge inputs
banksel TRISIO
MOVLW b'00011111' ;enkel GP5 is uitgang
MOVWF TRISIO
;************ INIT A/D convertor ****************
banksel ANSEL
BSF ANSEL,ADCS1 ;convertie snelheid
banksel ADCON0
BSF ADCON0,ADON
;********* INIT TIMER0 ***************************
banksel OPTION_REG
movf OPTION_REG,w ;voor opwekking 250Hz periode
andlw b'11000000'
iorlw b'00000100'
;--0----- TOCS =0 (timer0 in timer mode)
;----0--- PSA=0 (prescaler voor timer0)
;-----100 prescaler=32
movwf OPTION_REG
;********** INIT TIMER2 **************************
banksel T2CON
movlw b'00001001' ;gebruikt voor opwekking servopulsen
;------01 prescaler=4 =2µs
;-0001--- postscaler=1/2
movwf T2CON
;*********** INIT VARIABELEN ********************
banksel EEADR
MOVLW LOW FLAG1
MOVWF EEADR ;Data Memory
banksel EECON1
BSF EECON1, RD ;EE Read
banksel EEDAT
MOVF EEDAT, W ;data naar FLAG1
banksel FLAG1
MOVWF FLAG1
BSF START1
MOVLW .250
MOVWF STARTTEL1
BSF EENSEC ;bij onder spanning brengen schakeling na 1s, 1s pulsen uitsturen
MOVLW .250
MOVWF SECTEL
MOVLW .6
MOVWF ADTEL
MOVLW .5
MOVWF TEL5
RETURN
;******************** MAIN ******************************
MAIN CALL INIT
LUS BTFSS INTCON,T0IF ;wacht tot 1/250s voorbij is
GOTO $-1
BCF INTCON,T0IF
MOVLW 5
MOVWF TMR0
CALL LEESPOTMETER
CALL LEESRICHTING
CALL SERVO
GOTO LUS
END
Later meer hierover met een eenvoudig printje. ;)
(https://lh4.googleusercontent.com/-YwRPt0S2n6c/U0_jnVlnopI/AAAAAAAAAIE/7ErVtpezkYo/w658-h387-no/servoschakelingschema.png)
Eigenschappen bovenstaande schakeling:
Stuurt één servo's aan waarbij de uiterste standen instelbaar zijn met potmeters.
De omlooptijd, de tijd nodig om van positie te veranderen, is instelbaar met een potmeter tussen 1s minimum tot 30s maximum.
Bij het bereiken van de positie stopt ook het uitsturen van de servopulsen. Door de mechanische eigenschappen van de servo blijft deze vast in die positie staan. (indien de belasting beperkt is)
Hiermee voorkom je dat de servo:
- lichtjes blijft zoemen (jitter)
- deze sneller mechanisch slijt
- stroom verbruik.
Voor de voeding van deze schakeling kan zowel gelijkstroom of wisselspanning gebruikt worden 8-20V.
Bij het onder spanning zetten van deze schakeling 'kan' het voorkomen dat de servo iets beweegt, ook al stuurt de schakeling nog geen servopulsen uit. Bij gebruik als aansturing van een wisseltong via gebruik van massadetectie of drukknoppen, kan dit wel eens gevaarlijk zijn! Daarom zal de schakeling na één seconde, als deze onder spanning is gekomen, gedurende één seconde servopulsen uitsturen die overeenkomen met de laatste toestand waarin de servo zich bevond voordat de schakeling spanningsloos werd gezet (opgeslagen in interne EEPROM).
Geert
Dit is zo een artikel waar een mens iets aan heeft !
Beginnen met de basis, en dan uitbreiden naar een super duper schakeling. Me Like Very Much.
En alle "tussenstappen" zijn ook bruikbaar naargelang de wensen van de gebruiker. Bedankt om dit te delen !
Volgens wat ik daar zie kan je de PIC 12F683 in principe makkelijk vervangen door een ATTiny85 (en dan uiteraard ook de programmacode navenant schrijven) en blijft het werkingsprincipe helemaal hetzelfde.
En dan is de volgende (logische ?) stap het aan breien van een DCC detectie circuitje (3 weerstandjes, 1 1N1418 diode en een 6N137), het toevoegen van een DCC library in je code, en je hebt een heuse "manueel" instelbare en DCC bediende servo.
Ik volg !
Geert, super interessant !!!
Dit ga ik zéér aandachtig volgen !
Bedankt voor de duidelijke en gestructureerde uitleg.
Geert, knap om zoveel in zo'n 'kleintje' onder te brengen. Je volhard met assembler? Ook de enige manier om het uiterste uit de controller te halen.
Ik ben met een gelijkaardig (http://forum.modelspoormagazine.be/index.php/topic,14127.msg254401.html#msg254401) projectje bezig. Alleen (ge)(ver)bruik ik 16 keer zoveel flash, 16 keer zoveel RAM en 24 poten meer aan de chip ;)
Knap werk!
1 (kleine) microcontroller per servo is zeker interessant, vooral voor "afgelegen" wissels.
Ik heb gekozen voor vier regelaars per print, maar moet hier en daar (lange) verlengkabeltjes gebruiken.
Net de nieuwe Elektor aangekregen (mei '14) - en wat staat er in?
inderdaad: Microcontroller-Servosturing (voor 2 servo's)
met AtMega8 (en aan te sluiten "regelkastje" met LCD en enkele knoppen)
heb jij die voor Elektor geschreven ? ? ?
Nee, maar ik ga het artikel wel eens speciaal-grondig lezen.
Het is geschreven door een modelspoorder - en ik ben benieuwd hoeveel ideeën er inzitten - en hoeveel dingen die mij bekend voorkomen ::)
Hier ook servo-perikelen. Had een potmeter op m'n printje gezet en maar zitten zoeken waarom die adc niet werkt. Na nog eens goed de (licht) verwarrende datasheet te hebben gelezen : geen ADC ::)
Citaat van: dani op 17 april 2014, 16:53:02 PM
En dan is de volgende (logische ?) stap het aan breien van een DCC detectie circuitje (3 weerstandjes, 1 1N1418 diode en een 6N137), het toevoegen van een DCC library in je code, en je hebt een heuse "manueel" instelbare en DCC bediende servo.
Bijna Dani,
DCC gestuurde servo. Geen instellingen van adressen (gaat via een simpel trucje), geen moeilijke toestanden om het bereik van de servo's in te stellen, voeding uit de digitale booster, en nog wat meer. De bedoeling is dat dit gebruiksvriendelijk is voor elke modelspoorbouwer.
Het ontwerp is zodanig dat je er ook een relais op kan plaatsen voor puntstuk polarisatie . De code, printontwerp en wat meer uitleg volgt.
(https://lh5.googleusercontent.com/-AS3_bXHsQXk/VAdml3_zyDI/AAAAAAAAAUQ/FRRiDKTZBLM/w460-h361-no/foto%2B2%2Bservo%2Bdcc.png)
(https://lh6.googleusercontent.com/-jAblG60tmt8/VAdm6yAAe-I/AAAAAAAAAU0/TdGRI6DKfVg/w392-h381-no/foto%2B1%2Bservo%2Bdcc.png)
Geert
...geen instelling van adres, leg uit?
Citaat van: conducteur op 03 september 2014, 21:31:56 PM
...geen instelling van adres, leg uit?
onder de connector van de servo zie je twee connector pinnen. Zet je daar een brugje op, dan zal de eerstvolgende adres van de DCC opdracht om bv. een wissel om te zetten, opgeslagen worden in de EEPROM. Haal je het brugje weg dan zal de schakeling voor minstens 50 jaar (de garantie die je krijgt op de EEPROM van PIC µC) blijven reageren op het DCC adres van die bepaalde wissel.
EDIT: als je dat brugje er terug opzet kan je de schakeling laten reageren op een ander adres. En elk adres kan 4 wissels bedienen. Ook dit is geen probleem, de software is daar op voorzien dat je 4 van zulke schakelingen kunt aansturen op dat adres ;)
Geert
Ik denk dat ik dat ergens ga opschrijven 8)