Step motor & PIC
Ako ste u svojoj aplikaciji imali
potrebu da koristite step motor, a niste znali kako, odgovor potražite u ovom
članku.
U razvoju tehnologije sistema
digitalnog upavljanja koračni (step) motor je najzanimljivije otkriće. To je jedini tip
motora kojim mikroprocesor može direktno upravljati bez posredstva digitalno/analognog
pretvarača. Naravno to ”direktno” nemojte baš bukvalno shvatiti jer, mikroprocesor
ne može da obezbedi dovoljno veliku struju za pokretanje motora, pa se zato mora koristi
poseban izvor i par komponenata “drajvera” preko kojih mikroprocesor upravlja motorom.
 |
Motor koji smo
koristili u ovom primeru je proizvod firme SHINKON. Ovaj motor ima šest izvoda od kojih
dva (beli i crni) idu na napon napajanja (+14V) ,a ostala četiri na kolektore tranzistora
BD 135 koji su u ovom slučaju drajveri dimenzionisani za ovaj tip motora. Diode 1N4148
imaju ulogu da zaštite tranzistore od povratne struje koja se indukuje u namotajima
motora. Broj pozicija u kojim se može naći osovina motora je 200 tj. ugao koji osovina
zaklapa između dve susedne pozicije je 360°/200 = 1,8 stepeni. |
Kontrola motora je poverena već
poznatom Microchip-ovom mikrokontroleru PIC16F84. Kao što možemo videti sa električne
šeme pored obaveznog reset kola i oscilatora, na PORT-u B imamo dva tastera (RB0 i RB1)
za smer i dve kontrolne LEDiode (RB6 i RB7), a za upravljanje tranzistorima upotrebljeni
su pinovi porta A (RA0 – RA3).
Suština upravljanja step motorom je u tome da se na krajeve istog namotaja dovode signali
koji su međusobno pomereni 180°, dok su signali prvog i drugog namotaja međusobno
pomereni za 90°. To znači da bi pokrenuli motor u jednom smeru potrebno je da na port A
mikrokontrolera sukcesivno šaljemo vrednosti date u tabeli redosledom (1,2,3,4,1), a ako
želimo da promenimo smer redosled slanja je (1,4,3,2,1).
| korak |
RA3 |
RA2 |
RA1 |
RA0 |
| 1 |
0 |
1 |
0 |
1 |
| 2 |
0 |
1 |
1 |
0 |
| 3 |
1 |
0 |
1 |
0 |
| 4 |
1 |
0 |
0 |
1 |
| 1 |
0 |
1 |
0 |
1 |
Test program
Program čine dve rutine: LLab
koja na izlazni port A šalje vrednisti redosledom (1,2,3,4,1) i DLab koja vrednosti na
izlazni port šalje redosledom (1,4,3,2,1). Da bi imali neku kontrolu nad motorom na portu
B su dodata dva tastera koje program ispituje svake 2 mS i u zavisnosti od njihovog stanja
izvršavaju se rutine LLab ili DLab tj. osovina motora se kreće levo ili desno.
U ovom primeru dat je samo prncip upravljanja step motorom ali uz male izmene i recimo
dodavanjem softverske komunikacije moguće je na vrlo jednostavan i na lak način zadavati
broj koraka menjati smer i brzinu motora.
| LISTING : Step motor, ARB generator kod-a |
#include <stdio.h>
#include "pic16c84.h" const int
Lookup=10;
void Test(flag p){block
#define page0 (rp0=low t;Skip(p);t.Again();tmr0=0;})
#define page1 (rp0=high)
main()
{
Choice("step.hex",INTEL_HEX);
gpr Step(0x0c);
flag Levo =portB(1);
flag Desno =portB(0);
flag LLed =portB(6);
flag DLed =portB(7);
LC=0;
page1;
trisA=w=0;
trisB=w=0x0f;
option=w="10010011";
page0;
DLed=low;
LLed=low;
portA=0;
tmr0=0;
Step=0;
Jump(MAIN);
{
block table(Lookup);
pcl=pcl+w;
Retlw("00000101");
Retlw("00000110");
Retlw("00001010");
Retlw("00001001");
}
{
block m(MAIN);
Test(tmr0(7);
}
{
enum loop{DLab=100,LLab};
block k;
k(DLab);
Skip(!Desno);
k.Jump(LLab);
DLed=high;
++Step;
w=4;
w=w-Step;
Skip(status(0));
Step=0;
w=Step;
Call(Lookup);
portA=w;
DLed=low;
Jump(MAIN);
k(LLab);
Skip(!Levo);
Jump(MAIN);
LLed=high;
--Step;
w=3;
Skip(!Step(7));
Step=w;
w=Step;
Call(Lookup);
portA=w;
LLed=low;
Jump(MAIN);
}
return 0;
} |
|
| LISTING:
Step motor, asembler |
| #include c84.h #define page0 bcf 3,5 ;Memory page0
#define page1 bsf 3,5 ;Memory page1
Step equ 0x0c ;Temp location
Left equ 1 ;RB1
Right equ 0 ;RB0
LeftL equ 6 ;RB6
RightL equ 7 ;RB7
org 0x00
page1
movlw 0x00
movwf TRISA ;PortA je izlazni
movlw 0x0f
movwf TRISB ;RB0 - RB3 ulazi, RB4 - RB7 izlazi
movlw b'10010111'
movwf OPTION_REG
page0
bcf PORTB,RightL ;Pocetak Inicijalizacije
bcf PORTB,LeftL ;
clrf PORTA ;
clrf RTCC ;
clrf Step ;Kraj Inicijalizacija
goto main
Table addwf PCL,f
retlw b'00000101'
retlw b'00000110'
retlw b'00001010'
retlw b'00001001'
main btfss RTCC,3
goto $-1
clrf RTCC
RightLAB
btfsc PORTB,Right
goto LeftLAB
bsf PORTB,RightL
incf Step,f
movlw .4
subwf Step,w
btfsc STATUS,0
clrf Step
movf Step,w
call Table
movwf PORTA
call delay
bcf PORTB,RightL
goto main
LeftLAB
btfsc PORTB,Left
goto main
bsf PORTB,LeftL
decf Step,f
movlw .3
btfsc Step,7
movwf Step
movf Step,w
call Table
movwf PORTA
call delay
bcf PORTB,LeftL
goto main
delay btfss RTCC,7
goto $-1
clrf RTCC
return
end
|
| Pročitajte više o ovoj
temi |
|
|
|