PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ cấu chấp hành (Actuator) (http://www.picvietnam.com/forum/forumdisplay.php?f=13)
-   -   Điều khiển Stepper Motor (http://www.picvietnam.com/forum/showthread.php?t=318)

picfan 28-02-2006 04:15 AM

Điều khiển Stepper Motor
 
Em là thành viên mới, em muốn hỏi về điều khiển Stepper motor sử dụng PIC6F84. Em có 1 đoạn code, sử dụng 3 nút bấm điều khiển quay ben trái, quay ben phải, va dừng lại. em muốn thêm một nút điều khiển cho tự quay có chu kỳ, quay hết một vòng rồi quay ngược lại (vì quay liên tục sẽ bị rối dây cáp).

Đây là code:
Code:

;********************************************************

        list            p=pic16f84a
        include        p16f84a.inc
        __config _hs_osc & _wdt_off & _pwrte_on & _cp_off

;****************  Label Definition  ********************
        cblock  h'0c'
mode                            ;Operation mode
                                ;0=stop 1=right 2=left
count1                          ;Wait counter
count2                          ;Wait counter(for 1msec)
        endc

rb0    equ    0              ;RB0 of PORTB
rb1    equ    1              ;RB1 of PORTB
rb2    equ    2              ;RB2 of PORTB
rb5    equ    5              ;RB5 of PORTB
rb7    equ    7              ;RB7 of PORTB

;****************  Program Start  ***********************
        org    0              ;Reset Vector
        goto    init
        org    4              ;Interrupt Vector
        clrf    intcon          ;Clear Interruption reg

;****************  Initial Process  *********************
init
        bsf    status,rp0      ;Change to Bank1
        clrf    trisa          ;Set PORTA all OUT
        movlw  b'00100111'    ;RB0,1,2.5=IN RB7=OUT
        movwf  trisb          ;Set PORTB
        movlw  b'10000000'    ;RBPU=1 Pull up not use
        movwf  option_reg      ;Set OPTION_REG
        bcf    status,rp0      ;Change to Bank0
        clrf    mode            ;Set mode = stop
        clrf    count1          ;Clear counter
        clrf    count2          ;Clear counter
        movlw  b'00000101'    ;Set PORTA initial value
        movwf  porta          ;Write PORTA
        bsf    portb,rb7      ;Set RB7 = 1
        btfsc  portb,rb5      ;RB5 = 0 ?
        goto    $-1            ;No. Wait

start
;*************  Check switch condition  *****************
        btfsc  portb,rb1      ;RB1(stop key) = ON ?
        goto    check1          ;No. Next
        clrf    mode            ;Yes. Set stop mode
        goto    drive          ;No. Jump to motor drive
check1
        btfsc  portb,rb2      ;RB2(right key) = ON ?
        goto    check2          ;No. Next
        movlw  d'1'            ;Yes. Set right mode
        movwf  mode            ;Save mode
        goto    drive          ;No. Jump to motor drive
check2
        btfsc  portb,rb0      ;RB0(left key) = ON ?
        goto    drive          ;No. Jump to motor drive
        movlw  d'2'            ;Yes. Set left mode
        movwf  mode            ;Save mode

;********************  Motor drive  *********************
drive
        movf    mode,w          ;Read mode
        bz      start          ;mode = stop
        bsf    portb,rb7      ;Set RB7 = 1
        btfsc  portb,rb5      ;RB5 = 0 ?
        goto    $-1            ;No. Wait
        movlw  d'5'            ;Set loop count(5msec)
        movwf  count1          ;Save loop count
loop    call    timer          ;Wait 1msec
        decfsz  count1,f        ;count - 1 = 0 ?
        goto    loop            ;No. Continue
        bcf    portb,rb7      ;Set RB7 = 0
        btfss  portb,rb5      ;RB5 = 1 ?
        goto    $-1            ;No. Wait
        movf    porta,w        ;Read PORTA
        sublw  b'000000101'    ;Check motor position
        bnz    drive2          ;Unmatch
        movf    mode,w          ;Read mode
        sublw  d'1'            ;Right ?
        bz      drive1          ;Yes. Right
        movlw  b'00001001'    ;No. Set Left data
        goto    drive_end      ;Jump to PORTA write
drive1
        movlw  b'00000110'    ;Set Right data
        goto    drive_end      ;Jump to PORTA write
;-------
drive2
        movf    porta,w        ;Read PORTA
        sublw  b'000000110'    ;Check motor position
        bnz    drive4          ;Unmatch
        movf    mode,w          ;Read mode
        sublw  d'1'            ;Right ?
        bz      drive3          ;Yes. Right
        movlw  b'00000101'    ;No. Set Left data
        goto    drive_end      ;Jump to PORTA write
drive3
        movlw  b'00001010'    ;Set Right data
        goto    drive_end      ;Jump to PORTA write
;-------
drive4
        movf    porta,w        ;Read PORTA
        sublw  b'000001010'    ;Check motor position
        bnz    drive6          ;Unmatch
        movf    mode,w          ;Read mode
        sublw  d'1'            ;Right ?
        bz      drive5          ;Yes. Right
        movlw  b'00000110'    ;No. Set Left data
        goto    drive_end      ;Jump to PORTA write
drive5
        movlw  b'00001001'    ;Set Right data
        goto    drive_end      ;Jump to PORTA write
;-------
drive6
        movf    porta,w        ;Read PORTA
        sublw  b'000001001'    ;Check motor position
        bnz    drive8          ;Unmatch
        movf    mode,w          ;Read mode
        sublw  d'1'            ;Right ?
        bz      drive7          ;Yes. Right
        movlw  b'00001010'    ;No. Set Left data
        goto    drive_end      ;Jump to PORTA write
drive7
        movlw  b'00000101'    ;Set Right data
        goto    drive_end      ;Jump to PORTA write
;-------
drive8
        movlw  b'00000101'    ;Compulsion setting

drive_end
        movwf  porta          ;Write PORTA
        goto    start          ;Jump to start

;*************  1msec Timer Subroutine  *****************
timer
        movlw  d'200'          ;Set loop count
        movwf  count2          ;Save loop count
tmlp    nop                    ;Time adjust
        nop                    ;Time adjust
        decfsz  count2,f        ;count - 1 = 0 ?
        goto    tmlp            ;No. Continue
        return                  ;Yes. Count end

;********************************************************
;            END of Stepper Motor controller
;********************************************************

        end

Em cảm ơn

picfan 28-02-2006 06:28 PM

Em dung "2-phase unipolar stepper motor" . Gồm 48 bước và mỗi bước 7.5 độ.

tinhthanthep 01-03-2006 03:29 PM

Cậu cho hỏi là 4 chân nào của PIC nối với 4 dây của động cơ?
và chân nào của PIC nối với các nút bấm.

linhnc308 26-04-2006 11:48 AM

Tôi có cái lập trình cho Step bằng CCS. Điều khiẻn theo cả 3 kiểu: 1 pha, 2 pha và nửa bước. Mới viết cho step nên chắc còn gà lắm.

code:
int8 duty_cycle;

while (1)
{
//Dieu khien dong co buoc: DK nua buoc (ULN2803)
if (mode)
{
PortD = 0x60;
delay_ms(duty_cycle);
PortD = 0x70;
delay_ms(duty_cycle);
PortD = 0x30;
delay_ms(duty_cycle);
PortD = 0xB0;
delay_ms(duty_cycle);
PortD = 0x90;
delay_ms(duty_cycle);
PortD = 0xD0;
delay_ms(duty_cycle);
PortD = 0xC0;
delay_ms(duty_cycle);
PortD = 0xE0;
delay_ms(duty_cycle);
}
else
{
PortD = 0xE0;
delay_ms(duty_cycle);
PortD = 0xC0;
delay_ms(duty_cycle);
PortD = 0xD0;
delay_ms(duty_cycle);
PortD = 0x90;
delay_ms(duty_cycle);
PortD = 0xB0;
delay_ms(duty_cycle);
PortD = 0x30;
delay_ms(duty_cycle);
PortD = 0x70;
delay_ms(duty_cycle);
PortD = 0x60;
delay_ms(duty_cycle);
}
}

Tôi dùng động cơ loại 6 dây. ĐK khá tốt, quay thạnn ngược và ĐK tôc độ bằng máy tính. Mà không biết mạch công suất cho Step dùng H1061 đc không nhỉ. Cái trên tôi dùng ULN2803.

cpc 25-07-2006 07:57 PM

Nói tới cái này mới nhớ!Hôm trước mới chôm được cáo động cơ bước mà không biết bao nhiêu độ một bước .có cách nào dể nhận thấy điều này nhỉ!Không lẻ kích xung rồ đo độ!

cpc 29-07-2006 01:30 PM

hic cai' động cơ đó có 6 dây!mình kiểm tra thử thì 2 dây ở giữa là dây chung ,còn 4 dây hai bên là dây kích .mình đoán thử từng cuộn dây 1,2,3,4.mình thử điều khiển nhưng động cơ tác động nhưng nó vẫn cân bằng tại một chổ.Chắc do chương trình sai.Có ai có thể giúp đỡ mình với.Động cơ này quay một bước là 1,8 độ.

cpc 29-07-2006 01:32 PM

à viết bằng 8051 nhá!mình không có pic.Hi vọng được giúp đỡ!

trungduc 04-11-2008 02:44 PM

Steper motor
 
Trích:

Nguyên văn bởi cpc (Post 4207)
hic cai' động cơ đó có 6 dây!mình kiểm tra thử thì 2 dây ở giữa là dây chung ,còn 4 dây hai bên là dây kích .mình đoán thử từng cuộn dây 1,2,3,4.mình thử điều khiển nhưng động cơ tác động nhưng nó vẫn cân bằng tại một chổ.Chắc do chương trình sai.Có ai có thể giúp đỡ mình với.Động cơ này quay một bước là 1,8 độ.

ban co the dung 1 cuc pin han 2 dau day va thu dan tung truong hop. Cua minh loai 6 day nhung 2 cuc ngoai cung la chung minh noi vao + neu theo thu tu tu trai qua phai la 123456
thi thu tu la : 2-5-3-4 quay vong.
chuc may man

hangocminh1989 04-11-2009 08:23 PM

anh em ơi,luồng này hình như lâu rùi không bàn bạc nữa thì phải. các sư phụ cho em hỏi về vụ chọn động cơ bước thế nào mới phù hợp với yêu cầu, làm sao biết cái nào 2 pha, 3 pha, em là lính mới nên gà lắm. mong các sư huynh giúp đỡ nhiệt tình nha, em xắp phải nộp bài tập lớn rùi. thank

nhatson.elec 23-04-2010 08:45 AM

động cơ bước laọi nào thường trên mác sẽ có ghi, có thể đựa vào góc bước dể xác định, 5 pha thường là 0.72, 3 pha là 1.2, còn 2 pha là 1.8o

robotden 25-04-2010 12:23 AM

muốn biết 2 pha, 3 pha, 5 pha thì tốt nhất nên xem động cơ buớc đó hiệu j. sau đó search google. Hoặc có thể nhìn số lượng dây mà đoán

haruoi 30-04-2010 12:14 AM

Trích:

Nguyên văn bởi cpc (Post 4207)
hic cai' động cơ đó có 6 dây!mình kiểm tra thử thì 2 dây ở giữa là dây chung ,còn 4 dây hai bên là dây kích .mình đoán thử từng cuộn dây 1,2,3,4.mình thử điều khiển nhưng động cơ tác động nhưng nó vẫn cân bằng tại một chổ.Chắc do chương trình sai.Có ai có thể giúp đỡ mình với.Động cơ này quay một bước là 1,8 độ.



Mình cũng dùng 8051 điều khiển động cơ bước. Mình nghĩ nếu khi bạn cấp tín hiệu vào từng pha của động cơ bước mà động cơ vẫn cân bằng tại 1 chỗ thì lý do là:
1. Bạn xác định nhầm thứ tự các đầu dây của động cơ bước.
2. Điện áp đặt vào các pha không đủ lớn. Mình mua động cơ bước ngoài chợ giời. Ngoài vỏ thì nghi là DC 5,6 V nhưng mình phải cấp 12V thì động cơ mới chạy.
3. Bạn lập trình lỗi. Lúc đầu t thử cấp tín hiệu vào từng pha( phải theo thứ tự xác định). Sau thì t cấp tín hiệu vào 2 pha kề nhau. Như vậy thì momen chuyển động của dc sẽ lớn hơn.

haruoi 30-04-2010 12:16 AM

Hix, trả lời xong. Để ý lại bài thì đã từ năm 06.


Múi giờ GMT. Hiện tại là 05:25 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam