PDA

View Full Version : pid ổn định tốc độ động cơ


nhat925
14-11-2009, 10:07 AM
e đang làm đồ án về ổn định tốc độ động cơ(tốc độ k thay đổi khi thay đổi tải).nhờ mấy bác xem dùm cho e phần lập trình pid của em như thế này là được chưa??cho e hỏi cái thời gian mình đọc encoder về ví dụ là 10ms.thì cái T trong công thức pid là 10*10^-3 đúng k ạ?
http://www.mediafire.com/?nodwyywjntu.
cho e hỏi nữa.mình muốn mô phỏng cái pid này thì nên dùng cái gì để mô phỏng được.nếu dùng matlab thì k có hàm truyền của động cơ?protues có thể mô phỏng được k

dung h
15-11-2009, 01:13 AM
điều khiển ổn định tốc độ động cơ bắng phương pháp pid rất hay! bạn ơi bạn có thể nói rõ hơn về phương pháp này và cách bạn điều khiển pid trong chương trình của cậu
bạn thông cảm mình đọc chương trình của cậu o hiểu lắm!
thanks

nhat925
15-11-2009, 09:23 AM
chương trình của em nhằm mục đích là ổn định tốc độ với sự thay đổi của tải.do mấy cái Ki,kp,kd chưa tìm ra nên e để thế.trong phần khai báo sửa lại mấy cái e0,e1,e2,u0 là những số có dấu.mục đích so sánh e0 với +- 200 là nhằm để hạn chế sai số thôi.ví dụ khi giá trị sai lệch lớn hơn 200 vòng thì mình cho U0=0,để hạn chế tốc độ.e k biết a k hiểu bài e chỗ nào nên cũng hơi khó nói.có gì thì a nói rõ hơn cho e với nha.
còn một cái nữa e muốn hỏi mọi người là e tạo xung vuông 10khz ở chân ccp1.(tần số thạch anh là 20Mhz,setup_timer_2(T2_div_by_4,124,1).thế mà khi mô phỏng bằng protues(cho osilicope vào chân ccp1 để quan sát và tính chu kỳ xung thì thấy nó k ra như thế.nó ra chu kỳ cỡ 3.6ms.tức là tần số nó nhỏ hơn.e k hiểu tại sao.đoạn code e viết ra để tạo xung nè.mọi người xem thử.
#include "E:\doan\123\123.h"
#use delay(clock=20000000)
#byte porta=0x05
#byte portc=0x07
#byte portd=0x08
main()
{


set_tris_c(0x01);
setup_ccp1(ccp_pwm);
setup_timer_2(T2_DIV_BY_4,124,1);//tao ra xung 10khz
set_pwm1_duty(100);


}

dung h
15-11-2009, 02:57 PM
bạn có thể nói cách tìm ra các tham số của pid la Ki,Kp,Kd không?
khi ta có tốc độ cần ổn định v, tốc độ phản hồi từ ecoder?
mình thấy trong chương trình của bạn chưa làm điều đó thì phải,
mình chưa thấy cái biến set_speed bạn lấy giá trị ở đâu thế?

còn mình thấy với các timer số bạn setup timer2 như vậy cho f =10k là đúng đây chứ.
bạn dùng pic f bao nhiêu thế?

vinasheva
15-11-2009, 06:20 PM
setup_timer_2(T2_DIV_BY_4,124,1);//tao ra xung 10khz
set_pwm1_duty(value);

Như vậy thì mình cho giá trị value từ 0 đến 123 sẽ được duty từ 0% đến 100%. Như vậy còn ít giá trị quá. Có ai biết cách nào làm tăng độ nhuyễn của duty dc k?

dung h
15-11-2009, 07:08 PM
setup_timer_2(T2_DIV_BY_4,124,1);//tao ra xung 10khz
set_pwm1_duty(value);

Như vậy thì mình cho giá trị value từ 0 đến 123 sẽ được duty từ 0% đến 100%. Như vậy còn ít giá trị quá. Có ai biết cách nào làm tăng độ nhuyễn của duty dc k?

không phải value từ 0->123 mà là từ 0->496 tức băng 124*4
bạn kiểm tra lại xem khi bạn nạp 496 vào value thi xung ra mới đầy

nhat925
15-11-2009, 09:30 PM
mình đã tìm ra được lỗi sai của cái xung rồi.do trong con pic ở mô phỏng k để là 20Mhz.nên nó bị sai.hihi.à.cái set_speed là tốc độ đặt.mình định đặt là 1000 vòng.đặt trong phần mềm chớ k có lấy ở ngoài.còn ki,kp,kd thì thực hiện dựa theo phương pháp Nigelr_nichols.do mình chưa tìm đc nên mình để đó.cái đọc encoder là cái real_speed đó bạn.

nhat925
17-11-2009, 12:06 AM
cái vấn đề trong cái pid mà e đang cần hỏi là cái Udk của em nó ngược ngược.ví dụ.trong mô phỏng khi e làm vận tốc thực lớn hơn so với vận tốc đặt thì cái U nó lại dương.ngược lại khi mà vận tốc đặt lớn hơn vận tốc thực thì U nó âm làm cho k có xung ra.mấy anh xem dùm cho e cái set_pwm(value) của là đúng trong trường hợp này k??e thấy nó sai sai sao đó
http://www.mediafire.com/?wnzwezyuiwg

ngoctuan522
23-11-2009, 07:55 AM
sao minh ko thấy đường linh để xem bài của Nhat925 vậy? Nếu được nhờ ban quản trị hoặc bạn gửi qua mail (ngoctuan522@gmail.com)cho mình với.Mình cũng đang làm đồ án với nội dung như bạn. Thanks..