Điều khiển Stepper Motor

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • picfan
    Nhập môn đệ tử
    • Feb 2006
    • 2

    #1

    Đ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
    Nhập môn đệ tử
    • Feb 2006
    • 2

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

    Comment

    • tinhthanthep
      Đệ tử 6 túi
      • May 2005
      • 141

      #3
      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.

      Comment

      • linhnc308
        Đệ tử 5 túi
        • Oct 2005
        • 117

        #4
        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.
        CallerID, Ethernet-RS232, PICWEB, Cảnh báo BTS
        Giải pháp toàn diện giám sát - điều khiển từ xa qua GSM/Internet
        0988006696

        http://linhnc308.blogspot.com
        linhnc308@gmail.com

        Comment

        • cpc
          Nhập môn đệ tử
          • Mar 2006
          • 6

          #5
          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 độ!

          Comment

          • cpc
            Nhập môn đệ tử
            • Mar 2006
            • 6

            #6
            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 độ.

            Comment

            • cpc
              Nhập môn đệ tử
              • Mar 2006
              • 6

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

              Comment

              • trungduc
                Đệ tử 2 túi
                • Oct 2008
                • 44

                #8
                Steper motor

                Nguyên văn bởi cpc View Post
                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

                Comment

                • hangocminh1989
                  Đệ tử 6 túi
                  • Apr 2009
                  • 132

                  #9
                  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

                  Comment

                  • nhatson.elec
                    Đệ tử 4 túi
                    • Nov 2008
                    • 84

                    #10
                    độ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

                    Comment

                    • robotden
                      Đệ tử 5 túi
                      • May 2007
                      • 102

                      #11
                      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
                      Thật bó tay!

                      Comment

                      • haruoi
                        Đệ tử 2 túi
                        • Apr 2010
                        • 29

                        #12
                        Nguyên văn bởi cpc View Post
                        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.

                        Comment

                        • haruoi
                          Đệ tử 2 túi
                          • Apr 2010
                          • 29

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

                          Comment

                          Working...