Werken met stappenmotoren

Gepost door Jeroen Vreuls op zondag 18 oktober 2015 16:08

Unipolaire stappenmotor driver

Ik ga nog wat voorbeelden geven van zelf gemaakte besturingen voor stappenmotoren. Hieronder, zoals beloofd, het schema voor een unipolaire stappenmotor driver.

Schema unipolaire stappenmotor driverSchema unipolaire stappenmotor driver

Er wordt gebruik gemaakt van een L297, dit IC verzorgt de stapvolgorde voor de stappenmotor. Op de clock ingang van de L297 wordt een signaal gezet voor de stappen en de stapfrequentie. Met de ingang CW en CCW kun je de draairichting van de stappenmotor bepalen. Met de ingang RUN en HOLD wordt de stroom door de spoelen van de stappenmotor geregeld. Er zit standaard een functie op de L297 die de stroom regelt, maar dat vind ik bij wat grotere stappenmotoren niet echt goed werken. Vandaar dat er een extra microcontroller bij staat om de stroom te regelen.

Ik had het in het begin over een RCD combinatie (een weerstand, condensator en een diode). Zoals je kan zien in het schema is dat hier toegepast. Over iedere spoel staat zo'n combinatie, dit is gedaan om de inductie die de spoelen opwekken tijdens het draaien te dempen. Ter beveiliging van de IRF540 MOSFET's zijn er ook nog zenerdiodes aangebracht, deze staan over de drain-source overgang en over de gate-source overgang.

Via een 4081 (AND poort) worden de signalen van de L297 door gegeven aan twee gate drivers (IR4427). Deze drivers sturen via weerstanden de gates van de MOSFET's aan, op deze manier komt er 12 VDC (als de schakeling met 12 VDC gevoed wordt) op de gates te staan. Op deze manier worden de MOSFET's goed open gestuurd.

Zoals je kan zien staan er nogal wat elco's in het schema van niet al te grote waarde, dit is gedaan omdat er gebruik gemaakt wordt van een zogenaamd ruimte besparend koellichaam. Er staan namelijk verschillende elco's onder het koellichaam, en die konden niet te groot zijn anders paste het niet. Dus vandaar de wat kleinere waardes van de elco's.

Op de punten A, B, C en D worden de spoelen van de stappenmotor aangesloten. Aan de bovenkant zie je de twee plus aansluitingen voor de spoelen. De spanningsregelaar (78S05) verzorgt de 5 VDC voor de PIC12F683, de L297, en de 4081. De 78S05 en de IRF540 MOSFET's zijn op het koellichaam gemonteerd met veren die je in het koellichaam kan drukken. Op deze manier worden de componenten continue tegen het koellichaam gedrukt voor een goede warmteoverdracht. Er zitten wel isolatieplaatjes tussen de regelaar en de MOSFET's, anders zouden ze sluiting maken.

De print

Hieronder de print voor de stappenmotorregeling. Deze print is gefreesd, maar kan natuurlijk ook geëtst worden. Alle componenten staan er op met de waardes erbij, de weerstand symbolen met het vierkantje erin zijn nul Ohm weerstanden (dit zijn draadbruggen). De grote rode omlijning is het koelblok. Met de twee potmeters (waar RUN en HOLD bij staat) kan de stroom ingesteld worden. Voor de rest wijst het voor zich. De afmeting van de print is 100 x 120 mm.

Unipolaire stappenmotor driver printUnipolaire stappenmotor driver print

De software

Zoals ik al gezegd had staat er een PIC12F683 op voor de stroomregeling, daar hoort een programma bij. Hieronder het programma wat in de 12F683 staat.

Device 12F683                     ; processor type

Xtal 4                            ; Interne oscillator

Config WDT_OFF,_                  ; WatchDog Timer uit
       PWRTE_ON,_                 ; Power-up Timer Enable aan
       MCLRE_OFF,_                ; Externe Master Reset Enable uit
       INTRC_OSC_NOCLKOUT         ; Interne oscilator aan

All_Digital true                  ; Alle poorten digitaal

Declare CCP1_Pin GPIO.2           ; PWM uitgang

Declare Adin_Res = 8              ; Resolutie 8 bits
Declare Adin_Tad = frc            ; Set rc osc
Declare Adin_Stime = 50           ; Sample tijd 5

Symbol VRIJGAVE_RUN_HOLD = GPIO.5 ; Ingang vrijgave run_hold
Symbol FREQUENTIE = 20000         ; PWM frequentie 20KHz

Dim HOLD_FUNCTIE As Byte          ; Variabele analoog_in 0
Dim RUN_FUNCTIE As Byte           ; Variabele analoog_in 1

Clear                             ; Wis geheugen

         ;543210                  ; Hulpregel
GPIO   = %000000                  ; Maak poort laag
TRISIO = %110011                  ; Poort I/O

         ;76543210                ; Hulpregel control register
ADCON0 = %00000001                ; A/D control register

; STROOM INSTELLING DOOR DE SPOELEN - INSTELLEN VIA ANALOGE INGANG 0.

HOLD:

    HOLD_FUNCTIE = ADIn 0
    HPWM 1,HOLD_FUNCTIE,FREQUENTIE

    If VRIJGAVE_RUN_HOLD = 0 Then
        GoTo RUN
    EndIf
GoTo HOLD

; STROOM INSTELLING DOOR DE SPOELEN - INSTELLEN VIA ANALOGE INGANG 1.

RUN:

    RUN_FUNCTIE = ADIn 1
    HPWM 1,RUN_FUNCTIE,FREQUENTIE

    If VRIJGAVE_RUN_HOLD = 1 Then
        GoTo HOLD
    EndIf
GoTo RUN

End

Zoals je ziet is het vrij simpel, de twee analoge ingangen lezen de potmeters in en zetten de waarde om naar een PWM-signaal. En de VRIJGAVE_RUN_HOLD bepaalt welk PWM-signaal er naar de MOSFET's gestuurd wordt voor de stroominstelling.

Ik heb ook een klein test programma gemaakt om de werking te controleren en om aan de print te meten. Hieronder het test programma.

Device 16F887                    ; Processor type

Xtal 10                          ; Cristal 10Mhz

Asm                              ; Config settings
CONFIG_REQ
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & 
IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON
__CONFIG _CONFIG2, WRT_OFF & BOR40V
EndAsm

All_Digital true                 ; Alle poorten digitaal

Symbol PULS = PORTA.0            ; Ingang puls
Symbol DIR = PORTA.1             ; Ingang DIR 0 = rechts DIR 1 = links
Symbol HOLD = PORTA.2            ; Ingang houdstroom

Symbol FACTOR = 400              ; Instelling halve hele stappen

Symbol S1 = PORTE.2              ; Ingang vrijgave puls

Symbol FREQUENTIE = 400          ; Instelling stapfrequentie
Symbol WACHT = 0                 ; Instelling wacht links rechts
Symbol AANTAL_OMWENTELINGEN = 10 ; Instelling aantal omwentelingen

Dim I As Dword                   ; Variabele FOR NEXT

Clear                            ; Wis geheugen

         ;543210                 ; Hulpregel poort A
PORTA  = %000000                 ; Maak poort A laag
TRISA  = %000000                 ; Poort_A I/O

         ;543210                 ; Hulpregel poort B
PORTB  = %000000                 ; Maak poort B laag
TRISB  = %111111                 ; Poort_B I/O

         ;76543210               ; Hulpregel poort C
PORTC  = %00000000               ; Maak poort C laag
TRISC  = %00000000               ; Poort_C I/O

         ;76543210               ; Hulpregel poort D
PORTD  = %00000000               ; Maak poort D laag
TRISD  = %00000000               ; Poort_D I/O

         ;210                    ; Hulpregel poort E
PORTE  = %000                    ; Maak poort E laag
TRISE  = %111                    ; Poort_E I/O
         ;76543210               ; Hulpregel analoog
ADCON0 = %00000001               ; ADCON0 register analoog

         ;543210                 ; Hulpregel analoog poort_B
ANSELH = %000000                 ; ANSEL register analoog poort_B

; STROOM REDUCTIE AAN IN STILSTAND PLUS VRIJGAVE PULS

START_RECHTS:

    HOLD = 1
    If S1 = 1 Then
        DelayMS WACHT
        GoTo RUN_RECHTS
    EndIf
GoTo START_RECHTS

; UITGAVE AANTAL STAPPEN RECHTSOM MET KEUZE RICHTING "DIR".

RUN_RECHTS:

    DIR = 0
    HOLD = 0
    For I = 1 To AANTAL_OMWENTELINGEN * FACTOR Step 1
        PULS = 1
        DelayUS FREQUENTIE
        PULS = 0
        DelayUS FREQUENTIE
        If I = AANTAL_OMWENTELINGEN * FACTOR Then
            I = 0
            GoTo START_LINKS
        EndIf
    Next I
GoTo RUN_RECHTS

; STROOM REDUCTIE AAN IN STILSTAND PLUS VRIJGAVE PULS.

START_LINKS:

    HOLD = 1
    If S1 = 1 Then
        DelayMS WACHT
        GoTo RUN_LINKS
    EndIf
GoTo START_LINKS

; UITGAVE AANTAL STAPPEN LINKSOM MET KEUZE RICHTING "DIR".

RUN_LINKS:

    DIR = 1
    HOLD = 0
    For I = 1 To AANTAL_OMWENTELINGEN * FACTOR Step 1
        PULS = 1
        DelayUS FREQUENTIE
        PULS = 0
        DelayUS FREQUENTIE
        If I = AANTAL_OMWENTELINGEN * FACTOR Then
            I = 0
            GoTo START_RECHTS
        EndIf
     Next I
GoTo RUN_LINKS

End

Op deze manier heb ik de regeling getest, zoals het er nu staat draait de stappenmotor 10 omwentelingen naar rechts en naar links. De stap frequentie staat op 400, dat is wel zo'n beetje het maximum in half stap bedrijf en het direct aanzetten van de stappenmotor bij een voedingsspanning van 12 VDC. Dit komt overeen met een stapfrequentie van 1200 Hz. Dit kan nog wel iets hoger als je ramp up en ramp down toepast, bij de test heb ik dat niet gedaan, ik schakel in één keer om van linksom naar rechtsom.

Hieronder kan je zien waar je nog wat instellingen kan wijzigen. Bij FACTOR kan je instellen of het hele of halve stappen moeten zijn, dan moet ook de jumper JP1 op de print omgestoken worden. Bij FREQUENTIE kan je de stapsnelheid instellen, hoe groter die waarde is hoe langzamer de stappenmotor draait. Bij WACHT kan je een wachttijd tussen het van linksom naar rechtsom draaien instellen, die tijd is in milliseconden. En bij AANTAL_OMWENTELINGEN geef je het aantal omwentelingen aan die de stappenmotor mag draaien, dat mag een waarde zijn tussen 0 en 4294967295 stappen. Verder valt er eigenlijk niet zoveel over te vertellen.

Symbol FACTOR = 400              ; Instelling halve hele stappen
Symbol FREQUENTIE = 400          ; Instelling stapfrequentie
Symbol WACHT = 0                 ; Instelling wacht links rechts
Symbol AANTAL_OMWENTELINGEN = 10 ; Instelling aantal omwentelingen

Hieronder nog een aansluitschema van de print en stappenmotor.

Aansluitschema unipolaire stappenmotor driverAansluitschema unipolaire stappenmotor driver

Unipolaire stappenmotor aansluitingenUnipolaire stappenmotor aansluitingen

De gebruikte stappenmotor is een Sanyo Denki 1,8 graden per stap DC.3A. Typenummer 103H7126-0744.

Ik heb de draadkleuren van de motor erbij gezet, en bij de aansluitklemmen staat de kleur ook. Dus als men dit na wil bouwen hoeft de aansluiting geen probleem op te leveren.

Bij de Molex-stekker staan de aansluitingen er ook bij.