Tìm người làm bài tập thực hành: Bộ ĐK PID động cơ DC

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • buoiit
    Nhập môn đệ tử
    • Dec 2007
    • 2

    #391
    Chào tất cả các anh, em muốn làm một cái mô hình điều khiển PID động cơ DC như các anh đã làm hiện tại em đã làm xong phần mô hình và mạch cầu H dùng IR2110 như anh namqn đã post lên, em đã đọc tất cả các bài viết trong luồng này nhưng vẩn có một số thắc mắc mong các anh chỉ giáo:
    + Cái động cơ em mua của đức tra cataloge như hình

    có phải cái động cơ này encorder có số xung /vong là 1000 không ? (nó ghi 1000 lmp/umdr vì là tiếng đức nên em pó tay)
    + Em muốn cho động cơ chỉ chạy theo 1 chiều cố định thì em sẽ nối chân Pwm ở vi điều khiển vào Q1 và Q4; và Q2,Q3, hai chân Shutdown ở 2 con IR2110 em nối GND làm như vậy có được không?

    Xin mời các anh xem mô hình của em



    Comment

    • namqn
      Trưởng lão PIC bang
      • Feb 2006
      • 3020

      #392
      Nguyên văn bởi buoiit View Post
      Chào tất cả các anh, em muốn làm một cái mô hình điều khiển PID động cơ DC như các anh đã làm hiện tại em đã làm xong phần mô hình và mạch cầu H dùng IR2110 như anh namqn đã post lên, em đã đọc tất cả các bài viết trong luồng này nhưng vẩn có một số thắc mắc mong các anh chỉ giáo:
      + Cái động cơ em mua của đức tra cataloge như hình

      có phải cái động cơ này encorder có số xung /vong là 1000 không ? (nó ghi 1000 lmp/umdr vì là tiếng đức nên em pó tay)
      + Em muốn cho động cơ chỉ chạy theo 1 chiều cố định thì em sẽ nối chân Pwm ở vi điều khiển vào Q1 và Q4; và Q2,Q3, hai chân Shutdown ở 2 con IR2110 em nối GND làm như vậy có được không?

      Xin mời các anh xem mô hình của em



      + Có lẽ 1000 imp/umdr là 1000 xung/vòng rồi, vì với encoder thì còn thông tin gì khác ngoài độ phân giải đâu.

      + Bạn không cho biết sơ đồ của bạn ra sao thì làm sao biết Q1 đến Q4 là những linh kiện gì. Tôi đã post lên vài sơ đồ trong luồng này, làm sao biết được bạn dùng sơ đồ nào.

      Thân,
      Biển học mênh mông, sức người có hạn.

      Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
      http://www.picvietnam.com/forum/showthread.php?t=1263

      Comment

      • buoiit
        Nhập môn đệ tử
        • Dec 2007
        • 2

        #393
        chào anh namqn em làm cái mạch cầu H theo sơ đồ nguyên lý anh post ở #281 trong luồng này, vây em muốn cho động cơ chỉ chạy theo 1 chiều cố định thì em sẽ nối chân Pwm ở vi điều khiển vào Q1 và Q4; và Q2,Q3, hai chân Shutdown ở 2 con IR2110 em nối GND làm như vậy có được không?

        Comment

        • namqn
          Trưởng lão PIC bang
          • Feb 2006
          • 3020

          #394
          Nguyên văn bởi buoiit View Post
          chào anh namqn em làm cái mạch cầu H theo sơ đồ nguyên lý anh post ở #281 trong luồng này, vây em muốn cho động cơ chỉ chạy theo 1 chiều cố định thì em sẽ nối chân Pwm ở vi điều khiển vào Q1 và Q4; và Q2,Q3, hai chân Shutdown ở 2 con IR2110 em nối GND làm như vậy có được không?
          Giả sử động cơ quay theo chiều thuận khi dòng điện đi vào động cơ từ trái sang phải (nhìn trên sơ đồ).

          Để động cơ quay theo chiều thuận:
          - Q3 ngắt (off) thường trực, Q4 đóng (on) thường trực
          - Q1 và Q2 có tín hiệu PWM ngược nhau

          Để động cơ quay theo chiều ngược:
          - Q1 ngắt (off) thường trực, Q2 đóng (on) thường trực
          - Q3 và Q4 có tín hiệu PWM ngược nhau

          Nếu không dùng chân Shutdown thì có thể nối đến GND.

          Nếu bạn không có nhu cầu đảo chiều thì không cần sử dụng cầu H, chỉ cần dùng mạch truyền động đơn giản đính kèm dưới đây.

          Thân,
          Attached Files
          Biển học mênh mông, sức người có hạn.

          Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
          http://www.picvietnam.com/forum/showthread.php?t=1263

          Comment

          • dvnccbmacbt
            Đệ tử 4 túi
            • May 2007
            • 65

            #395
            Nguyên văn bởi scentoflove View Post
            Biết ai ko mechatronic, he he làm interface xấu quá. Interface nè

            dao động liên tục

            dao động tắt dần

            vọt lố

            vọt lố sau đó tiến tới set point


            Cái nét cuối đồ thị là do soft thêm vào ko phải đáp ứng động cơ. làm cho mình xài nên mọi người đừng chê nha buồn lắm đó.

            Có bác nào làm phần giao tiếp vói máy tính dùng Matlab qua cổng Com chưa ạ? Em đang học giao tiếp với máy dùng Matlab nên muốn tham khảo cách viết. Có thể post code lên được không ạ? Mong mọi người giúp đỡ.

            namqn: bạn tham khảo bên box dành cho lập trình cổng COM và LPT, bên đó có một số luồng liên quan đến giao tiếp với cổng COM bằng MATLAB. Bạn đã hỏi ở đó về vấn đề này rồi thì không nên post ở những luồng không liên quan.
            Last edited by namqn; 19-02-2008, 07:49 PM.

            Comment

            • tuyenqs
              Nhập môn đệ tử
              • Aug 2007
              • 3

              #396
              đề tài này giờ bỏ trống hả các Bác?

              namqn: đề tài này đã kết thúc, đã có nhiều người thực hành, và đã báo cáo kết quả, bạn đọc lại luồng này nhé.
              Last edited by namqn; 15-04-2008, 12:36 AM.

              Comment

              • phanyen
                Đệ tử 1 túi
                • Apr 2008
                • 16

                #397
                nghe nói e cũng khoái lăm , vì e cung đang lam bài tập lớn với nội dung như trên nhưng không làm phần cứng . nếu được làm thì hay biết mấy . bác nào biết nhiều nhiều chỉ em với
                thân ái !

                Comment

                • phanyen
                  Đệ tử 1 túi
                  • Apr 2008
                  • 16

                  #398
                  liên hệ với em theo địa chỉ này nè ! nguyenson8486@yahoo.com or Mr.son84@gmail.com

                  Comment

                  • phanyen
                    Đệ tử 1 túi
                    • Apr 2008
                    • 16

                    #399
                    chào các bác !
                    e cũng đang làm bài tập lớn về phần này . nếu được tham gia thì hay biết mấy ! cùng nhau làm các bác nhe !
                    Mr.son84@gmail.com

                    Comment

                    • phanyen
                      Đệ tử 1 túi
                      • Apr 2008
                      • 16

                      #400
                      em cũng muốn tham gia . anh F giúp em nhé !
                      địa chỉ của e nè : nguyễn thành sơn
                      148/8b đường ung văn khiêm - bình thạnh

                      Comment

                      • jean
                        Đệ tử 1 túi
                        • Jan 2007
                        • 21

                        #401
                        Nguyên văn bởi bluepine View Post
                        Code:
                        #include <16f877a.h>
                        #fuses HS,NOPROTECT,NOWDT,NOBROWNOUT
                        #use delay (clock = 20000000)
                        // Giao tiep vi dieu khien
                        #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8) // Giao tiep RS232
                        
                        #include <stdlib.h>
                        #include <string.h>
                        #include <math.h>
                        #include<ctype.h>
                        
                        
                        #byte PR2 = 0x92
                        
                        int16 e2;
                        int16 e1;
                        ///////////////////////////////////////////////////////
                        
                        int16 v_set = 350;
                        
                        /////////////////////////////////////////////////////////
                        int16 v_cur;
                        int16 e_sum;
                        int16 e_del;
                        int16 flag_timer0;
                        
                        
                        //////////////////// cac thong so pid ban co the thay doi cho 
                        //////////////////// phu hop voi dong co cua ban
                        unsigned long kp =2.5;
                        unsigned long ki = 0.0092;
                        unsigned long kd = 0;
                        ////////////////////////////////////////////////////////////
                        
                        int16 i = 1 ;
                        int16 pw_duty;
                        int16 counted_round_value;
                        int16 temp_timer0;
                        int16 temp_timer1;
                        int16 update_counted_round_value;
                        
                        //#byte TMR0 = 0x01 //timer0 REGISTER
                        //#byte TMR1_L = 0X0E
                        //#byte TMR1_H = 0X0F
                        
                        #define START_VALUE_TIMER0 5 //tri khoi tao ban dau cua timer0 5, so xung dem duoc moi khi ngat la 255 - 5
                        #define START_VALUE_TIMER1 5535 //tri khoi tao ban dau cua timer1 65536-5536=60000
                        
                        
                        #INT_TIMER0 // ngat timer0 tang bien len 1
                        void TIMER0_int()
                        {
                        
                        set_timer0(START_VALUE_TIMER0);
                        i++;
                        
                        ///////////// ban sai cho nay
                        
                        if(i==60 ){
                        
                        temp_timer1 = get_timer1();
                        set_timer1(START_VALUE_TIMER1);
                        i=0;
                        
                        v_cur =  2*(temp_timer1 - START_VALUE_TIMER1);
                        
                        flag_timer0 = 1;
                        }
                        
                        }
                        
                        #INT_TIMER1  /// thuc hien khi ngat timer 1
                        void timer1_int(){
                        set_timer1(START_VALUE_TIMER1);
                        
                        
                        }
                        
                        void init_timer0()
                        {
                        
                        setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16); // moi lan tran timer0 tuong ung 250*16*1/5 us = 0.8ms,chu ky lay mau=0.8*60=48ms
                        
                        
                        setup_timer_1(T1_EXTERNAL | T1_DIV_BY_2); //  he so chia la 2 moi lan tran timer0 , khoi tao lai luon gia tri dem xung timer1
                        
                        enable_interrupts(GLOBAL);
                        enable_interrupts(INT_TIMER0);
                        enable_interrupts(INT_TIMER1);
                        
                        }
                        
                        void init_PWM(int16 frequency){
                        
                        setup_ccp1(CCP_PWM); // initiate PWM
                        PR2 = 20000000/4/frequency - 1; // set PWM period
                        
                        setup_timer_2(T2_DIV_BY_1,255,1); // initiate time 2 The cycle time will be (1/clock)*4*t2div*(period+1)
                        // (1/20000000)*4*1*(255+1) = 51.2 us( will over flow every 51.2 us, will intrup every 51.2 uS or 19.5 khz;
                        
                        }
                        
                        void cal_pid(){
                        
                        long temp_kp;
                        long temp_ki;
                        long temp_kd;
                        e2 = v_set - v_cur;
                        e_sum += e2;
                        e_del = e2 - e1;
                        e1 = e2;
                        
                        temp_kp = kp*e2;
                        temp_ki = ki*e_sum;
                        temp_kd = kd*e_del;
                        pw_duty +=temp_kp;
                        
                        if (pw_duty <1000)
                        pw_duty += temp_ki;
                        if (pw_duty <1000)
                        pw_duty += temp_kd;
                        if (pw_duty <256) // vi khi pw_duty <256 thi PWM chi dieu rong xung 8 bit / //chu khong phai 10 bit,
                        pw_duty = 256;
                        if (pw_duty >1000) // bao hoa
                        pw_duty = 1000;
                        
                        printf(" \t%ld", v_cur); // truyen toc do xung ve may tinh hien thi tren Hyperterminal
                        }
                        
                        void main()
                        {
                        int8 timer0_value;
                        
                        init_timer0();
                        init_PWM(19500);
                        //set_pwm1_duty(500);
                        while(true){
                        if (flag_timer0 ==1){
                        flag_timer0 = 0;
                        cal_pid();
                        set_pwm1_duty(pw_duty);
                        }
                        }
                        }
                        tôi có gửi cho bạn đoạn code để bạn so sánh
                        thân,
                        theo tôi biết thì trong ccs c, nếu 1 biến khai báo là int16 thì mặc định biến đó là biến không dấu. tuy nhiên, sai số e1, e2 lại là số có dấu. Như vậy đoạn code ở trên có hợp lý không?
                        unsigned long ki = 0.0092. nếu khai báo như thế này thì ki là số nguyên phải không? Nếu vậy thì ki ở đây sẽ bằng 0. Không biết tôi có sai chỗ nào không. Các bạn góp ý nhé

                        Comment

                        • namqn
                          Trưởng lão PIC bang
                          • Feb 2006
                          • 3020

                          #402
                          Hai vấn đề bạn jean thảo luận đều đúng.

                          Nếu không dùng directive #TYPE signed để định nghĩa lại kiểu mặc định là signed thì các khai báo int16 đều được CCS C hiểu ngầm là số không dấu => có vấn đề, vì sai số nên được biểu diễn bằng số có dấu.

                          kd, ki đều dùng kiểu số thực khi đặt giá trị, nhưng lại khai báo là unsigned long. Có 2 khả năng xảy ra, CCS C sẽ chuyển kiểu biểu thức thành kiểu của biến (có vấn đề) hay chuyển kiểu của biến thành float để có thể chứa giá trị của biểu thức (không có vấn đề). Tôi không dùng CCS C nên không thể đánh giá được. Nhờ các bạn khác có sử dụng CCS C đánh giá vấn đề này.

                          Nói chung, không nên để trình biên dịch làm chủ chúng ta, mà chúng ta nên làm chủ trình biên dịch, tức là hiểu rõ phải viết code C ra sao để có được kết quả mong muốn. Nếu chưa hiểu được trình biên dịch sẽ dịch code đang đặt nghi vấn ra sao, tại sao chúng ta không viết code thử nghiệm, biên dịch nó, và đánh giá kết quả bằng việc mô phỏng/thử nghiệm.

                          Thân,
                          Biển học mênh mông, sức người có hạn.

                          Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                          http://www.picvietnam.com/forum/showthread.php?t=1263

                          Comment

                          • kstn
                            Đệ tử 1 túi
                            • Feb 2006
                            • 21

                            #403
                            cầu h dùng ir2101

                            Xin các cao thủ chỉ giúp xem mạch cầu h này có vấn đề gì không, cách chọn CV1,CV2 như thế nào
                            Attached Files

                            Comment

                            • namqn
                              Trưởng lão PIC bang
                              • Feb 2006
                              • 3020

                              #404
                              Nguyên văn bởi kstn View Post
                              Xin các cao thủ chỉ giúp xem mạch cầu h này có vấn đề gì không, cách chọn CV1,CV2 như thế nào
                              Các mạch đệm BJT của bạn làm giảm tác dụng của mạch bootstrap, dẫn đến các MOSFET phía cao sẽ không dẫn bão hòa. Cụm R, C, D có lẽ không cần thiết. Sơ đồ ứng dụng đã có trong datasheet của IR2101.

                              Giá trị CV2 có thể chọn là 1 uF, dùng tụ tantalum 16 V (hoặc 25 V), đặt càng gần IR2101 càng tốt.

                              Thân,
                              Biển học mênh mông, sức người có hạn.

                              Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                              http://www.picvietnam.com/forum/showthread.php?t=1263

                              Comment

                              • kstn
                                Đệ tử 1 túi
                                • Feb 2006
                                • 21

                                #405
                                Hỏi Về Cầu H Ir2101

                                Nhân tiện xin hỏi nếu làm cầu h bằng ir2101 thì chất lượng có cao không vì con này kích dòng hơi nhỏ (0.3A). Nếu thay BYV79E bằng n5819 thì có sao kô vì byv79e khá mắc. Cầu h này có thể chạy 20khz được không (nếu bỏ các bộ đệm BJT).
                                chúc thắng lợi!

                                Comment

                                Working...