Đây là một đoạn code mình viết theo một tài liệu hướng dẫn trên mạng :
Cho mình hỏi tại sao ở đây sử dụng Duty ( chữ màu đỏ )
Theo mình nghĩ thì nó phải là giá trị Duty_set ( được thiết đặt để có V_set mong muốn nào đó .) chứ không phải là Duty .
Như vậy ở đoạn code trên thì Duty thì liên tiếp được cộng dồn có phải không ?
Ai biết thì chỉ dùm mình với !
Còn đây là một hướng dẫn trên mạng :
Mình đọc đoạn này thì thấy khó hiều quá . ko biết đây là PID theo tốc độ hay theo vị trí . Nếu là PID theo tốc độ thì tại sao lại có đoạn :
Nếu vậy thì khi sai lệch Output = 0 thì PWM = 0 à . Đoạn này mình không hiểu .
Hàm truyền PID :
Vậy đối với PID theo tốc độ và PID theo vị trí thì giá trị I0 khác nhau thế nào .
Mình đã đọc một số bài lập trình trên mạng và có đọc qua cơ sở lý thuyết điều khiển PID nhưng không hiểu được phải viết hàm PID theo vị trí và PID theo tốc độ thế nào cả .... Các bài ví dụ trên mạng mỗi người làm một kiểu . mình càng đọc càng băn khoăn khó hiểu .
Nay viết lên đây mong anh chị em cô bác nào hiểu thấu có thể chỉ giáo cho em chút ít để mở rộng tầm hiểu biết của mình được không ? Cảm ơn mọi người trước nhé ....
PHP Code:
void PID_tocdo(void)
{
Err_now = V_set - V_real ;
Err_sum = Err_now + Err_last ;
Err_del = Err_now - Err_last ;
Err_last = Err_now ;
Duty = Duty + Kp*Err_now + Ki*Err_sum + Kd*Err_del ;
if ( Duty > 255 ) Duty = 255 ;
else if ( Duty < 0 ) Duty = 0 ;
}
Duty = Duty + Kp*Err_now + Ki*Err_sum + Kd*Err_del ;
Như vậy ở đoạn code trên thì Duty thì liên tiếp được cộng dồn có phải không ?
Ai biết thì chỉ dùm mình với !
Còn đây là một hướng dẫn trên mạng :
PHP Code:
Các biến được sử dụng:
- Speed: Tốc độ động cơ, tính bằng số xung đếm được trong một thời gian lấy mẫu Ts(đã định sẵn)
- Set_Point: Giá trị cài đặt, dùng tham chiếu với Speed nên có cùng đơn vị và công thức chuyển đổi
- int Error_Acc: Tích lũy sai số.
- int This_Error: Sai số hiện hành
- int Last_Error: Sai số lần trước (ngôn ngữ hơi phi kỹ thuật chút)
- int P_Gain, I_Gain, D_Gain: Độ lợi khâu P, I, D
- int P_Term, I_Term, D_Term: giá trị khâu P, I, D
- int Output: giá trị ngõ ra điều khiển, tỷ lệ với giá trị set cho PWM.
Các bước tính
- Cập nhật sai số:
This_Error = Set_Point - Speed;
- Tích lũy sai số:
Error_Acc = Error_Acc + This_Error;
- Lưu sai số:
Last_Error = This_Error;
- Tính khâu tỷ lệ:
P_Term = This_error * P_Gain;
if (P_Term>32767) P_Term=32767; //Correct out of range
if (P_Term<-32768) P_Term=-32768; //Correct out of range
- Tính khâu tích phân:
I_Term = Error_Acc * I_Gain;
if (I_Term>32767) I_Term=32767; //Correct out of range
if (I_Term<-32768) I_Term=-32768; //Correct out of range
- Tính khâu vi phân:
D_Term = (This_Error - Last_Error) * D_Gain;
if (D_Term>32767) D_Term=32767; //Correct out of range
if (D_Term<-32768) D_Term=-32768; //Correct out of range
- Tính ngõ ra:
Output = P_Term + I_Term + D_Term;
if (Output >32767) Output =32767; //Correct out of range
if (Output < 0) Output = 0; //Correct out of range
- Scale Output để hợp với 10bit- PWM:
PWM = Output * 1023/32767;
PHP Code:
PWM = Output * 1023/32767;
Hàm truyền PID :
PHP Code:
Phương trình hành động là :
Ira = Kp ( e + Ki ∫ edt + Kd de/dt ) + I0
Với :
Ira : tín hiệu ra khỏi bộ điều khiển khi có một sai lệch e thay đổi với thời gian t .
I0 : tín hiệu ra tại thời điểm thiết lập khi không có sai lệch .
Kp : hằng số tỉ lệ
Ki : hằng số tích phân
Kd : hằng số đạo hàm ( vi phân )
Mình đã đọc một số bài lập trình trên mạng và có đọc qua cơ sở lý thuyết điều khiển PID nhưng không hiểu được phải viết hàm PID theo vị trí và PID theo tốc độ thế nào cả .... Các bài ví dụ trên mạng mỗi người làm một kiểu . mình càng đọc càng băn khoăn khó hiểu .
Nay viết lên đây mong anh chị em cô bác nào hiểu thấu có thể chỉ giáo cho em chút ít để mở rộng tầm hiểu biết của mình được không ? Cảm ơn mọi người trước nhé ....
Comment