Thông báo

Collapse
No announcement yet.

Đọc encoder độ phân giải cao

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

  • Đọc encoder độ phân giải cao

    Mình có 1 vấn đề về encoder mong bạn nào biết thì giúp mình với.

    Mình điều khiển động cơ 1 chiều gắn encoder dùng 89C51. encoder của mình là loại 1024 xung/vòng, cứ sau khoảng 300 vòng động cơ thì mình kết thúc quá trình đếm. Vấn đề ở đây là bộ counter của 89C51 đếm tối đa là 16 bit (65.536 xung) trong khi đó cái mình cần đếm là khoảng 300.000 xung (300 vòng). Bạn nào có ý kiến nào giúp mình với nhé.
    Thank nhiều

  • #2
    Bạn dùng ngắt ngoài mà đếm. Dùng một biến có kiểu là kiểu unsigned long mà đếm. biến này có kích thước 4 byte đấy. thoải mái mà đếm.
    Nếu muốn dùng counter thì trong sự kiện ngắt tràn timer bạn cho một biến đếm tăng lên.
    Vị dụ:
    Cách 1: dùng counter của timer
    unsigned int i=0;
    void ngắt_timer1()....
    {
    i++;
    }
    void main()
    {
    unsigned long KetQua;
    KhoiTaoHeThong();
    KetQua = i*65536 + TH1*256 + TL1; // đây chính là giá trị đếm số xung của encoder.

    }

    Cách 2 dùng ngắt ngoài:
    unsigned long SoXung = 0;
    void ngat_ngoai()...
    {
    SoXung++;
    }
    void main()
    {
    KhoiTaoHeThong();
    while(1)
    {
    if(SoXung > 300000)//300 vòng
    {
    EA = 0; // cấm đếm
    SoXung = 0; //Reset lai giá trị đếm. có cũng được không cũng được.
    }
    }
    }
    Last edited by minhhieu; 24-02-2010, 08:43.
    n
    ĐT: 0986 492 489

    Tham khảo:

    Comment


    • #3
      Cảm ơn nhiều nhé. mình làm được rồi, theo cách 2 của bạn

      Comment


      • #4
        Nếu bạn vẫn giữ bộ counter thì cứ sau 30.000 lần bạn reset một lần rồi lưu ra một biến toàn cục, cách này sẽ tiết kiệm thời gian xử lý của vi điều khiển. Nếu mỗi xung phải đếm một lần thì hơi vất

        Comment

        Về tác giả

        Collapse

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

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

        Collapse

        Đang tải...
        X