Nog een servoschakeling met een µC

Gestart door Geert, 17 april 2014, 16:44:26 PM

Geert

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.




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.




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)




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.




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.




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.




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.  ;)





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


Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet 16 poorten ingangen/uitgangen

dani

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.

De kruik is te water gegaan...
De kruik is niet meer.

gardevil

Als liefde blind is, waarom is lingerie dan zo belangrijk?

Steam.N

Geert, super interessant !!!
Dit ga ik zéér aandachtig volgen !
Bedankt voor de duidelijke en gestructureerde uitleg.
Knutselgroeten !  Jean       TP-I (B) & TP-II (DR) - N - DC - Handbediening - Zelfbouw  { Sedelocus - De Feniks - Pira-N's Crossing - Turnhout NEEB - Scrap Yard }

PeterC

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 projectje bezig.  Alleen (ge)(ver)bruik ik 16 keer zoveel flash, 16 keer zoveel RAM en 24 poten meer aan de chip  ;)

Knap werk!

Groetjes, Peter


Gerolf

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.
Groeten uit "Marche-en-Bières"   ** Modelspoor is plezant **   TPIII-H0-DC-Zelfbouw

Gerolf

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)
Groeten uit "Marche-en-Bières"   ** Modelspoor is plezant **   TPIII-H0-DC-Zelfbouw

Steam.N

heb jij die voor Elektor geschreven ? ? ?
Knutselgroeten !  Jean       TP-I (B) & TP-II (DR) - N - DC - Handbediening - Zelfbouw  { Sedelocus - De Feniks - Pira-N's Crossing - Turnhout NEEB - Scrap Yard }

Gerolf

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  ::)
Groeten uit "Marche-en-Bières"   ** Modelspoor is plezant **   TPIII-H0-DC-Zelfbouw

conducteur

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  ::)
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Geert

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.






Geert
Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet 16 poorten ingangen/uitgangen

conducteur

Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Geert

#12
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
Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet 16 poorten ingangen/uitgangen

conducteur

Ik denk dat ik dat ergens ga opschrijven  8)
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum