Thông báo

Collapse
No announcement yet.

Chương trình xác định chiều quay của Encoder

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Chương trình xác định chiều quay của Encoder

    Encoder có 2 xung A và B dùng để xác định chiều quay của nó.
    Mình mới tập viết VXL nên k bít đúng sai,bạn nào giúp mình 1 tay nhé
    2 Chân A và B của Encoder đưa vào P3.0 và P3.1 của VXL.Và ngõ ra là chân P3.2 cho bít thuận hay nghịch
    ***
    P3.0 EQU PULSE_A
    P3.1 EQU PULSE_B
    P3.2 EQU THUAN/NGHICH ;NEU P3.2 LA 1 THI CHO CHAY THUAN,P3.2 LA 0 THI CHO CHAY NGHICH
    JB PULSE_A,SS1
    SS1: JNB PULSE_A,SS2
    SS2: JNB PULSE_B,THUAN
    JB PULSE_B,NGHICH
    RET
    THUAN: SETB P3.2
    RET
    NGHICH: CLR P3.2
    RET
    RET
    ***
    Hình đính kèm theo lấy từ picvietnam.com
    ****
    Hình trên là hình xung incremental encoder.

    Các bạn thấy rằng nếu như khi xung A đang từ mức cao xuống mức thấp, mà lúc đó B đang ở mức thấp, thì chúng ta sẽ xác định được chiều chuyển động của encoder theo chiều mũi tên màu cam.

    Nếu A đang từ mức cao xuống mức thấp, mà B đang ở mức cao, thì chúng ta sẽ biết encoder đang quay theo chiều màu nâu.
    ****
    Mình k bít cách đính kèm file

  • #2
    /* cho mình tham gia cách tìm chiều quay của Encoder nhé .
    Chương trình viết bằng KeilC cho 89C51 */



    #include <at89x51.h>
    #define xungA P3_0 //xung a noi vao P3.0
    #define xungB P3_1 //xung B noi vao P3.1
    #define Hight 1 //muc cao
    #define Low 0 //muc thap
    #define thuan 1 // chieu thuan
    #define nghich 0 // chieu nghich
    #define khong_quay 0 // khong quay
    #define quay 1

    char chieu_quay;
    char trang_thai_chuyen_dong;

    void main(void)
    {
    while(1)
    {
    if((xungA==Low)&&(xungB==Low)) // khi ca 2 xung deu muc thap
    {
    trang_thai_chuyen_dong = khong_quay;
    }
    if((trang_thai_chuyen_dong==khong_quay) //trang thai truoc 2 xung deu muc thap
    &&(xungA==Hight) //xung A tac dong,xung B chua tac dong
    &&(xungB==Low)) //chieu quay theo chieu thuan
    {
    chieu_quay = thuan; // chieu quay thuan
    trang_thai_chuyen_dong = quay; // co quay
    }
    if((trang_thai_chuyen_dong==khong_quay) //trang thai truoc 2 xung deu muc thap
    &&(xungA==Low) //xung B tac dong,xung A chua tac dong
    &&(xungB==Hight)) //chieu quay theo chieu lui
    {
    chieu_quay = nghich; // chieu quay nghich
    trang_thai_chuyen_dong = quay; // trang thai dang quay
    }
    if((xungA==Hight) //neu ca 2 xung deu tac dong cung muc cao
    &&(xungB==Hight)) trang_thai_chuyen_dong=quay; //trang thai nay khong xac dinh chieu quay

    P3_2 = chieu_quay; // xuat ra cong P3.2 chieu quay cua Encoder

    }
    }
    n
    ĐT: 0986 492 489

    Tham khảo:

    Comment


    • #3
      Tại sao các đồng chí này không sử dụng ngắt nhỉ. Xung A dưa vào INT0, xung B đưa vào INT1. Mỗi khi co ngắt, ta kiểm tra chân kia tại và ngược lại. Ví dụ khi có ngắt tại INT0, kiểm tra chân INT1 là P3.3 nếu là "0" thì chiều này và nếu là "1" thì là chiều kia đồng thời tăng bộ đếm lên 1 đơn vị. Còn thời gian rỗi của VXL ta đi làm việc khác.

      Comment


      • #4
        Nguyên văn bởi chuyendt Xem bài viết
        Tại sao các đồng chí này không sử dụng ngắt nhỉ. Xung A dưa vào INT0, xung B đưa vào INT1. Mỗi khi co ngắt, ta kiểm tra chân kia tại và ngược lại. Ví dụ khi có ngắt tại INT0, kiểm tra chân INT1 là P3.3 nếu là "0" thì chiều này và nếu là "1" thì là chiều kia đồng thời tăng bộ đếm lên 1 đơn vị. Còn thời gian rỗi của VXL ta đi làm việc khác.
        bạn nói cũng có lý tuy nhiên nếu một ứng dụng nào đó phải sử dụng INT0 và INT1 vào mục đích khác mất rồi thì bạn lấy đâu ra chân ngắt nữa để dùng?
        n
        ĐT: 0986 492 489

        Tham khảo:

        Comment


        • #5
          Nguyên văn bởi chuyendt Xem bài viết
          Tại sao các đồng chí này không sử dụng ngắt nhỉ. Xung A dưa vào INT0, xung B đưa vào INT1. Mỗi khi co ngắt, ta kiểm tra chân kia tại và ngược lại. Ví dụ khi có ngắt tại INT0, kiểm tra chân INT1 là P3.3 nếu là "0" thì chiều này và nếu là "1" thì là chiều kia đồng thời tăng bộ đếm lên 1 đơn vị. Còn thời gian rỗi của VXL ta đi làm việc khác.
          Ko cần thiết phải dùng đến 2 ngắt ngoài, ta chỉ cần dùng 1 ngắt là đủ, tại thời điểm xảy ra ngắt ta sẽ xác định được mức của kênh còn lại => chiều quay.

          Comment

          Về tác giả

          Collapse

          trantoan2502 Tìm hiểu thêm về trantoan2502

          Bài viết mới nhất

          Collapse

          Đang tải...
          X