Thông báo

Collapse
No announcement yet.

hoi ve timer dung xung ngoai tu encoder

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

  • hoi ve timer dung xung ngoai tu encoder

    mình đang viết chương trinh đọc xung từ encoder qua chân t0 của atmega32.
    nhưng mình muốn đọc một cách chính xác nên dùng ngắt ngoài . nhưng khi dùng ngắt ngoài thì kết quả đếm lại ko chính xác bằng ko dùng ngắt. ai biết như thế nào để đoc giá trị encoder về chính xác thì giúp mình với . thank !
    có thể cho mình xin đoạn code mẩu nhe!

  • #2
    ban nói rõ hơn la không chính xac nhưthe nào đi,tơ cung đang nghiên cứu về vấn đề này

    Comment


    • #3
      Ngày trước khi chưa biết dùng Times em đếm bằng cách dùng ngắt ngoài đó! khai thêm một biến ,hễ ngắt sảy ra thì cộng một vào biết đó đến khi biến đạt một já trị nào đó thì thực hiện lệnh. Em thấy các này đếm rất chính xác không kém j times, nhưng không nên dùng anh ới! vì nếu ngắt sảy ra chương trình chính lại bị ján đoạn, không tốt nên dùng đếm bằng times, em nghĩ do anh chống dội không tốt thôi!
      Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

      Comment


      • #4
        mình đang lap trinh cho một chiếc xe dò line tự động nên dùng encoder dể tính quảng đường đi.
        giải thuật của mình là thế này.
        mình tính encoder cua mình đưa về 11 xung tương ứng với xe chạy được 1cm. do đó mình viết một hàm mà khi nhap giá trị quảng dường cần đị thì xe sẽ chạy dúng quãng đường đó rồi dừng lại. nếu như xe chưa chạy đủ quảng đường thì thưc hiện ct doline.
        chương trinh của minh như sau:
        void encoder_doline(int n)// n : là quảng đg can đi
        { int count=0;
        bit e=1;
        reset_timer0();
        start_timer0();
        while(e==1)
        {
        if(TCNT0>=11)
        {
        ++count;
        if(count==n)
        { stop_timer0();
        Stop();
        e=0;
        }else doline();
        }

        }
        }

        // ct reset_timer0();
        start_timer0(); // đây la các ct khoi tạo cho timer0 thực hiện chức năng counter; các ct nay thì đã đúng
        stop_timer0();
        Stop(); // là ct dừng xe
        doline();// là ct doline
        mong được sự giúp đỡ của mọi người. thank!
        Last edited by daihoa; 17-03-2009, 17:12.

        Comment


        • #5
          Đọc chương trình của bạn thấy lủng củng lắm.
          Bạn thử làm thế này xem sao nhá:
          Ko cần dùng Timer, chỉ dùng ngắt ngoài thôi. Bạn chỉ cần đếm số xung thôi nhá. Ví dụ, mỗi vòng của bạn là có 10 xung, bạn đếm được n xung => robot đi được n/10 vòng => Dựa vào bán kính của bánh xe sẽ tính được quãng đường thôi.

          Comment


          • #6
            thank

            cảm ơn bạn. mình sẽ thử xem sao!

            Comment


            • #7
              theo mình trong trường hợp này dùng time rà rất đúng.bạn dùng một biến để nhớ số vòng bánh trái,một biến nhớ số vòng bánh phải.hoặc có thể cho time đếm 10 xung thì ngắt một lần và kiểm tra.tất nhiên là phải dùng thêm một biến nữa để nhớ 1/10 bánh trái và 1/10 bánh phải(giả sử encoder 200 xung).khi đếm được 20:1/10 thì tăng số vòng lên 1

              Comment


              • #8
                Bạn nên vào mục sau để xem, lúc trước mình cũng làm theo chương trình của bluepine và đếm xung thấy cũng oki lắm.

                http://www.picvietnam.com/forum/show...?t=485&page=22

                Web:[url]www.ledviet.info/url]
                Email:
                DĐ:0949299699

                Comment


                • #9
                  Mình thấy thuật toán như của bạn daihoa cũng ổn chứ sao

                  Comment


                  • #10
                    cái này thì bạn chỉ cần dùng 1 counter là đủ rồi. ở đây nên dùng counter1 16bit.
                    cho timer1 chạy ở chế độ đếm xung ngoài, ngắt icp (hoặc ocp tùy) và ngắt tràn.

                    theo bạn nói là 11xung/cm. như vậy bạn sẽ tính trước số xung cần đếm X_c=qduong*11.
                    nếu X_c<65535 thì bạn chỉ việc cho nó vào thanh ghi ICR hoặc OCR.
                    bắt đầu chạy bạn reset counter=0 và cho chạy. khi nào đếm đủ đến đây thì sẽ tạo ra ngắt-->bạn stop dco trong ngắt là xong.
                    nếu X_c>65535 thì bạn cần thêm biến để tăng số bit đếm cho counter. phần này thì để bạn nghiên cứu thêm hỉ.
                    mà có thêm chú ý nữa là tốc độ của động cơ. bạn tính toán để tần số xung trả về từ encode không vượt quá tần số có thể đo được của counter (fosc/2).

                    thân!

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X