Thông báo

Collapse
No announcement yet.

Lại là vấn đề encoder :D

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

  • Lại là vấn đề encoder :D

    Em đang muốn làm một cái encoder thủ công để đo tốc độ động cơ. Có 2 phương án:
    1. Lấy đĩa và bộ mắt thu phát từ chuột bi ra dùng. (Nhưng vấn đề là ở chỗ trên con mắt thu của nó, có 3 chân thì 2 chân đều đưa vào chíp cả. Nhưng theo ý em hiểu thì chỉ có một chân là đưa tín hiệu về cho chíp thôi, thế còn chân còn lại đưa về VDK làm gì?)
    2. Em mua một bộ mắt thu phát ở chợ Trời về (tên là TCST2104) và làm một cái đĩa lỗ rồi gắn lên động cơ để đo. Nhưng search mãi trên mạng mà không tìm được cách mắc cho nó.
    Các bác đã làm mấy thứ này rồi chỉ cho em với. Thank's!

  • #2
    mắt thu của chuột bi được tích hợp sẵn 2 bộ thu sát nhau và thường đựoc nối với 2 chân bìa , còn chân anod thường đưược nối chung làm chân giữa . mục đích của của việc gép chung là để so sánh pha giữa 2 tín hiệu nhằm xác định chiều chuyển động.

    Comment


    • #3
      Làm 1 cái encoder thủ công với phương án đơn giản chỉ cần có 1 cái đĩa quay, trên đó khoét bao nhiêu lỗ tùy cậu, càng nhiều lỗ thì độ phân giải trên 1 vòng quay càng cao, càng chính xác.
      Mua 1 cặp diode thu phát về ( loại 2 chân như diode led) làm 1 cái mạch phát thu đơn giản, 1 con luon phát và 1 con luon thu, khi phần khoét của cái đĩa quay cho phép tia hồng ngoại truyền qua thì bên kia con thu tích cực mức 1 hay 0 do cậu thết kế. Dùng 1 con VDK hoặc 1 con IC đếm nào đó đọc xung đưa vào. Vậy là xong 1 cái encoder đơn giản

      Comment


      • #4
        Thank's các bác!
        Thế là về cơ bản, encoder dùng bộ thu phát của chuột bi đã được giải quyết. Còn cái việc dùng cặp thu phát nhu bác hutieumaizo nói thì mình đang mắc ở việc lắp mạch, vì mình không hiểu lắm về chân cẳng của nó và cách ghép nối con mắt thu.Bác hướng dẫn luôn cho anh em cách lắp mạch nhé.
        Mình đang phân vân giữa dùng Interrup INT và Input Capture để đếm xung. Mong các bác cho ý kiến nên dùng con nào thì hợp lý hơn. Trước em đã đo xung bằng Input Capture rồi và thấy khá chính xác, nhưng có lẽ chỉ để đo tốc độ động cơ thì chỉ cần dùng INT là được.
        Rất mong ý kiến chỉ giáo của các bác! Thank's!

        Comment


        • #5
          Hà hà... hóa ra cái máy tính hôm trước em ngồi để tìm datasheet cho con TCST2104 là máy không cài Acrobat Reader nên không đọc được file *.pdf Bây giờ thì em đã có datasheet trong tay rồi, mấy hôm nữa ok rồi em sẽ đưa mạch lên luôn.

          Comment


          • #6
            Nguyên văn bởi sun_rise Xem bài viết
            Hà hà... hóa ra cái máy tính hôm trước em ngồi để tìm datasheet cho con TCST2104 là máy không cài Acrobat Reader nên không đọc được file *.pdf Bây giờ thì em đã có datasheet trong tay rồi, mấy hôm nữa ok rồi em sẽ đưa mạch lên luôn.
            Bạn ơi cho mình hỏi cái.Mình muốn dùng Pic để đọc encoder và nhận biết chiều quay của nó.Bạn giúp mình thuật toán với,và có tài liệu gì ko thì share cho mình với.thanks nhiều

            Comment


            • #7
              Mình đã thử dùng ngắt rồi, ngắt thì ngon lành nhưng để gá được cái đĩa lỗ lên trục động cơ và để cho nó quay ở vị trí thích hợp giữa bộ mắt thu phát thì lại là vấn đề khác.
              Bạn ơi cho mình hỏi cái.Mình muốn dùng Pic để đọc encoder và nhận biết chiều quay của nó.Bạn giúp mình thuật toán với,và có tài liệu gì ko thì share cho mình với.thanks nhiều
              -> Mình chỉ biết là để biết được chiều quay của nó thì phải dùng 2 bộ mắt thu phát đặt lệch nhau 1 góc nhất định. Còn thuật toán thì cả Pic và Avr đều giống nhau.

              Comment


              • #8
                Nguyên văn bởi sun_rise Xem bài viết
                -> Mình chỉ biết là để biết được chiều quay của nó thì phải dùng 2 bộ mắt thu phát đặt lệch nhau 1 góc nhất định. Còn thuật toán thì cả Pic và Avr đều giống nhau.
                Bạn có thể nói hơn về thuật toán ko?Và có tài liệu gì ko?Bạn từng làm rồi thế có kinh nghiệm gì về làm phần cứng ko?Chúc bạn có ngày giỗ tổ vui vẻ

                Comment


                • #9
                  Bạn có thể nói hơn về thuật toán ko?Và có tài liệu gì ko?Bạn từng làm rồi thế có kinh nghiệm gì về làm phần cứng ko?Chúc bạn có ngày giỗ tổ vui vẻ
                  Phần cứng: ra chợ trời mua một con mắt thu phát(mình mua 15k) về và với mấy con trở là xong.
                  Bên phát: nối một chân của led phát qua trở 1k vào nguồn và đất luôn.
                  Bên thu: Chân K nối xuống đất, chân A nối về chân INT của VDK và được treo lên dương nguồn bằng trở 10k.
                  Hoạt động: khi đĩa lỗ quay, con thu sẽ thu được tín hiệu từ con phát nếu có lỗ quay qua -> khi đó con thu sẽ thông xuống đất(con thu thực ra là một con photo diode) và sẽ đưa tín hiệu mức thấp về VDK và ngược lại.
                  Cách đo: đo độ rộng của khoảng 10 xung liên tiếp, và lấy giá trị trung bình, dựa vào tần số hoạt động của timer để tính ra tốc độ động cơ.

                  Comment


                  • #10
                    Các pác ạ, em lại có một thắc mắc nữa là: khi dùng timer để đo khoảng xung, sợ mỗi lần đo sẽ bị tràn do timer0 thì chỉ có 8bit, timer1 thì có 16bit nên em có đặt thêm một biến đếm để đếm số lần tràn timer để tính toán cho chính xác. Nhưng lại gặp vấn đề về việc khai báo kiểu biến.

                    VD: khai báo
                    unsigned int measure;
                    thì chương trình chạy không báo lỗi nhưng dám chắc là sẽ sai khi độ rộng của xung lớn.
                    khai báo
                    unsigned long int measure;
                    thì lại bị cảnh báo. Và em đã thử rồi, thấy chạy sai.

                    công thức tính toán của em:
                    measure = count_timer*65536 + timer_high * 256 + timer_low
                    Các bác có cách khắc phục chỉ cho em với. Thank's.

                    Comment


                    • #11
                      Hà hà. Em lại làm theo một cách khác đơn giản hơn các bác ạ. Em dùng timer tính toán khoảng 1s, trong thời gian đó, em cho ngắt ngoài đếm và tăng biến đếm lên. Khi timer chạy đủ 1s thì đọc giá trị đếm là biết một giây có bao nhiêu xung. -> đơn giản hơn các bác nhỉ.

                      Comment


                      • #12
                        - Đơn giản nhưng chưa hẳn đã hoạt động, giả sử encoder đưa về 40 xung một phút, liệu 1 s bác đếm được mấy xung? Ví dụ tiếp, giả sử động cơ quay ở 150 vòng / phút, tức 1 giây quay được 2 vòng, liệu 1s của bác đủ thời gian đọc được chính xác số lần encoder không?

                        - Việc phụ thuộc vào thời gian ngắt của timer khiến cho chương trình của bác mất tính mềm dẻo, thay vì đọc theo timer, sao bác không sử dụng counter, đếm 10 xung hết bao nhiêu giây để tính ngược lại?
                        Mồm chó vó ngựa

                        Comment


                        • #13
                          Nếu để đo tốc độ sao ko dùng Input Capture để đo độ rộng xung nhỉ?
                          AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                          Xem thêm tại Online Store ---> Click here
                          Mob: 0982.083.106

                          Comment


                          • #14
                            Nguyên văn bởi sun_rise Xem bài viết
                            Hà hà. Em lại làm theo một cách khác đơn giản hơn các bác ạ. Em dùng timer tính toán khoảng 1s, trong thời gian đó, em cho ngắt ngoài đếm và tăng biến đếm lên. Khi timer chạy đủ 1s thì đọc giá trị đếm là biết một giây có bao nhiêu xung. -> đơn giản hơn các bác nhỉ.
                            hi Sunrise!
                            mình cũng đang đo tốc độ động cơ,nhưng động cơ của mình có gắn với encoder ,với độ phân giải của Encoder là 200xung/vòng,mình nghĩ là cậu nên cũng mua encoder gắn với Động cơ thì ổn hơn,với lại encoder tự làm thì độ phân giả ko cao(đây là ý kiến của mình thôi nhé),àh mình thấy ý kiến của Yankaxza hợp lý đấy
                            à,mình cũng đã test đươjc đếm xung theo cách dùng ngắt ngoài để đếm xung trong khoảng 20ms(thời gian này do T2 tạo ra)
                            // External Interrupt 0 service routine
                            interrupt [EXT_INT0] void ext_int0_isr(void)
                            {
                            // Place your code here

                            ++dem_xung;

                            }

                            // Timer 2 overflow interrupt service routine
                            interrupt [TIM2_OVF] void timer2_ovf_isr(void)
                            {
                            // Place your code here
                            TIMSK=0x00; // cam ngat Timer 2
                            GICR|=0x00; // CAM NGAT NGOAI O
                            dem_xung1=dem_xung; // luu gia tri dem cung vao dem_xung1
                            }
                            Sun-rise xem thế naò nhé,mình lập trình cũng kém nên xem thế nào
                            Mỗi lần mình rút nguồn ra thì số xung đếm được lại khác(có thể mình đếm xung khi mà động cơ chứa ổn định và vẫn cònd trong thời gian quá độ)
                            Mà muốn để T2 đinh khoảng thời gian là 20ms thì trong chương trình của ngắt T2 ta đặt giá trị TCNT2 là 100,để T2 sẽ đếm từ 100 đến 255 thì nó lại nhảy tới ngắt và quá trình lại tiếp tục như vậy à?
                            Trong chương trình đếm xung của mình trên là mình chỉ đếm xung trong khoảng 20ms rồi lại dừng T2 và cấm ngắt ngoài luôn

                            Comment


                            • #15
                              Bạn rút điện ra có thể kích hoạt ngắt ngoài gây tăng xung. Bạn thử kiểm tra xem có đúng ko. Thử cho nó tăng lên 10 rồi rút ra có bị ảnh hưởng ko.
                              AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                              Xem thêm tại Online Store ---> Click here
                              Mob: 0982.083.106

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X