Thông báo

Collapse
No announcement yet.

Lam the nao de viet chuong trinh PID cho VDK

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

  • Lam the nao de viet chuong trinh PID cho VDK

    Chào các anh, em muốn viết chương trình điều khiển PID cho VDK nhưng lại không biết bắt đầu như thế nào (tức đọc những tài liệu gì)? Cấu trúc một hương trình PID gồm những gì? Mong nhận được sự giúp đỡ từ các anh!!!
    Em xin cám ơn.

  • #2
    Cậu nên học về điều khiển số !!! Tài liệu "Điều khiển số" Nếu là SV BKHN thì đến khoa điện K47 trở lên xin tài liệu về điều khiển số của thầy Nguyễn Phùng Quang !!!
    Rất hay và rõ ràng !!!
    He he he !!!

    Comment


    • #3
      Và tất nhiên cũng nên biết PID là gì .Giáo trình "Lý thuyết điều khiển tự động 1"Liên hệ Ngô Hải Bắc để biết thêm chi tiết !!!

      Comment


      • #4
        //-----------------------------------------------------
        // PID_Control()
        //-----------------------------------------------------

        float PID_Control(float Error, float Control_Old)
        {
        /* Proportional term */
        float Control_New = Control_Old + (PID_KP*Error);
        /* Integral term */
        Sum_G += Error;
        Control_New += PID_KI*Sum_G;
        /* Differential term */
        Control_New += (PID_KD*SAMPLE_RATE*(Error - Old_Error_G));

        /* Optional windup protection */
        if(PID_WINDUP_PROTECTION)
        {
        if((Control_New>PID_MAX)||(Control_New<PID_MIN))
        {
        Sum_G-=Error; /* Don't increase Sum... */
        }
        }
        /* Control_new cannot exceed PID_MAX or fall below PID_MIN */
        if (Control_New>PID_MAX)
        {
        Control_New = PID_MAX;
        }
        else
        {
        if(Control_New<PID_MIN)
        {
        Control_New=PID_MIN;
        }
        }
        /* Store error value */
        Old_Error_G = Error;

        return Control_New;
        }
        Ban co the tham khao doan chuong trinh PID viet bang C cho vi xu ly nay.

        Comment


        • #5
          Ban TramHero thật là người tốt !!!
          Theo tại hạ thì "Làm sao mà viết được"="Từ yêu cầu bài toán kỹ thuật->Không gian toán học (mô hình toán học)->Giải trên không gian toán học (Tìm ra luật điều khiển)->Cài đặ trên đốit tượng kỹ thuật(Viết chương trình)"

          Comment


          • #6
            Mình nghĩ trong Box này đã có người nói rất kĩ về bộ điều khiển PID rồi đó bạn ạ. Bạn tìm hiểu đọc kĩ lại. Và có luồng trong box này nói về cách xác định các tham số của bộ PID trong thực tế.

            Bạn cần phải chú ý là các tham số của bộ PID mình sẽ lấy ở đâu. Với một đối tượng nhất định để đảm bảo cho hệ ổn định thì cần phải chọn được tham số PID phù hợp sao cho hệ có độ quá điều chỉnh nhỏ nhất (tùy yêu cầu về độ ổn mà cái này là bao nhiêu %) và thời gian quá độ phải ngắn (hệ nhanh đạt đến trạng thái ổn định mới nhanh nhất), và số lần dao động quanh trạng thái ổn định phải nhỏ (thường yêu cầu <3 lần).Các tham số này bạn tinh chỉnh theo kinh nghiệm là chính, và nó lên lấy từ trên PC xuống hoặc bằng nút bấm.

            Còn về thuật toán thì bộ khuếch đại P thì đơn giản rùi. Còn bộ I bộ tích phân thì bạn dùng cộng dồn,... . Bạn chú ý từng đối tượng mình sẽ có tín hiệu phản hồi thế nào, biến đổi thế nào?

            Trong thực tế, anh F, BA, AFH,.. đang nghiên cứu bộ PID Auto-routing tức là tự thay đổi tham số PID theo đối tượng. Nếu cái này thành công thì ăn đứt bọn nước ngoài rồi.Các anh cố lên.

            Chúc bạn thành công.
            Technical sale at WT Microelectronics S'pore
            Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
            Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

            Comment


            • #7
              Cám ơn mọi người đã nhiệt tình reply giúp mình. Mình hy vọng sẽ nhận được nhiều lời khuyên, chỉ dẫn hơn nữa.
              Cám ơn mọi người nhiều.

              Comment


              • #8
                Rất mong nhận được nhiều sự đóng góp của các bác ,em cũng đang quan tâm vấn đề này ! Tài liệu của thầy Phùng Quang và thầy Phước em cũng đã có ,các bác chia sẻ thêm !
                Và anh biết là khi bên em, anh sẽ vượt qua tất cả

                Comment


                • #9
                  Trong thiết kế PID cho VĐK, tức là lập trình cho hệ điều khiển PID số (digital PID control system), nên áp dụng các thuật toán như finite-difference approximation of derivatives (tính gần đúng sai phân hữu hạn của đạo hàm) và finite difference approximation of integrals (tính gần đúng sai phân hữu hạn của tích phân). Nếu có tham khảo cuốn Vegte, John Van de (1994), Feedback control systems, Prentice Hall, trang 276-277.

                  Có hai chú ý sau, xin trích nguyên văn một đoạn như sau:

                  --- quoted ---

                  Two problems that can arise in both continuous and discrete sytsems when PID control is present, are the following:

                  1. Reset windup or integral windup can occur when integral control is present. For large changes of input or large disturbance it can lead to severe transient oscillations. To avoid the growth of the integrator output that causes this, one solution in control algorithm is to clamp the integrator output to prevent values outside selected (HI - high) and LO (Low) limits:

                  If I > HI then I = HI
                  If I < LO then I = LO

                  (giống như set limits (high and low) cho tín hiệu điều khiển mà có người đã trình bày, tuy nhiên ở đây set limits trực tiếp cho thành phần tích phân luôn).

                  2. Derivative control cause impulses in the control signal u, because a step change of the system input implies a step change of the error e, and so an impulse in e_dot. This is why a derivative of the output is often used instead of a derivative of the error to realize this form of control.

                  --- unquoted ---

                  Ngoài cách tính thành phần tích phân trên, có thể sử dụng các numerical integration methods, ví dụ pp Euler, Runge-Kutta (trong cuốn Toán cao cấp của bác Nguyễn Đình Trí có viết). Theo tôi, công thức của Tremhero

                  Sum_G += Error; có thể sửa lại chút đỉnh thành:

                  Sum_G += SampleRate*Error; // đây là công thức Simple Euler method

                  Thành phần vi phân:

                  SAMPLE_RATE*(Error - Old_Error_G));

                  có lẽ phải sửa lại thành:

                  ViPhan = (Error - Old_Error)/SampleRate; // đây chính công thức sai phân lùi - backward difference, viết bằng công thức toán chính là: Del_Error = [Error(k) - Error(k-1)]/Del_t (trong hệ liên tục ta có công thức đạo hàm d_Error/dt = lim (giới hạn) của Del_Error/Del_t khi Del_t -> 0).

                  Trong chủ đề về điều khiển PID cũng đã có nhiều người trình bày về PID control rồi. Muốn học sâu thêm về PID control nữa để tìm các khuếch đại điều khiển Kp, Ki, Kd thì cần tham khảo thêm phần phân tích ổn định hệ thống điều khiển, eg Root locus method, Nyquist stability criterion (Bode diagram, Nyquist diagram, Nichol diagram) và Lyapunov stability criterion. MATLAB 7.0 trở nên có thể giúp bạn phân tích ổn định và tìm khuếch đại dể dàng hơn, xin tham khảo trang sau:

                  http://edu.levitas.net/Tutorials/Matlab/Simulink/

                  MATLAB cũ hơn có thể tham khảo trang sau:

                  http://www.engin.umich.edu/group/ctm/index.html

                  Chúc bạn sớm chạy được chương trình điều khiển PID ra kết quả tốt.

                  H.Â.

                  Comment


                  • #10
                    Xin bổ sung, ai dùng MATLAB/Simulink có thể tham khảo chương trình mô phỏng cho hệ thống điều khiển PID ở địa chỉ sau:

                    http://academic.amc.edu.au/~hnguyen/...delling-01.pdf

                    Ở trang đánh số 95 đến cuối. Trong đó có 2 ví dụ: Hệ thống lái tự động PID cho tàu thủy (PID Autopilot System for Ship), và hệ thống điều khiển PID cho mực chất lỏng (PID Liquid Level Control System) (Xin lỗi tôi chỉ có tài liệu tiếng Anh thôi). Đối tượng điều khiển có thể khác nhau, xong thuật toán điều khiển PID có thể tham khảo được. Xin lưu ý rằng có nhiều cách tính thành phần tích phân (forward rectangular rule, backward rectangular rule, trapezoidal rule...) và vi phân khác nhau (eg forward diference, backward difference, central difference...). Trong ví dụ mô phỏng, tôi dùng Simple Euler Method cho thành phần tích phân, và dùng Backward Difference cho thành phần vi phân. MATLAB codes có thể chuyển đổi dễ dàng sang C/C++ hoặc Fortran.

                    H.Â.

                    Comment


                    • #11
                      Tôi vừa kiếm được cuốn sách sau có thể có ích cho những người học nhập môn điều khiển tự động và làm software developer trong ngành phát triển hệ thống điều khiển nhúng (embedded control systems). Cuốn sách có nội dung như sau:

                      Embedded Control Systems in C/C++
                      An Introduction for Software Developers Using MATLAB
                      by Jim Ledin (2004, CMP Books, San Francisco, CA, USA)

                      Table of Contents
                      Chapter 1 Control Systems Basics
                      Chapter 2 PID Control
                      Chapter 3 Plant Models
                      Chapter 4 Classical Control System Design
                      Chapter 5 Pole Placement
                      Chapter 6 Optimal Control
                      Chapter 7 MIMO Systems
                      Chapter 8 Discrete-time Systems and Fixed-point Mathematics
                      Chapter 9 Control System Integration and Testing
                      Chapter 10 Wrap-up and Design Example
                      (Có kèm CD-ROM có chương trình mẫu bằng MATLAB/Simulink)

                      Xin xem thêm chi tiết tại:

                      http://img.cmpnet.com/cmpbooks/pdfs/1578201276_toc.pdf

                      http://www.cmpbooks.com/product/1062

                      Theo tôi sử dụng cuốn này với một cuốn khác về điều khiển tự động sẽ phát triển được kỹ năng thực hành (lập trình, chế tạo thiết bị điều khiển đơn giản). Cuốn này là cuốn sách nhỏ có lẽ dễ hiểu, ít lý thuyết và tập trung vào mặt lập trình ứng dụng. Cuốn sách viết về ba dạng điều khiển cơ bản nhất: PID Control, Pole Placement và Optimal Control.

                      H.Â.

                      Comment


                      • #12
                        Có nhiều cách tính tín hiệu điều khiển PID. Tôi xem lại công thức tính của Tramhero:

                        Control_New = Control_Old + (PID_KP*Error);
                        /* Integral term */
                        Sum_G += Error;
                        Control_New += PID_KI*Sum_G;
                        /* Differential term */
                        Control_New += (PID_KD*SAMPLE_RATE*(Error - Old_Error_G));

                        Tôi diễn giải lại không thức của bạn thành:

                        u(k) = u(k-1) + Kp*Error(k) + Ki*Sum_G(k) + Kd*ST*[Error(k)-Error(k-1)]

                        (ST = sampling time, giống Sample Rate như công thức của bạn)

                        Như vậy có đúng không? Bạn nào đã chạy thử chương trình này chưa? Kết quả thế nào?

                        Công thức của Tramhero đưa ra có lẽ giống công thức sau (theo Vegte, John Van de 1994, Feedback Control Systems, p.278) có điều chỉnh bớt đi một số hạng, tuy nhiên tích ST trong số hạng vi phân (derivative) có gì đó chưa ổn như lần trước tôi đã trao đổi.

                        Công thức gần đúng sai phân hữu hạn (finite-difference approximation) của công thức PID control (lấy đạo hàm hai vế của công thức PID control gốc):

                        udot = Kp*edot + Ki*e + Kd*edotdot (1)

                        Dùng công thức sai phân lùi (backward differences), có thể tính như sau:

                        udot = [u(k) - u(k-1)]/T; // T là sampling time
                        edot = [e(k) - e(k-1)]/T
                        e = y(k) - r(k); // sai so^'
                        edotdot = [e(k)-2*k(k-1)+e(k-2)]/(T^2)

                        Thay thế các giá trị này vào (1), giản lược T hai vế và chuyển u(k-1) sang vế phải sẽ được công thức tính u(k):

                        u(k) = u(k-1) + Kp*[e(k) - e(k-1)]/T + Ki*e(k) + Kd*[e(k)-2*k(k-1)+e(k-2)]/T (2)

                        Nếu bỏ số hạng e(k-2) thì (2) sẽ trở thành công thức công thức gần giống như công thức Tramhero đưa ra, tuy nhiên không xuất hiện tích SAMPLE_RATE trong số hạng vi phân.

                        H.Â.

                        Comment


                        • #13
                          Anh HA phát hiện rất đúng.
                          Công thức về PID thì đơn giản, nhưng một số người đã viết sai. Có thể khi thử nghiệm, họ căn chỉnh hệ số. vô tình thì vẫn chạy được ở vị trí nào đó, nhưng hệ ko ổn định.
                          Vậy côg thức của anh HA đưa ra ở trên, có thể biến đổi tạo thành các công thức hơi lạ mắt khác. Vậy trong lập trình, thì nên chọn một công thức nào để tối ưu nhất trong lập trình và căn chỉnh?

                          Comment


                          • #14
                            Dạo này hơi bận nên không thể viết nhiều thành nguyên lý được(mình chép lại thôi) nhân đây mình chỉ đưa ra công thức mọi người xem thế nào:
                            u(n)=Kp*e(n)+Ki*T*Sum(e(n))+KD*(e(n)-e(n-1))/T;
                            Thong thuong khi nhan bang tay các tham số P,I,D mình thấy hay dùng công thức này

                            Thực ra ở đây T*Sum(e(n)) chính là công thức tính gần đúng tích phân của hàm sai số e(t) theo thời gian, phần còn lại chính là gần đúng của công thức tính vi phân.

                            Các bạn có thể tham khảo chi tiết hơn các công thức này trong tài liệu AN964 của Microchip(dễ tìm thôi mà_ Đây là một App rất hay đấy).
                            |

                            Comment


                            • #15
                              chào bác minhpic1, em không nhầm thì công thức của bác thiếu u(n-1). Em hay sử dụng công thức thêm u(n-1) so với công thức của bác.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X