PDA

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


Pages : 1 [2]

scentoflove
08-09-2006, 12:16 AM
Anh namqn Irr trong datasheet ghi la maximum full load reverse curent, Full cycle -> em nghĩ là đúng chứ anh
Ibst=Ilk,d +Iqbs +Igs
Iqbs= 125uA
Igs=Qg*fs=65nc*20Khz=1.3uA fs=20Khz vì chân CPP pic có tần số 19.53Khz

ton,max =Dmax/fs =0.8/20khz=40us (Dmax này em chọn là 1 được ko, đọc bài anh viết trên dientuvietnam thì ko thể chạy 100% chu kì vậy Dmax bao nhiêu là dc)

Cbst=0.13uF

Các datasheet em dử dụng em up lên

To sphinx: thanks, em đã mua được IR2110

namqn
08-09-2006, 07:08 PM
Anh namqn Irr trong datasheet ghi la maximum full load reverse curent, Full cycle -> em nghĩ là đúng chứ anh
Ibst=Ilk,d +Iqbs +Igs
Iqbs= 125uA
Igs=Qg*fs=65nc*20Khz=1.3uA fs=20Khz vì chân CPP pic có tần số 19.53Khz

ton,max =Dmax/fs =0.8/20khz=40us (Dmax này em chọn là 1 được ko, đọc bài anh viết trên dientuvietnam thì ko thể chạy 100% chu kì vậy Dmax bao nhiêu là dc)

Reverse current và reverse recovery current là hai thứ hoàn toàn khác nhau. Anh đã giải thích trong post trước rồi, em đọc kỹ lại đi.

Igs phải là 1300 uA hay 1.3 mA!

Nếu dùng ít hơn 8 bit cho PWM thì có thể dùng 25 kHz.

Dmax cứ lấy là 0.8 đi, coi như chúng ta điều rộng từ khoảng 0.1 hay 0.2 đến 0.8 thôi.

Thân,

bluepine
09-09-2006, 10:53 AM
Chào các bạn.
Việc thiết kế cầu-H cùng với mạch phản hồi dòng, rồi mạch logic khóa lẫn phòng ngắn mạch... mất rất nhiều công sức và thời gian đối với người không phải là dân điện tử như mình. Vì vậy, với mô hình của mình, mình dùng IC chuyên dụng. Các mô hình khác xây dựng mạch cầu-H bằng các transistor họ MOSFET và với phương án dùng IC chuyên dụng của mình thì cũng là một giải pháp khác để chúng ta cùng thảo luận.
Mình dùng chip cầu-H LMD18200 của hãng National Semiconductor, một IC chuyên dùng trong các ứng dụng điều khiển động cơ DC có dòng điện và điện áp lên tới 3A(Peak là 6A), 55V. Chip này đã tích hợp sẵn mạch phản hồi dòng, cảnh báo nhiệt độ IC ... Cụ thể các bạn có thể tra datasheet của nó.
Đây là sơ đồ chức năng và hình dáng của chip:
http://i72.photobucket.com/albums/i193/tinhthanthep/LMD18200/LMD18200_2.jpghttp://i72.photobucket.com/albums/i193/tinhthanthep/LMD18200/LMD18200_3.jpg
http://i72.photobucket.com/albums/i193/tinhthanthep/LMD18200/LMD18200_1.jpg
Và đây là datasheet:
chào mọi người, mình tán thành ý kiến của bạn tinh thần thép là dùng IC chuyên dụng LMD18200 để làm mạch công suất để điều khiển động cơ vì nó giúp ta đỡ mất thời gian thiết kế cầu H, mà lại hiệu quả, tránh những sự cố như trùng dẫn chẳng hạn (mình nghĩ vậy). Vả lại bọn mình đã mua được một con LMD18200 rồi, về xuất xung thử thấy động cơ chạy ok lắm.

à, anh F ơi cho em hỏi, encoder động cơ em có 5 dây đen, đỏ, trắng, vàng, xanh lá. em đã cấp nguồn 5 v vào vào dây đỏ, đen nối mas, khi cho động cơ quay, dùng dao động kí quan sát tín hiệu thì thấy chỉ có 2 dây xanh lá và trắng có xung rất đẹp, em nghĩ đó là 2 xung A,B, còn đầu vàng thì không có tín hiệu gì hết, vậy nó có phải chân Z không anh?
em cho động cơ quay đúng 1 vòng (quay bằng tay) thì đếm được khoảng gần bằng 500 xung, vậy chắc encoder này 500 xung vì em nghĩ người ta chế tạo encoder thì số sung phải chẵn cho dễ tính toán. em không biết nghĩ thế đúng không, mong các anh chỉ giúp.
mình có tìm được một tài liệu về điều khiển động cơ dùng PID,các bạn có thể tham khảo.

bluepine
09-09-2006, 10:59 AM
các bạn có thể tham khảo giải thuật điều khiển PID ở đây.
mến,
Tùng

falleaf
09-09-2006, 01:14 PM
à, anh F ơi cho em hỏi, encoder động cơ em có 5 dây đen, đỏ, trắng, vàng, xanh lá. em đã cấp nguồn 5 v vào vào dây đỏ, đen nối mas, khi cho động cơ quay, dùng dao động kí quan sát tín hiệu thì thấy chỉ có 2 dây xanh lá và trắng có xung rất đẹp, em nghĩ đó là 2 xung A,B, còn đầu vàng thì không có tín hiệu gì hết, vậy nó có phải chân Z không anh?
em cho động cơ quay đúng 1 vòng (quay bằng tay) thì đếm được khoảng gần bằng 500 xung, vậy chắc encoder này 500 xung vì em nghĩ người ta chế tạo encoder thì số sung phải chẵn cho dễ tính toán. em không biết nghĩ thế đúng không, mong các anh chỉ giúp.
mình có tìm được một tài liệu về điều khiển động cơ dùng PID,các bạn có thể tham khảo.

Về thứ tự dây, anh không dám phán bừa bãi, vì thông tin không đủ. Tuy nhiên, nếu em đo được tín hiệu xung như vậy, có nghĩa là nó tốt. Oki@

Nếu là chân Z, thì quay hết 1 vòng nó sẽ có một xung xuất hiện.

Em không được phán bừa, như encoder trước đây anh dùng là 504 xung. Một cách duy nhất để đo số xung là dùng chân Z để kiểm tra. Xoay động cơ, đếm xung trên 1 kênh A chẳng hạn. Từ lúc kết thúc xung Z đến lúc xuất hiện xung Z. Nếu không có chân Z, thì phải mở động cơ ra mà đếm từng vạch xung, không có cách nào khác. Em có thể chia ra 1/4 vòng để đếm, rồi nhân 4 lên.

Chúc vui.

sphinx
09-09-2006, 04:13 PM
Phần lớn các encoder gắn sau đuôi động cơ không có dây index, muốn biết có hay ko bạn mở nó ra, xem cái đĩa, nếu chỉ có 1 hàng vạch thì tất nhiên là ko có index rồi!

Các encoder bây j chỉ có 1 hàng vạch chứ ko phải 2 như truyền thống (như trong chương trình thiết kế Encoder của anh F chẳng hạn:D) và để tạo ra 2 xung nó dùng 2 mắt thu đặt lệch nhau! Chính vì lý do này mà ta hầu như ko thể thay thế mắt Encoder của động cơ này cho động cơ khác (dù cùng loại) nếu đĩa xung của chúng ko giống hệt nhau!

falleaf
09-09-2006, 09:25 PM
Xem bài viết liên quan ở đây.

Nhân cơ hội trả lời một bạn nói về dự án PID, F có nói đôi nét lại một lần nữa về dự án này, các bạn tham gia dự án cũng nên xem qua.

http://www.picvietnam.com/forum//showthread.php?p=4870#post4870

Chúc vui

Nakata
10-09-2006, 03:33 AM
Cac bac cho em hoi. Em muon thiet ke them phan phan hoi dong ve. Voi IC chuyen dung thi no da co san, con voi mach cau H ma minh tu thiet ke thi phan phan hoi dong ta se phai thiet ke nhu the nao day(thiet ke mot lan cho do ton cong). Em se phai su dung cam bien dong nao, co tu thiet ke duoc ko hay la phải mua? Neu tu thiet ke thi phai thiet ke nhu the nao? Va neu phai mua thi em se phai mua loai nao? o dau? gia ca?
Bac nao biet mong chi giup.
Cam on!

bluepine
11-09-2006, 10:34 AM
anh F ơi, sao em vô cái link này để tải tài liệu về PID về xem không được http://www.picvietnam.com/download/PIDcontrolbook2.pdf (link này ở luồng điều khiển PID đó),
anh kiểm tra lại giùm
mến,

falleaf
11-09-2006, 02:05 PM
Anh vô được bình thường, em coi lại thử, có thể em dùng chế độ save về rồi mở ra trên máy để coi, chứ nếu không thì đường truyền bị lỗi (rất hay bị lỗi với file dung lượng lớn), khi đó sẽ không download được.

Chúc vui

9262
11-09-2006, 02:51 PM
chao cac bac
minh cung la thanh vien moi, Minh thay cac bac lam cai de tai nay hay day.
Minh nghi cac bac co the tham khao cac bai viet ve dieu khien PID cua dong co servo ma cac hang dang ban tren thi truong.
Con encorder cac bac nen mua loai phase A, B, Z de cac bac lay duong hoi tiep dua ve con PIC. Cac bac gan truc tiep truc cua Encoder va truc dong co bang khop link de lay tin hieu dong toc.
Cac bac nho cach li ngo vao khi giao tiep voi con PIC nha.
Cam on cac bac nha.

bluepine
11-09-2006, 06:18 PM
em vô được rồi, thank you :)
mến

scentoflove
12-09-2006, 03:59 PM
Em chọn Dbst là 1N4148 từ đó tính Cbst
Qg=65nC. Qrr bỏ qua, Ilk,d=10uA, Iqbs=125uA, Igs=1.3mA, ton,max=40us, Vuvlo=9.4V, Vbst=15-1=14V ->Cbst= 0.027uF
Giá trị C1,C2=Cbst, C3,C4 trong datasheet IR2110 vẽ nhưng ko đưa giá trị. Các R5-R8 chịu dòng cho zener15V chưa có giá trị

http://i71.photobucket.com/albums/i123/scentoflove_ppan/Hbridge.jpg

namqn
12-09-2006, 05:44 PM
Em chọn Dbst là 1N4148 từ đó tính Cbst
Qg=65nC. Qrr bỏ qua, Ilk,d=10uA, Iqbs=125uA, Igs=1.3mA, ton,max=40us, Vuvlo=9.4V, Vbst=15-1=14V ->Cbst= 0.027uF
Giá trị C1,C2=Cbst, C3,C4 trong datasheet IR2110 vẽ nhưng ko đưa giá trị. Các R5-R8 chịu dòng cho zener15V chưa có giá trị

http://i71.photobucket.com/albums/i123/scentoflove_ppan/Hbridge.jpg
Cbst mà em tính ra là giá trị tối thiểu, nên chọn C1, C2 bằng khoảng 10 đến 15 lần giá trị Cbst (theo khuyến cáo của hãng International Rectifier). Với C3, C4, mỗi giá trị nên thực hiện bằng một tụ 0.1 uF (ceramic) + một tụ 1 uF (tantalum nếu có thể).

Các điện trở R5-R8 để chống latch-up cho MOSFET, có thể chọn 4.7 k.

Thân,

falleaf
12-09-2006, 09:23 PM
http://i32.photobucket.com/albums/d28/picvietnam/L298N.jpg

Gửi cái schema này thiết kế cho con L298N, đang định làm nó để chuẩn bị cho phòng thí nghiệm ở HCM và HN. Xin anh Nam cho ý kiến luôn về các giá trị tụ trở mắc kèm theo.

Mạch này làm xong thì bé bằng 2 ngón tay, dài bằng 2 đốt tay (đã bao gồm cục tản nhiệt to oạch phía sau).

Chúc vui.

scentoflove
12-09-2006, 11:43 PM
Em muốn làm phần phản hồi dòng điện luôn anh namqn giúp em phần này

DBT
13-09-2006, 12:41 PM
Các bác ơi em có con Mô tơ ký hiệu: PU5912V.
Tìm mãi trên mạng không có datasheet.
Bác nào biết điều khiển hắn giúp em với.
Cám ơn các bác

namqn
13-09-2006, 06:27 PM
Gửi cái schema này thiết kế cho con L298N, đang định làm nó để chuẩn bị cho phòng thí nghiệm ở HCM và HN. Xin anh Nam cho ý kiến luôn về các giá trị tụ trở mắc kèm theo.

Mạch này làm xong thì bé bằng 2 ngón tay, dài bằng 2 đốt tay (đã bao gồm cục tản nhiệt to oạch phía sau).

Chúc vui.
Nếu làm cho phòng thí nghiệm thì em nên để 4 tín hiệu kích độc lập nhau, như vậy có thể thí nghiệm kích theo nhiều kiểu khác nhau.

Các ngõ vào của L298N là dạng TTL, do đó không cần làm phức tạp hóa mạch đâu em. Em có thể bỏ phần mạch R, C, và D ở các chân input của L298N.

Nếu nguồn đã ổn áp thì C7 không cần lớn, vài uF là được. C8 cũng chỉ cần vài uF, nếu có tụ tantalum thì nên dùng (lọc nhiễu cho phần logic của L298N).

Rs thì phải chọn tùy theo cỡ dòng điện qua mạch cầu H của L298N. Nếu dòng max cỡ 1A thì có lẽ chọn 0.1 ohm (sẽ cần có một mạch khuếch đại dùng OPAMP loại rail-to-rail input).

Mạch lọc mắc song song với Rs thì có thể dùng R = 220 ohm, C = 1 nF.

Thân,

namqn
13-09-2006, 06:29 PM
Em muốn làm phần phản hồi dòng điện luôn anh namqn giúp em phần này
Trong mạch F dùng L298N vừa post có Rs dùng cho phản hồi dòng điện đó, em tham khảo thêm phần trả lời của anh để chọn giá trị cho điện trở cảm nhận dòng và mạch lọc cho nó.

Thân,

scentoflove
13-09-2006, 08:16 PM
Rs mắc giữa chân isenA và mass, mạch cầu H thì mình sẽ mắc Rs như thế nào anh

namqn
13-09-2006, 10:18 PM
Rs mắc giữa chân isenA và mass, mạch cầu H thì mình sẽ mắc Rs như thế nào anh
Trong L298N cũng là một mạch cầu H mà em.

Mắc Rs giữa âm nguồn và điểm nối các chân S của các MOSFET phía thấp.

Thân,

bluepine
14-09-2006, 10:14 AM
anh Namqn ơi, có thể giải thích rõ hơn vai trò của chân sens trong mạch cầu được không ? ta đã dùng encoder để hồi tiếp tốc độ động cơ rồi thì thêm chân sens có ý nghĩa gì vậy anh. Em đọc trong datasheet của cầu LM18200 thì thấy nó nói rằng độ nhạy là 377uA/1A, để tối ưu độ chính xác và tuyến tính thì phải chọn điện trở giữa chân sens này với mas sao cho điện áp giới hạn giữa chân sens này với mas là 5V, và trong thiết kế đó thì nó chọn điện trở 2K. em mắc thử thì thấy mạch vẫn chạy tốt. mong anh giải thích thêm,
mến


phuongnhoc
14-09-2006, 11:52 AM
ý kiến của anh Bang Chủ rất hay. nguồn nhân lực để làm việc này là sinh viên đúng không.
nhưng với chương trình đào tạo hiện nay ở các trường đại học. thì để có các kiến thức căn bản để có thể làm việc được là việc không phải đơn giản đối với các sinh viên năm đầu.nên việc hướng dẫn sinh viên năm đầu là rất cần thiết.
Em rất mong sự góp ý của Bang chủ cho câu lạc bộ. nếu được hy vọng Bang chủ có thể đứng ra thành lập câu lạc bộ.
mọi việc nên bắt đầu từ thấp đến cao

falleaf
14-09-2006, 01:07 PM
Các ngõ vào của L298N là dạng TTL, do đó không cần làm phức tạp hóa mạch đâu em. Em có thể bỏ phần mạch R, C, và D ở các chân input của L298N.
Thân,

Cái phần R, C, D là để chống ngắn mạch. Mạch này đã kiểm tra rất tốt. Nếu đang chạy, chập hai dòng vào nhau, lập tức nó kéo tín hiệu điều khiển ngõ vào xuống 0. Có nghĩa là khoá thẳng ở ngõ vào luôn, cho dù ngõ ra chân vi điều khiển đang ở mức cao. Bảo vệ cả L298 và vi điều khiển.

Về phần nối chung chân, vì em đi mạch in chỉ nhỏ bằng 2 ngón tay và dài bằng hai đốt ngón tay. Gần như rất khít (đã bao gồm tản nhiệt), nên em gôm chung lại luôn.

Nếu thiết kế thì có thể kéo chân ra test board để cắm. Em dự tính làm thêm một cái dãy test board cắm chân, để thực hành trong phòng thí nghiệm với các thiết bị trung bình, như kiểu động cơ.

Em sẽ suy nghĩ lại phần thiết kế để thực hành cho đơn giản nhất.

Thanks anh

http://www.picvietnam.com/forum//showthread.php?t=79

Các bạn xem thêm bài viết trong luồng này để hiểu về hoạt động của R,C,D ở ngõ vào. Bài này viết lâu lắm rồi, và mạch này được dùng trong robot của F khi làm đề tài tốt nghiệp. Nó làm to oạch vì lý do cũng như các bạn, thời sinh viên, F không có nhiều điều kiện, mạch in đặt miễn phí ở phòng làm mạch in BK HCM, không phủ gì cả. Hồi đó phòng này mới thành lập, chưa làm được lỗ in nhỏ, chưa phủ xanh được. Bây giờ thì không biết thế nào rồi. Ai có thông tin về phòng làm mạch in này hiện nay, xin cung cấp cho mọi người biết.

Chú ý, trong mạch này, lúc đó không tìm được Schotky, cho nên dùng 1N4007, và nó chỉ cho phép tối đa 3-5KHz thôi. Đây là bộ điều khiển không tốt. Trong mạch mới mà F đưa lên, dùng UC3611 thì nó có thể nâng tần số lên. Việc điều khiển ở 7.8KHz như trong báo cáo, là làm lụi theo kiểu thực hành, vì đưa lên 7.8KHz còn thấy chấp nhận được nên làm. Tuyệt đối anh em không bắt chước làm mấy cái trò lụi này của F nhé.

Chúc vui

falleaf
14-09-2006, 02:15 PM
Mạch lọc mắc song song với Rs thì có thể dùng R = 220 ohm, C = 1 nF.
Thân,

Anh Nam đưa con số này ra, F nhờ bạn nào tính giúp F cái mạch lọc này là mạch lọc gì, và lọc như thế nào?

Có thể giải thích hiện tượng của nó được chăng?

Chúc vui

DBT
16-09-2006, 12:42 AM
Chẳng ai giúp em cả.
Cái con motor của em nó có 4 chân.
2 chân dùng để cấp điện cho nó hoạt động.
còn hai chân của chằng biết để nó làm gì. cho điện vào nó không hoạt động, mà khi nó quay hay gì đấy đo cũng chẳng thấy gì. Bác nào biết chỉ em cái, chứ bỏ đấy thì phí quá.

scentoflove
16-09-2006, 01:51 AM
Mạch phản hồi dòng em dùng 2 con diode (nối từ 2 chân jump động cơ vào chân Rs) mắc với mạch Rs, thì diode đó có cần phải phục hồi nhanh hay chỉ cần 1N4007.
Nguyên lý của mạch phản hồi dòng có phải là tạo ra điện áp trên Rs để PIC đọc ADC ko anh. Nếu như vậy thì Vref=5V thì em nghĩ Rs=Vref/Imax

falleaf
16-09-2006, 03:44 PM
Chẳng ai giúp em cả.
Cái con motor của em nó có 4 chân.
2 chân dùng để cấp điện cho nó hoạt động.
còn hai chân của chằng biết để nó làm gì. cho điện vào nó không hoạt động, mà khi nó quay hay gì đấy đo cũng chẳng thấy gì. Bác nào biết chỉ em cái, chứ bỏ đấy thì phí quá.

Em không đưa hình ảnh nào, rất khó nhận biết. Đôi khi, có một số loại động cơ, nó có sẵn 2 sợi dây mass, nối vào vỏ, và có tích hợp sẵn ở đuôi động cơ các con diode và tụ (giấu ở bên trong).

Vì vậy, em đo thử hai sợi dây không có gì đó với vỏ của động cơ xem, nó có nối với nhau không. Nếu đúng, thì hai dây đó chỉ là nối với vỏ động cơ thôi.

Chúc vui.

scentoflove
18-09-2006, 10:57 AM
Anh Nam, mạch phản hồi dòng của em 2 con diode d7,d8 là diode thường hay phục hồi nhanh ko anh.
Anh có thể giải thích thêm cách chọn Rs

http://i71.photobucket.com/albums/i123/scentoflove_ppan/Hbridgesense.jpg

namqn
18-09-2006, 07:14 PM
Anh Nam, mạch phản hồi dòng của em 2 con diode d7,d8 là diode thường hay phục hồi nhanh ko anh.
Anh có thể giải thích thêm cách chọn Rs

http://i71.photobucket.com/albums/i123/scentoflove_ppan/Hbridgesense.jpg
Em đặt Rs không đúng rồi, xem lại hình gửi kèm nhé.

Nếu chọn Rs để áp rơi cực đại trên nó bằng với Vref của ADC thì chúng ta tổn thất quá nhiều điện áp (áp nguồn chỉ có 24V). Do đó chúng ta thường chỉ chọn Rs để áp rơi ứng với dòng cực đại là khoảng 1V trở lại, và chúng ta sẽ dùng một mạch khuếch đại để nâng mức áp đó lên trước khi đưa nó vào ADC của PIC. Vì tầm điện áp là từ 0V đến 1V (chẳng hạn), các OPAMP dùng trong mạch khuếch đại sẽ cần có rail-to-rail input.

Tính ví dụ, chọn 1V là áp cực đại, dòng cực đại qua Rs là 2A, vậy Rs = 1/2 = 0.5 ohm (công suất trên điện trở này là 1V*2A = 2W!). Nếu để áp trên Rs cực đại là 5V, với dòng cực đại là 2A, thì công suất tiêu tán trên điện trở này là 5V*2A = 10W!! Hy vọng các bạn hình dung ra vấn đề.

Thân,

namqn
18-09-2006, 07:24 PM
anh Namqn ơi, có thể giải thích rõ hơn vai trò của chân sens trong mạch cầu được không ? ta đã dùng encoder để hồi tiếp tốc độ động cơ rồi thì thêm chân sens có ý nghĩa gì vậy anh. Em đọc trong datasheet của cầu LM18200 thì thấy nó nói rằng độ nhạy là 377uA/1A, để tối ưu độ chính xác và tuyến tính thì phải chọn điện trở giữa chân sens này với mas sao cho điện áp giới hạn giữa chân sens này với mas là 5V, và trong thiết kế đó thì nó chọn điện trở 2K. em mắc thử thì thấy mạch vẫn chạy tốt. mong anh giải thích thêm,
mến

Post này đọc rồi mà lại quên trả lời.

Chân sense để phản hồi giá trị dòng điện, có thể dùng để bảo vệ quá tải, ngắn mạch, cũng có thể dùng để tính toán trong một số phương pháp điều khiển, vì dòng điện qua động cơ tỷ lệ với mômen điện từ sinh ra trong động cơ.

Giải thích về chân sense của LMD18200: có 2 cảm biến dòng điện sẽ cảm nhận dòng điện qua 2 MOSFET phía cao, sau đó đưa vào mạch ổn định và tạo dòng ở chân sense của vi mạch. Chúng ta sẽ mắc một điện trở chuẩn vào giữa chân này và 0V để tạo áp rơi tỷ lệ với dòng điện (dùng cho các mạch điều khiển, giới hạn dòng).

Với LMD18200 thì chân sense của nó cho phép chúng ta chọn ngưỡng dòng để tác động, vì giá trị điện trở khác nhau sẽ tạo ra áp rơi khác nhau. Nguyên tắc cảm nhận dòng điện của LMD18200 khác với cách chúng ta làm ở đây (có lẽ nó đang dùng cảm biến Hall, do đó mới có thông số độ nhạy 377 uA/A). Nếu chúng ta dùng điện trở Rs như trong các mạch cầu H đang được thực hiện ở đây thì độ nhạy sẽ là 1A/1A (chúng ta dùng giá trị thực của dòng điện).

Giá trị 2k mà họ dùng đảm bảo điều kiện áp rơi không quá 5V so với GND, do đó mạch chạy tốt là đương nhiên.

Thân,

bluepine
19-09-2006, 09:01 AM
anh trả lời rất thuyết phục. cảm ơn anh nhiều.
mến

bluepine
19-09-2006, 10:28 AM
em đã vẽ xong phần mạch điều khiển động cơ servo dùng cầu LM18200, các anh tham khảo góp ý cho nhé.
mến

falleaf
19-09-2006, 01:36 PM
Phần mạch cầu H, anh Nam sẽ comment thêm cho em nếu cần. Còn phần thiết kế, anh có mấy điểm chú ý:

1) Phần RS232, em sử dụng chuẩn bootloader của picvietnam (tìm lại bài báo cáo này do Chính cung cấp) Hồi trước Chính làm cái hình bé xíu, anh không nhớ Chính đã gửi báo cáo lên và sửa lại chưa. Em nên thiết kế theo chuẩn đó.

2) Phần nạp trình cho PIC trên board, với chuẩn đó, em cũng nên thiết kế header theo chuẩn ICSP-BLD của picvietnam, như vậy sẽ có thể phát triển và hỗ trợ công cụ một cách thống nhất.

>> Như vậy, chúng ta sẽ thống nhất chuẩn thiết kế cho mạch chạy PIC ở phần này luôn.

3) Về phần encoder, theo anh, em kô cần làm quá phức tạp, chỉ cần em cấp trực tiếp vào chân vi điều khiển là xong. Rất nhiều thiết kế dùng các con FF đưa vào để tạo xung tốt hơn, nhưng anh thấy với PIC không cần thiết phải làm vậy. Nếu em có osc, em có thể lấy quan sát thử, nó chả mất xung đâu (nhớ tính phần chu kỳ ngắt cho tốt là được).

4) Nếu để tăng độ mịn, anh nghĩ em nên dùng cả hai ngắt trên hai chân. Như vậy, lợi thế nhất là em dùng interrupt onchange trên portb. Vì như vậy, em có thể đọc được độ mịn lên gấp 4 lần, khi đọc encoder.

Chúc vui

bluepine
19-09-2006, 04:28 PM
Khi em điều rộng xung với tần số 19500Hz, dutycycle = 100% để điều khiển không tải động cơ, nhưng em đếm số vòng động cơ hồi tiếp về không ổn định.
khi chu kì lấy mẫu càng giảm thì độ dao động càng cao , đây là các giá trị tốc độ đưa về (vòng/phút) (em dùng RS232 để đưa tốc độ về hiển thị trên máy tính, chu kì láy mẫu là 0.8s, nếu giảm xuống sai lệch còn lớn hơn nhiều )
50 1750 2000 1750 2000 1750 1750 2000 1750 1750 2
000 1750 1750 2000 1750 1750 2000 1750 1750 1750 2
000 1750 1750 2000 1750 1750 1750 1750 1750 1750 1
750 1750 1750 1750 1750 1750 2000 1750 1750 1750 1
750 1750 1750 2000 1750 1750 1750 1750 1750 2000 1
750 1750 1750 1750 1750 1750 1750 2000 1750 1750 1
750 1750 1750 1750 2000 1750 1750 1750 1750 1750 1
750 1750 1750 2000 1750 1750 1750 1750 1750 1750 1
750 2000 1750 1750 1750 1750 1750 1750 1750 2000 1
750 1750 1750 1750 1750 1750 1750 1750 1750
các anh có thể giải thích được không?
mến

namqn
19-09-2006, 06:00 PM
Khi em điều rộng xung với tần số 19500Hz, dutycycle = 100% để điều khiển không tải động cơ, nhưng em đếm số vòng động cơ hồi tiếp về không ổn định.
khi chu kì lấy mẫu càng giảm thì độ dao động càng cao , đây là các giá trị tốc độ đưa về (vòng/phút) (em dùng RS232 để đưa tốc độ về hiển thị trên máy tính, chu kì láy mẫu là 0.8s, nếu giảm xuống sai lệch còn lớn hơn nhiều )
50 1750 2000 1750 2000 1750 1750 2000 1750 1750 2
000 1750 1750 2000 1750 1750 2000 1750 1750 1750 2
000 1750 1750 2000 1750 1750 1750 1750 1750 1750 1
750 1750 1750 1750 1750 1750 2000 1750 1750 1750 1
750 1750 1750 2000 1750 1750 1750 1750 1750 2000 1
750 1750 1750 1750 1750 1750 1750 2000 1750 1750 1
750 1750 1750 1750 2000 1750 1750 1750 1750 1750 1
750 1750 1750 2000 1750 1750 1750 1750 1750 1750 1
750 2000 1750 1750 1750 1750 1750 1750 1750 2000 1
750 1750 1750 1750 1750 1750 1750 1750 1750
các anh có thể giải thích được không?
mến
Anh không nhớ encoder của em có bao nhiêu xung, nhưng kết quả như vậy chắc chắn là có vấn đề (có nhiều khâu cần xem xét: tín hiệu encoder đưa về, thuật toán tính tốc độ).

Ngày trước sinh viên của anh làm với encoder 100 xung/vòng cũng chỉ có sai lệch 60 vòng/phút khi đọc tốc độ không tải (thời gian lấy mẫu là 100 ms thì phải, không nhớ rõ lắm).

Thân,

bluepine
20-09-2006, 10:42 AM
Encoder của em 500 xung, còn về giải thuật đếm thì em dùng timer0 để đọc xung về (hệ số chia 2), em đặt giá trị đầu timer0 là 6, khi đếm đến 250 thì timer0 tràn (tức là 500 xung) em tăng giá trị xung lên 1.
em dùng timer1 để làm chu kì lấy mẫu, khi hết chu kì lấy mẫu (timer1 ngắt) thì em cho hiển thị giá trị đếm về máy tính.
Em cũng nghĩ có thể do tín hiệu từ encoder đưa về có vấn đề nhưng em thắc mắc sao giá trị đưa về chỉ thay đổi ở 2 giá trị thôi (như ví dụ trên là 2000 và 1750) và vài chu kì lấy mẫu thì nó mới thay đổi 1 lần (vì nhiễu thì phải gây thay đổi tín hiệu trong mỗi chu kì chứ)
em gửi kèm theo file chương trình viết trên CCsc , các anh xem hộ
mến

falleaf
20-09-2006, 01:27 PM
Giá trị của timer là từ 0 đến 255. Nếu em đặt giá trị đầu là 6, thì nó chỉ đếm được đến 249 là tràn rồi, chứ không phải 250!. Vì 256 là tổng số 2^8, nhưng mà từ 0 đến 255 là 256 số.

Anh không biết em viết cụ thể thế nào, nhưng con số em đưa ra là có vấn đề rồi. Như vậy, nó chạy đến 255 là tràn, hay có nghĩa là đến 249 thì sẽ tràn.

Em có thể post chương trình đoạn đọc encoder lên đây để mọi người cùng quan sát.

Ngoài ra, khi làm các phần test về hoạt động, em cần thực hiện việc truyền số liệu ở dạng nguyên gốc. Có nghĩa là em nên truyền về dạng số xung, chứ không nên truyền về dạng đã tính toán thành vận tốc, như vậy rất khó theo dõi sự đúng sai.

Điểm thứ ba, đó là em phải hiểu, khi em điều khiển độ rộng xung như vậy, em đặt một giá trị fix nào đó của pwm để điều khiển, thì nó có sự lên xuống về tốc độ, cũng không có gì lạ. Nhưng hiện tượng mà chỉ có sai đúng 2 số như vậy, rõ ràng em lập trình sai rồi.

Em kiểm tra lại điểm thứ nhất anh nói, về con số đặt, và post chương trình lên cho mọi người cùng xem.

Chúc vui

manhdc701
20-09-2006, 06:42 PM
minh thay y tuong nhu the la rat hay , nhung minh cung ban khoan ve tuong lai cua y tuong nay ?

scentoflove
20-09-2006, 09:24 PM
Đọc encoder thì em xài ngắt ngoài, tác động cạnh lên, encoder 400 xung đọc sai số 25x/vòng ở PWM 100%.
Việc sai số do đọc encoder em nghĩ có nhiều nguyên nhân do đoạn code giao tiếp RS232 đặt ko tốt có thể làm trể việc đọc encoder. Em viết code đọc encoder bằng ngắt như sau.

Chương trình ngắt RB0 (pha A) -> encoder+1 khi ngắt
Chương trình ngắt RB7 (index) -> clear encoder=0, set cờ RS=1
Chương trình chính code giao tiếp RS232 khi có cờ ngắt, xuất xong set cờ RS=0

Em ko up lên code được vì hiện giờ đã sữa code đó lại cho 4331 (QEI đọc rất chỉnh xác)

hoanf
21-09-2006, 08:58 AM
minh thay y tuong nhu the la rat hay , nhung minh cung ban khoan ve tuong lai cua y tuong nay ?
Mình chỉ góp ý nhỏ thôi.
Ban có ý kiến về ý tưởng gì thì nên trích dẫn trong bài viết của mình để người khác dễ hiểu ý kiến của bạn nha
Thân
hoanf

bluepine
21-09-2006, 09:34 AM
Giá trị của timer là từ 0 đến 255. Nếu em đặt giá trị đầu là 6, thì nó chỉ đếm được đến 249 là tràn rồi, chứ không phải 250!. Vì 256 là tổng số 2^8, nhưng mà từ 0 đến 255 là 256 số.

Anh không biết em viết cụ thể thế nào, nhưng con số em đưa ra là có vấn đề rồi. Như vậy, nó chạy đến 255 là tràn, hay có nghĩa là đến 249 thì sẽ tràn.

Em có thể post chương trình đoạn đọc encoder lên đây để mọi người cùng quan sát.

Ngoài ra, khi làm các phần test về hoạt động, em cần thực hiện việc truyền số liệu ở dạng nguyên gốc. Có nghĩa là em nên truyền về dạng số xung, chứ không nên truyền về dạng đã tính toán thành vận tốc, như vậy rất khó theo dõi sự đúng sai.

Điểm thứ ba, đó là em phải hiểu, khi em điều khiển độ rộng xung như vậy, em đặt một giá trị fix nào đó của pwm để điều khiển, thì nó có sự lên xuống về tốc độ, cũng không có gì lạ. Nhưng hiện tượng mà chỉ có sai đúng 2 số như vậy, rõ ràng em lập trình sai rồi.

Em kiểm tra lại điểm thứ nhất anh nói, về con số đặt, và post chương trình lên cho mọi người cùng xem.

Chúc vui
Cảm ơn anh F, em sẽ kiểm tra lại chương trình. còn code em đã gửi file Picvietnam.rar ở bài trước đó,
mến

bluepine
21-09-2006, 11:04 AM
Hi Hi, anh F đoán chính xác, em bị lỗi giải thuật, em đã sửa chương trình lại rồi
đây là kết quả số xung đếm được trong mỗi 0.1s
1720 1725 1732 1727 1746 1733 1729 1730 1730 1733 1716 1711 1730 1712 1733 1723 1723 1720 1736 1725 1715 1714 1713 1728 1734 1726 1719 1723 1719 1726 1724 1708 1722 1739 1724 1736 1737 1714 1716 1728 1714 1735 1720 1720 1734 1724 1730 1726 1718 1732 1726 1729 1716 1724 1719 1712 1733 1734 1731 1717 1722 1723 1732 1727 1724 1719 1729 1720 1727 1719 1711 1716 1722 1722 1719 1723 1724 1723 1725 1712 1716 1725 1720 1725 1721 1736 1712 1720 1716 1731 1707 1718 1711 1711 1711 1718 1711 1706 1716 1732 1717 1720 1718 1707 1722 1716 1724 1712 1711 1717 1732 1728 1728 1734 1726 1727 1720 1729 1724 1718 1727 1724 1733 1726 1718 1718 1715 1715 1722

tôi gửi chương trình viết bằng CCsc lên cho các bạn tham khảo
mến,

falleaf
21-09-2006, 12:44 PM
#include <16F877A.h>
#fuses NOWDT,NOLVP,HS
#use delay (clock=20000000) //20Mhz

#use rs232(baud=2400, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8)
#include <7Segments_Led_Display.c>
#include <init_timer0.c>

#byte TMR2 = 0x11
#byte PR2 = 0x92
#byte CCPR1L = 0x15
#byte CCPR1H = 0x16
#byte CCP1CON = 0x17
int16 i = 0;
int16 j = 0;
int16 counted_round_value = 0x00;
int16 update_counted_round_value = 0x00;


void convert_16bits_to_decimal_digit(int16 counted_round_value1) // calculate to display on 7_segment leg Max value 9999 or 0x270F
{
fourth_digit = counted_round_value1 / 1000;
third_digit = (counted_round_value1 % 1000) / 100;
second_digit = ((counted_round_value1 % 1000) % 100) / 10;
first_digit = ((counted_round_value1 % 1000) % 100) % 10;
}


#INT_TIMER0 // ngat timer0 tang bien dem len 1
void timer0_int()
{
counted_round_value++;

}

#INT_TIMER1 // ngat timer0 tang bien len 1
void timer1_int() // moi lan timer1 tran la 0.02s
{
TMR1_L = START_VALUE_TIMER1_L;
TMR1_H = START_VALUE_TIMER1_H;


if (j == 5){ // chu ki lay mau 0.02 * 5 = 0.1s
j = 0;

update_counted_round_value = counted_round_value*500 + get_timer0(); // so vong quay trong 1 phut

counted_round_value = 0;

printf("%ld\t",update_counted_round_value); // gui so xung cap nhat ve may tinh qua RS232
}
else

j++;
}



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,PR2,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 main()
{
int8 timer0_value;

set_tris_a(0xff);

init_PWM(19500);
init_timer0();

set_pwm1_duty(500); //set the duty cycle = 500*1/clock* T2div (T2div is in setup_timer2)

//= 500/20000000*1 = 25uS (~25%)

while(true){

convert_16bits_to_decimal_digit(update_counted_rou nd_value); // tinh ra tung digit de hien thi
display_RPM_digit(); // hien thi tren led 7 doan
}
}

falleaf
21-09-2006, 12:50 PM
#include <16F877A.h>
void init_PWM(int16 frequency){

setup_ccp1(CCP_PWM); // initiate PWM
PR2 = 20000000/4/frequency - 1; // set PWM period
}



Anh lấy một đoạn chú thích chương trình thôi, vì anh cũng chỉ vừa mở lên và coi lướt qua, chưa xem kỹ nữa. Nhưng anh thấy ở đây em viết 20000000/4/f - 1. Công thức tính thì là như vậy, nhưng em phải nhớ rằng, cứ mỗi một lần thêm một công thức tính, thì máy sẽ phải generate lệnh để tính. Vì vậy, thay vì thực hiện chia, thì em ghi thẳng con số vào 5000000/f chẳng hạn.

Rồi với các con số khác cũng vậy, em tính toán ở đâu đó, rồi ghi thẳng vào.

Về thuật toán tính toán, mọi người xem lại coi có vấn đề gì không nhé.

Anh em chú ý là post thẳng chương trình lên ở dạng code, người khác có thể đọc được ngay, khỏi mất công phải lưu rồi mở lại. hơn nữa, từng đoạn code có thể trực quan sinh động, có thể xem và bình luận được. Như vậy sẽ có lợi hơn nhiều.

Chúc vui

bluepine
22-09-2006, 09:38 AM
Chào mọi người,
1/ Phần mạch RS232 em sẽ đọc lại phần botloader để sửa.
2/ Chuẩn ICSP-BLD của picvietnam ở luồng nào vậy anh F, anh gửi cho em được không.
3/ "Nếu để tăng độ mịn, anh nghĩ em nên dùng cả hai ngắt trên hai chân. Như vậy, lợi thế nhất là em dùng interrupt onchange trên portb. Vì như vậy, em có thể đọc được độ mịn lên gấp 4 lần, khi đọc encoder." Phần này, em chưa hiểu rõ lắm, chức năng interrupt on change thì em biết, nhưng từ 2 tín hiệu xung đưa về thì làm sao tăng độ nhạy lên 4 lần, anh giải thích thêm cho em.

falleaf
22-09-2006, 10:17 AM
http://www.picvietnam.com/forum//showthread.php?t=224

Em xem luồng này, xem bài số 13. Nếu như bây giờ em đọc cả cạnh lên và cạnh xuống của encoder của cả hai kênh A, B, thì như vậy em sẽ thấy rằng độ phân giải sẽ tăng lên 4 lần.

Nếu em chỉ đọc cạnh lên của kênh B chẳng hạn, thì bây giờ em đọc cạnh lên B, lên A, xuống B, xuống A. Như vậy độ phân giải sẽ tăng lên 4.

Như vậy, với encoder 500 xung/vòng, em có thể đọc lên tới 2000 xung/vòng, đây là kỹ thuật cơ bản về encoder thôi.

http://dientuvietnam.net/forums/showthread.php?t=2637
Luồng này là về chuẩn ICSP_BLD của picvietnam (bên dientuvietnam, anh quên viết bài bên picvietnam, nhưng nó có trong bài bootloader của Chính, anh sẽ bổ sung sau).

Chúc vui.

scentoflove
22-09-2006, 11:08 PM
Chuẩn 5x2 em rất thích nhưng ko kiếm được header cũng như ko kiếm được cable ở Nhất Tảo (em chỉ thấy 1 lần sợi cable 5x2 của thằng bạn hỏi nó mua ở đâu, nó nói bạn nó mua dùm :) )

Em đang vẽ lại module mạch dk nên phân vân ko có link kiện để theo chuẩn 5x2.

Anh F cho em hỏi thêm mục đích của việc mịn hóa encoder, vì nếu để phân biệt chiều của encoder thì chỉ cần ngắt pha A, đọc tín hiệu pha B (0 or 1) là được -> em nghĩ đọc encoder qua kĩ sẽ dẫn đến chậm chương trình chính (tính toán PID số thực)

gà mờ
23-09-2006, 07:12 PM
cac anh ơi chuyển mấy cái mạch câu h vsf encoder về dạng pdf đi đê em download với
thanks

ntc
23-09-2006, 07:37 PM
Chuẩn 5x2 em rất thích nhưng ko kiếm được header cũng như ko kiếm được cable ở Nhất Tảo (em chỉ thấy 1 lần sợi cable 5x2 của thằng bạn hỏi nó mua ở đâu, nó nói bạn nó mua dùm )

Em đang vẽ lại module mạch dk nên phân vân ko có link kiện để theo chuẩn 5x2.


Cáp và đầu bấm 5x2, bạn có thể mua tại tiệm ông Thuần trong chợ Nhật Tảo. Chỗ đó cũng có bán header 5x2.

Cũng có thể ghe qua cái cửa hàng Tương Lai (nằm trên đường 3/2, cũng gần gần khu Nhật Tảo) để xem thử nó còn không.

Bí quá thì có thể liên hệ với mình.

:D

trungkien_0914373773
26-09-2006, 12:42 AM
tôi mới tìm hiểu về pic và thấy ý kiến hay đấy .

bluepine
26-09-2006, 10:20 AM
http://www.picvietnam.com/forum//showthread.php?t=224


Em xem luồng này, xem bài số 13. Nếu như bây giờ em đọc cả cạnh lên và cạnh xuống của encoder của cả hai kênh A, B, thì như vậy em sẽ thấy rằng độ phân giải sẽ tăng lên 4 lần.

Nếu em chỉ đọc cạnh lên của kênh B chẳng hạn, thì bây giờ em đọc cạnh lên B, lên A, xuống B, xuống A. Như vậy độ phân giải sẽ tăng lên 4.

Như vậy, với encoder 500 xung/vòng, em có thể đọc lên tới 2000 xung/vòng, đây là kỹ thuật cơ bản về encoder thôi.

http://dientuvietnam.net/forums/showthread.php?t=2637
Luồng này là về chuẩn ICSP_BLD của picvietnam (bên dientuvietnam, anh quên viết bài bên picvietnam, nhưng nó có trong bài bootloader của Chính, anh sẽ bổ sung sau).

Chúc vui.

bluepine
26-09-2006, 10:22 AM
Chào mọi người, cho em hỏi sao em không dùng được chức năng interrupt on change trên portb, em viết chương trình như thế này
.......
#INT_RB
void RB_int()
{
counted_round_value++;
printf("%ld\t",counted_round_value);// hiển thị giá trị số lần ngắt về máy tính

}


void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
port_b_pullups(true);
set_tris_b(0xf0);

output_low(PIN_B0);
while(true);
}
..... em dùng 1 phím nhấn để thay đổi tín hiệu trên 1 chân (từ b4 đến b7)
khi hiển thị về máy tính thì thấy giá trị số lần ngắt tăng liên tục mặt dù chưa nhấn phím.
dòng lệnh port_b_pullups(true); để chống nhiễu do áp trôi trên portb, em đã thử bỏ đi mà kết quả vẫn không đổi.
kiểm tra lại thì phím nhấn không vấn đề gì.

scentoflove
27-09-2006, 03:02 AM
Bạn chọn ngắt cạnh lên hay cạnh xuống (điện trở kéo lên chắc là ngắt cạnh xuống). Bạn nên mắc điện trở kéo lên ở mạch ngoài như vậy ổn định hơn
Nếu nút nhấn chỉ mắc 1 chân RB0 thi bạn nên set_tris_b(0x10), chân Rb1-Rb3 ko xài
Thực ra khi lúc mới học PIC viết ngắt ngoài thì bị lỗi khác (lúc chạy đúng lúc chạy sai) làm cho mình có cảm giác RB0-RB3 ngắt ko ổn định bằng RB7.

bluepine
27-09-2006, 11:01 AM
Bạn chọn ngắt cạnh lên hay cạnh xuống (điện trở kéo lên chắc là ngắt cạnh xuống). Bạn nên mắc điện trở kéo lên ở mạch ngoài như vậy ổn định hơn
Nếu nút nhấn chỉ mắc 1 chân RB0 thi bạn nên set_tris_b(0x10), chân Rb1-Rb3 ko xài
Thực ra khi lúc mới học PIC viết ngắt ngoài thì bị lỗi khác (lúc chạy đúng lúc chạy sai) làm cho mình có cảm giác RB0-RB3 ngắt ko ổn định bằng RB7.
chào bạn, mình nghĩ bạn nhầm, vì mình dùng chức năng ngắt INT_RB (interupt on change) tức là chương trình ngắt sẽ được gọi khi có sự thay đổi mức trạng thái trên bất kì chân nào trong số b4 đến b7. Còn ngắt trân chân b0 như bạn nói là ngắt ngoài INT_EXT, bạn có thể vào mục help của CCsc để xem lại.
mến

bluepine
28-09-2006, 12:16 PM
chào mọi người, khi tham khảo địa chỉ http://www.library.cmu.edu/ctms/ctms/matlab42/examples/motor/digital.htm
em thấy hàm truyền động cơ DC có dạng

\frac{\theta}{V} = \frac{k}{((Js + b)(Ls + R) + k^2)}

với các đại lượng như sau:
electrical resistance (R) = 1 ohm
*electrical inductance (L) = 0.5 H
*electromotive force constant (Ke=Kt) = 0.01 Nm/Amp
*moment of inertia of the rotor (J) = 0.01 kg*m^2/s^2
*damping ratio of the mechanical system (b) = 0.1 Nms
*input (V): Source Voltage
*output (teta dot): Rotating speed

khi tra trong trong datasheet của động cơ em (TS3078) thì thấy các đại lượng không giống với các đại lượng trên, cụ thể là không có các đại lượng damping ratio of the mechanical system (b), electromotive force constant (Ke=Kt), moment of inertia of the rotor (J),

nhưng mà trong datasheet chỉ có các đại lượng như Rated Torque(TR), Torque Constant(KT), Armature Moment of Inertia(IR)

:)các anh cho hỏi

Rated Torque(TR) ?= Rated Torque(TR)
electromotive force constant (Ke=Kt) ?= Torque Constant(KT)
moment of inertia of the rotor (J) ?= Armature Moment of Inertia(IR)

(em chỉ so sánh thấy thứ nguyên giống nhau thôi)

ai rành về thông số động cơ chỉ giùm nhé, em pót datasheet lên cho mọi người tham khảo luôn
mến

namqn
28-09-2006, 06:46 PM
Câu trả lời là Yes cho cả 3 câu hỏi của em.

Vào đọc thêm ở đây:
http://namqn.byethost7.com/Motor.php
Thân,

scentoflove
28-09-2006, 10:46 PM
chào bạn, mình nghĩ bạn nhầm, vì mình dùng chức năng ngắt INT_RB (interupt on change) tức là chương trình ngắt sẽ được gọi khi có sự thay đổi mức trạng thái trên bất kì chân nào trong số b4 đến b7. Còn ngắt trân chân b0 như bạn nói là ngắt ngoài INT_EXT, bạn có thể vào mục help của CCsc để xem lại.
mến

Bài đó mình viết nhầm Rb4-Rb7 chứ ko phải Rb0-Rb3, set_tris_b(0x10) chân Rb6-Rb4 ko xài:)

Bạn sử dụng ngắt INT_RB như thế nào nếu ko phải là đưa tín hiệu tử mạch ngoài vào, ngắt INT_EXT cũng ngắt dựa trên tín hiệu của mạch ngoài, như vậy trong mạch bạn sử dụng thì INT_RB và INT_EXT gần giống nhau về cách gây ra ngắt là sự thay đổi trạng thái ở ngõ vào.

Mình viết bài đó là để nói kinh nghiệm thới cùi bắp mới học PIC :D.

trungkien_0914373773
03-10-2006, 11:55 AM
Bác F ơi . Tôi có 1 con Pic 16F877A và một mạch cầu H , Một động cơ 1 chiều .Tôi không biết viết chương trình trong CCS như thế nào để điều khiển được tốc độ của động cơ Bác F có thể giúp tôi ko ? cảm ơn Bác F.

falleaf
03-10-2006, 02:15 PM
Bác F ơi . Tôi có 1 con Pic 16F877A và một mạch cầu H , Một động cơ 1 chiều .Tôi không biết viết chương trình trong CCS như thế nào để điều khiển được tốc độ của động cơ Bác F có thể giúp tôi ko ? cảm ơn Bác F.

Bạn đọc lại từ đầu luồng này, sẽ rất có ích cho bạn.

tinhthanthep
06-10-2006, 12:19 PM
Mạch điều khiển của mình thiết kế xong roài. Falleaf cho hỏi làm thế nào để post sơ đồ mạch vẽ bằng OrCAD10.5 lên diễn đàn? (Chuyển từ OrCAD sang ảnh JPG mà hình vẽ và các ký hiệu vẫn rõ ràng)

falleaf
06-10-2006, 04:38 PM
Bạn nén tất cả thành file zip gửi lên diễn đàn bằng cách Tải file đính kèm.

Nếu bạn chỉ muốn gửi hình lên diễn đàn, thì bạn có thể dùng print screen để chụp hình màn hình lại, sau đó dán vào Paint, rồi cắt cái phần hình ra, lưu lại dạng JPEG, và gửi lên photobucket.com như gửi một hình bình thường.

Chúc vui.

tinhthanthep
09-10-2006, 08:58 AM
Đây là sơ đồ bộ điều khiển:
http://i72.photobucket.com/albums/i193/tinhthanthep/DC_Motor_Project_Picvietnam/Schematic.jpg
Phần công suất dùng chip LMD18200
Giao tiếp với PC qua RS232.
Chuẩn ICSP và Bootloader của PICvietnam
Hiển thị thông tin trên LCD 2x16
Có nút gạt chuyển chế độ manual và auto
có nút bấm start/stop, quay trái quay phải và đèn báo tương ứng.
Mạch flip-flop dùng để tăng , giảm số xung nhận được từ encoder khi quay thuận và nghịch (vì capture của PIC chỉ theo chiều tăng). Dùng 2 chip 74HC74.
Dùng 4 biến trở để điều chỉnh hệ số Kp, Ki, Kd, tốc độ bằng tay.
Các bạn thử xem với sơ đồ mạch như vậy còn có vấn đề gì nữa không?.
file orCAD mình gửi kèm theo đây

minhcuong
09-10-2006, 11:13 PM
Các anh chị em cho ý kiến nhé. Cái này tôi đã thử với 1 motor chạy khá tốt, và ổn định.

falleaf
14-10-2006, 03:28 PM
Cho hỏi là mọi người đã làm xong mạch cầu điều khiển động cơ, chạy ngon chưa? Bây giờ các bạn post mạch của mình lên mạng, và chương trình chạy thử, còn có những khúc mắc gì không?

Nhờ anh Nam tổng kết lại.

Chúc vui

bluepine
18-10-2006, 03:32 PM
Chào mọi người, em hiện đang chạy thử trên 1 bo mạch thí nghiệm Pic có bán ngoài chợ Nhật Tảo, phần cầu H em dùng LM18200.(lắp trên break board)
Em hiện đã đọc được tín hiệu encoder về rồi (nhưng chỉ đọc được một xung bằng chế độ đếm xung của timer0 thôi, do khi thử với ngắt on change trên port b bị ngắt liên tục).
Phần PID thì em đã tính được hàm truyền động cơ, mô phỏng trên matlab và tính được thông số PID bằng phương pháp Nychol Zisman 2, cụ thể
hàm truyền động cơ:

\frac{\theta}V = \frac{0.11}{(5.5*10^{-4}s + 0.29)(3.3*10^{-3}s + 2.1) + 0.11^2}

mô phỏng được Kgh = 6600; Tdao động = 10.7 ms
tính ra được Kp = 3960
Kd = 5.926
Ki = 740186
các anh có kinh nghiệm xem các thông số trên có hợp lý không? :)

Còn về giải thuật chương trình chung để điều khiển thì em xem trên 1 ứng dụng của Microchip nhưng vẫn chưa hiểu, các anh có tài liệu nào dễ hiểu hơn gửi lên cho mọi người cùng xem nhé.

falleaf
18-10-2006, 03:44 PM
em có thể gửi hình ảnh mô phỏng, hoặc file mô phỏng của em lên đây để mọi người cùng tham khảo được không?

Chúc vui.

bluepine
19-10-2006, 03:09 PM
Đây là chưong trình mô phỏng

function MophongPID(Kp,Ki,Kd);

J=5.5e-4;
b=0.29;
K=0.11;
R=2.1;
L=3.3e-3;

num=K;
den=[(J*L) ((J*R)+(L*b)) ((b*R)+K^2) (0)];

numcf=[Kd Kp Ki];
dencf=[1 0];

numf=conv(numcf,num);
denf=conv(dencf,den);

[numc,denc]=cloop(numf,denf,-1);
t=0:0.0005:0.08;
step(numc,denc,t);

em lần lượt gọi hàm MophongPID, với các thông số Kp, Ki, Kd thay đổi theo phương pháp NycholZisman2,

Đây là đáp ứng ứng với Kgh = 6600; (xem hinh mophong1), ta đo được Tdaođộng = 10,7ms
Từ pp Nycholzisman2, ta tính được Kp= 0.6*Kgh = 3960, Ki = Kp/Ti = Kp/(0.5*Tdđ) = 740186; Kd = Kp*Td = Kp*(0.125*Tdđ) = 5.3965
Đáp ứng của hệ ứng với Kp,Ki,Kd vừa tính được : xem hình 2

HaiAu2005
19-10-2006, 04:39 PM
Tôi nghĩ những người tham gia mục ứng dụng thực hành này nên viết lại các phần ứng dụng thực hành của mình thành một bản báo cáo khoa học (scientific report). Các bác admin cũng nên tổ chức một tạp chí điện tử cho diễn đàn chẳng hạn, trong tạp chí điện tử đó tập hợp những bài viết, bài báo cáo có tính học thuật khá tốt rồi tập hợp lại thành một số. Ví dụ định kỳ một năm 1, 2 số chẳng hạn. Cũng có thể lựa chọn trong các mods thành một ban biên tập để đóng góp ý kiến cho bài viết có chất lượng tốt.

Hải Âu

ntc
19-10-2006, 06:14 PM
Tôi nghĩ những người tham gia mục ứng dụng thực hành này nên viết lại các phần ứng dụng thực hành của mình thành một bản báo cáo khoa học (scientific report). Các bác admin cũng nên tổ chức một tạp chí điện tử cho diễn đàn chẳng hạn, trong tạp chí điện tử đó tập hợp những bài viết, bài báo cáo có tính học thuật khá tốt rồi tập hợp lại thành một số. Ví dụ định kỳ một năm 1, 2 số chẳng hạn. Cũng có thể lựa chọn trong các mods thành một ban biên tập để đóng góp ý kiến cho bài viết có chất lượng tốt.


Em ủng hộ ý kiến của anh.

Hiện nay các thành viên chưa có thói quen viết, vì có thể cho rằng đó là một công việc mất thời gian, tốn công sức. Nhưng cái gì cũng có cái giá của nó. Bỏ ra một chút thời gian và công sức sẽ thu lại được sự vững vàng trong các kiến thức, các vấn đề đã từng giải quyết.

Hơn nữa, đã gọi là dự án mở, thì không thể thiếu một hai bài viết được. Làm tới đâu viết tới đó, củng cố lại tới đó, dễ theo dõi, dễ hướng dẫn, làm việc có định hướng và tập trung hơn.

Bữa giờ em cứ chờ đợi ở luồng này một bài báo có tính chất học thuật, để học và biết thêm (em chưa sờ tới cái động cơ bao giờ cả :D). Nhưng chờ hoài không thấy, mà thấy hơi lung tung thế nào ấy. Lúc thì nói về sơ đồ nguyên lí, lúc thì nói về mô phỏng, ... Các anh hướng dẫn cũng vất vả theo.

Được một thời gian sôi động, thành quả thực hiện như thế nào, tiến độ tới đâu, em cũng chịu.

Bản thân em thì viết chương trình cho con LED nó sáng em cũng viết lại. Đấy, cũng có được một cái tutorial coi được. Cũng không thể nói là thiếu thời gian để viết. Anh Nam bận đến bao nhiêu cũng bỏ công sức và thời gian viết các tutorial về dsPIC.

Em nghĩ mỗi người chia ra viết một đoạn, ai mô phỏng rồi thì viết cái báo cáo về mô phỏng, ai test mạch thành công rồi thì viết một chút để giải thích về sơ đồ nguyên lý và nguyên lí hoạt động, ai viết chương trình thành công rồi thì viết một chút về chương trình của mình. Form chuẩn đã có rồi. Cuối cùng tổng hợp lại, mọi vấn đề về PID sẽ được giải quyết, ai bị kẹt phần nào, thì thma khảo của người đã giải quyết được rồi, cuối cùng ai cũng làm được, đõ tốn thời gian và công sức.

HaiAu2005
19-10-2006, 08:51 PM
Cấu trúc của một bài báo cáo khoa học (để đăng tạp chí, tham dự hội nghị) thông thường có cấu trúc và các mục như sau:

Tiêu đề (Title): ngắn gọn cô đọng chứa đựng thông tin chính về nội dung báo cáo. Thông thường dài khoảng 10 từ.

Tên người viết (tác giả) và người cộng tác cùng địa chỉ liên lạc.

Tóm tắt (Abstract, hoặc Summary): Tóm tắt nội dung của bài báo cáo. Phần này nói chung là tóm tắt ý chính của bài báo. Thường dài khoảng 150 (ngắn) tới 300 (hơi dài) từ.

Từ khóa (Keywords): các từ chính dùng để phục vụ cho việc tìm kiếm, đặc biệt các tài liệu điện tử - các từ khóa này thông thường do hội nghị và các ban biên tập tạp chí quy định.

1. Giới thiệu (Introduction)

2. Phương pháp (Methodology) - Thuật toán (Algorithms)

3. Thí nghiệm (Experiments) hoặc Mô phỏng (Simulation)

4. Kết quả thí nghiệm - Kết quả mô phỏng (Results)

5. Phân tích, đánh giá thảo luận (Analysis, Evaluation and Discussion)

6. Kết luận (Conclusion) và Hướng phát triển tiếp (Future Work)

Lời cảm tạ (Acknowledgements)
Tài liệu tham khảo (References)
Phụ lục (Appendices)

Điểm quan trọng trong bài báo là người viết phải biết cách trích dẫn tài liệu tham khảo, trình bày các biểu bảng số liệu sao cho dễ đọc dễ hiểu. Khi viết báo cáo khoa học người viết cần phải biết áp dụng hệ thống tham khảo nào và theo suốt trong cả bài. Trên thế giới có nhiều hệ thống tham khảo, ví dụ như Hệ thống tham khảo Harvard, Hệ thống tham khảo APA (American Psychology Association)... Các bài báo về khoa học tự nhiên và công nghệ thường sử dụng hệ thống tham khảo Harvard (Harvard Referencing System). Ai quan tâm có thể tìm được hướng dẫn viết bài sử dụng hệ thống tham khảo Harvard trên Internet. Ví dụ sử dụng hệ thống tham khảo Harvard, hệ thống này có hai phần: 1. viết lời trích dẫn trong đoạn văn, 2. liệt kê danh mục tài liệu hướng dẫn trong phần Tài liệu hướng dẫn. Phần 1 có liệt kê nhiều loại trích dẫn trực tiếp, gián tiếp các loại ấn phẩm khác nhau, đại loại là nếu trích dẫn thông tin "Hệ thống điều khiển PID đầu tiên được thiết kế cho tàu thủy vào năm 1922..." thì có thể viết theo một số cách như sau:

Theo AB (2003) hệ thống điều khiển PID đầu tiên được thiết kế cho tàu thủy vào năm 1922...

Hệ thống điều khiển PID đầu tiên được thiết kế cho tàu thủy vào năm 1922... (AB, 2003).

Trong AB (2003) viết "Hệ thống điều khiển PID đầu tiên được thiết kế cho tàu thủy vào năm 1922... ".

Và trong danh mục tài liệu tham khảo liệt kê tài liệu theo thứ tứ ABC như sau..

Tài liệu tham khảo

AA, B (2001) ...

AB, C. (2003) Modern PID Control Systems. Control Engineering Practice. Elsevier, Pergamon, UK, 2(3), pp. 12-20.

...

H.A.

bluepine
20-10-2006, 11:07 AM
Chào mọi người, em cũng thấy ý kiến của mọi người về báo cáo khoa hoc rất có ích cho mọi người tham khảo, học hỏi thêm kiến thức từ những kinh nghiệm thực tế.
Tuy nhiên hiện nay, dự án đang còn đang thực hiện, giải thuật bọn em đang nghiên cứu để áp dụng vẫn chạy chưa đúng, những tài liệu tham khảo còn chưa hiểu rõ được. Cho nên, em nhận thấy khi đã chạy thành công ra được kết quả đúng thì mới làm báo cáo khoa học thể, chi tiết cho mọi người xem được.

falleaf
01-11-2006, 07:44 PM
Hiện nay cho hỏi lại, còn bao nhiêu người theo tiếp dự án này, đã làm động cơ chạy được chưa, đọc được số liệu về máy tính chưa (số liệu encoder), dùng Hyperterminal, hoặc là dùng chương trình tự viết...

Tất cả đã làm xong phần này chưa, chúng ta có thể đi vào vấn đề PID được chưa?

Chúc vui

bluepine
02-11-2006, 08:51 AM
Hiện nay cho hỏi lại, còn bao nhiêu người theo tiếp dự án này, đã làm động cơ chạy được chưa, đọc được số liệu về máy tính chưa (số liệu encoder), dùng Hyperterminal, hoặc là dùng chương trình tự viết...

Tất cả đã làm xong phần này chưa, chúng ta có thể đi vào vấn đề PID được chưa?

Chúc vui

Chào mọi người, em hiện đã điều khiển được động cơ dùng PID, số liệu khá chính xác (sai lệch về tốc độ rất nhỏ). Tuy nhiên chỉ điều khiển được với một tải cố định thôi, khi gỡ cục tải ra thì không còn đúng nữa nên em nghĩ các thông số PID thay đổi khi tải thay đổi. Anh F cho em hỏi có cách nào tính các thông số PID theo sự thay đổi của tải không?
Đây là chương trình em đã chạy tốt với 1 tải cố định


#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 = 250;

/////////////////////////////////////////////////////////
int16 v_cur;
int16 e_sum;
int16 e_del;
int16 flag_timer1;


///////////////////////////////////////////////////////////
unsigned long kp =5;
unsigned long ki = 0.62;
unsigned long kd = 10;
////////////////////////////////////////////////////////////


int16 pw_duty;
int16 counted_round_value;
int16 temp_timer0;
int16 update_counted_round_value;

#byte TMR0 = 0x01 //timer0 REGISTER
#byte TMR1_L = 0X0E
#byte TMR1_H = 0X0F

#define START_VALUE_TIMER0 55 //tri khoi tao ban dau cua timer0 55, so xung dem duoc moi khi ngat la 255 - 55
#define START_VALUE_TIMER1 15535 //tri khoi tao ban dau cua timer1 65536-15536

#INT_TIMER0 // ngat timer0 tang bien len 1
void TIMER0_int()
{

set_timer0(START_VALUE_TIMER0);
counted_round_value++;

}

#INT_TIMER1 // ngat timer0 tang bien len 1
void timer1_int()
{

set_timer1(START_VALUE_TIMER1);


temp_timer0 = get_timer0();

if (temp_timer0 == 0){
temp_timer0 = 255;
}
v_cur = counted_round_value*400 + 2*(temp_timer0 - START_VALUE_TIMER0);
set_timer0(START_VALUE_TIMER0);
counted_round_value = 0;
//printf("%ld\t",pw_duty);
flag_timer1 = 1;
}


void init_timer0()
{

setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_2); // timer0 dung xung ngoai va chia xung vao


setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // moi lan tran timer1 la 50000*4* (1/5) uS = 40ms

set_timer0(START_VALUE_TIMER0);
set_timer1(START_VALUE_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);

while(true){
if (flag_timer1 ==1){
flag_timer1 = 0;
cal_pid();
set_pwm1_duty(pw_duty);
}
}
}

mến

falleaf
02-11-2006, 03:38 PM
Em hỏi câu đó mà anh trả lời thì anh là thằng nói dóc :D

Em thử nghĩ coi, vấn đề muôn thuở của điều khiển, vẫn chỉ là cái actuator gắn cục tải vào, và mình muốn nó chạy như thế nào thì nó chạy như thế ấy.

Tất nhiên, anh không nói là không có cách để đạt đến một cái gì đó, người ta vẫn có giả pháp Auto Tuning PID, mà anh Hùng đã giới thiệu.

Em có thể download trên www.tailieuvietnam.net

Em có thể gửi file các thông số đo được lên đây, và em có thể dùng Matlab để nhúng các thông số đó, vẽ thành các đồ thị để giới thiệu cho mọi người?

Ngoài ra, em thay cục tải khác, và em thử tìm lại hệ số PID phù hợp cho hai cục tải đó.

Khi em thay tải khác, em cố gắng tìm hệ số bằng một cách cảm tính, bước này anh đã có đề cập trước rồi. Có nghĩa là, anh muốn em cố gắng sử dụng cảm tính của mình, điều chỉnh các hệ số, cho nó chạy, rồi đọc giá trị về, rồi quan sát: rising time (thời gian đáp ứng), overshoot (vọt lố), và ss error (chả biết cái này tiếng Việt gọi là cái gì nữa).

Em quan sát nó, và em cố gắng cảm nhận, giả sử tôi tăng P, thì điều gì xảy ra, giảm P thì điều gì xảy ra, giả sử tôi có một P tương đối tốt, tăng I, thì điều gì xảy ra, giảm I thì điều gì xảy ra.. tương tự cho D...

Tóm lại là, em cố gắng cảm nhận, đây là giai đoạn quan trọng nhất. Bảng tóm tắt những ảnh hưởng anh đã cung cấp trước đây, nhưng không nhớ, nhưng anh vấn muốn em cảm nhận nhiều hơn khi thực hành điều khiển.

Chúc vui.

Mecha
02-11-2006, 11:04 PM
Mecha xin cung cấp một số tài liệu về vấn đề chỉnh định thông số cho bộ điều khiển PID:

1. PI and PID controller tuning rules for time delay processes: A summary
http://www.tailieuvietnam.net/download/upload/Mecha/PID%20Control/PI%20and%20PID%20controller%20tuning%20rules%20for %20time%20delay%20processes.pdf
Tài liệu tiếng Anh, tập hợp khoảng 60 phương pháp chỉnh định PID cho nhiều dạng mô hình đối tượng có trễ khác nhau.

2. Một số khái niệm cơ bản về lý thuyết điều khiển PID, điều khiển mờ và mờ lai PID.
http://www.tailieuvietnam.net/download/upload/Mecha/PID%20Control/INF01.01.PVN.DBPG.221205.pdf
Tài liệu tiếng Việt nhưng hiện vẫn còn đang trong giai đoạn xây dựng.

3. Một phần mềm viết bằng Basic cho phép tính toán thông số bộ điều khiển PID theo phương pháp Reinisch
http://www.tailieuvietnam.net/download/upload/Mecha/PID%20Control/PID_Reinisch.zip
Phần mềm tự động tính toán thông số bộ điều khiển PID cho các đối tượng quán tính bậc nhất, bậc hai và các đối tượng theo mô hình của Reinisch; xét ổn định theo tiêu chuẩn Routh và vẽ đồ thị đáp ứng quá độ. Trong phần mềm đã có phần hướng dẫn sử dụng.
Chú ý: sử dụng không đúng các bước rất dễ bị báo lỗi. Thông cảm chạy lại từ đầu!;)

Falleaf: Các tài liệu này đã được chuyển về kho. Nếu sau này bị mất link của ftp, các bạn tìm lại bằng tên trong www.kho.tailieuvietnam.net.

bluepine
03-11-2006, 08:36 AM
Chào mọi người, cảm ơn mọi người đã gửi tài liệu, em sẽ về chạy lại chương trình để lấy số liệu chính xác đưa lên cho mọi người cùng xem.
còn phần dùng matlab để vẽ đồ thị kết quả đưa về thì em chưa thử bao giờ nên cần có thời gian để tìm hiểu. à, anh nào có tài liệu hướng dẫn phần này thì gửi lên cho giùm em nhe.
mến,

minhcuong
03-11-2006, 10:26 AM
Hiện giờ tôi đang điều khiển một số DC Motor đồng thời cho dự án của lab. Phần mềm, phần cứng, + các phần linh tinh tôi làm từ A-Z trừ việc chế tạo động cơ, và chip điều khiển. :)

Phương pháp trình PID là trial and error tất nhiên có suy nghĩ một tý, nhưng vẫn là nông dân thôi. Sẽ học hỏi các bác thêm vụ auto tuning.


Tôi gửi kèm các file ảnh capture và file matlab (đổi sang đuôi .txt) chứa transfer function và hàm tạo S-curve chỉ cần dùng mấy phép +,-,*/ shift cơ bản để tăng tốc độ tính toán.

Nhìn chung motor chạy rất êm, chính xác error<1xung, khi có disturbance. Video quay lúc nào rỗi tôi sẽ post lên YouTube.


Một số lưu ý: trong S-Curve nên chia thành 5 giai đoạn:
1- tăng positive acceleration, tốc độ tăng nhanh
2- giảm acceleration, tốc độ tăng chậm lại
3- tốc độ không đổi
4- tăng negative acceleration, tốc độ giảm nhanh
5- giảm acceleration, tốc độ giảm chậm lại
6- chỉnh sửa sai lệch vị trí và dừng hẳn

từ 1->4 chỉ nên dùng PD tránh windup
còn từ 5->6 dùng PID để có thêm phần sửa static error. Lưu ý khi dùng I ở giai đoạn này, nếu error giảm là lập tức reset ngay I term để tránh overshoot. Xem cái ControlScreen , để ý đoạn đồ thị cuối, có ít xung nhọn trồi lên là do I term dùng để sửa lổi vị trí

Khi đọc ghi vào RS232 nên dùng ngắt để tránh blocking main algorithm.

Nếu có thời gian, tôi định implement một đoạn chương trình sau đây:
A- Auto tuning PID:
1- Xác định dynamics của motor tự động bằng gửi step response. Dữ liệu thu thập được, gửi về máy tính để xác định transfer function
2- Sau khi biết transfer function, sampling rate là vòng lặp thử nghiệm các bộ thông số PID rồi chọn kết quả tốt nhất.
Việc tạo bộ thông số PID như thế nào, tôi chưa có thời gian tìm hiểu..... :D Bác nào có cao kiến thì cho vài lời hướng dẫn.

B- Thay RS232 bằng USB để có thể đọc trực tiếp nhiều dữ liệu hơn từ motor: position, vel, các loại thông số trong algorithm để dễ dàng debug và phân tích.

Trần Quốc Đạt
03-11-2006, 11:18 AM
cho minh hoi co ai da lam mach dieu khien dong co dung Hbridge nhu so do da cho ma chay duoc hoan chinh tai cong suat lon chua.
cac bac xai bo fet irf9540(19A/100V) voi irf(28A/100V), ma cac bac chay dong co ti hon the lam gi duoc cho doi chu it ra phai chay gan sat voi so the moi thu duoc truong trinh duoc.
con 1 viec nua do la can phai nang phan driver len sao cho lap trinh cang do ton cong cang tot chu theo nhu cac bac no co san cu choi the thi lap trinh co ma chet ah?
that su ra minh da tham gia dien dan lau roi nhung ko co thoi gian cua minh rat it.
nhung minh se dua cac ban so do mach dieu khien dong co hoi nam truoc minh thi robocon cua doi minh cho cac ban tham khao thu se don gian lai rat nhieu cho cac ban.
sao attach file ko duoc?

minhcuong
03-11-2006, 11:32 AM
Nếu bạn cần điều khiển H Bride dòng lớn. Search Google, OSMC.

Ở lab có thằng bạn đã thiết kế nhái bo mạch OSMC. Hôm nào rỗi tôi post lên cái schematics và cả PCB layout (nếu xin được nó). À mà hình như trong mục file của OSMC yahoo groups cũng có rất đầy đủ đấy.

minhcuong
04-11-2006, 05:58 PM
Phiên bản này tốt hơn. Viết rõ ràng, và cẩn thận hơn. Đổi lại extension *.m để chạy trong Matlab.

các bạn có thể thay đổi thông số của DCMotor vào các parameter phía trên.

Xem trong Attach là S-Curve thực sự của motor tracking theo S-Curve tạo tuần tự.

Phương pháp của tôi rất đơn giản, tất nhiên không thể là best được vì tôi chỉ dùng duy nhất một vòng hồi tiếp vị trí:

error = ref_pos - enc_pos;
PWM = Kp*error + Kd*(error - prev_error);

tải đoạn chỉnh cuối cùng Tail Zone:
có thêm thêm Iterm

if (error<prev_error){
Intergrate_error -= prev_error; //Anti windup
} else {
Intergrate_error += prev_error;
}

if (Intergrate_error>threshold){ //threshold chọn từ 0.1~0.5 maximum của //PWM
Intergrate_error = threshold;
}
PWM = Kp*error + Kd*(error - prev_error) + Ki

minhcuong
10-11-2006, 06:25 PM
Tôi đã xong phần thuật toán quan sát để đoán biết disturbance torque lên trục motor.

Hình gửi kèm là

1 - Reference Velocity dạng S-Curve cho motor chạy một đoạn đường xác định.
2- Tốc độ quan sát sử dụng Full State Observer.

Thực ra nếu đã có encoder thì việc dùng Observer để quan sát tốc độ vòng quay motor thì hơi thừa. Nhưng thực tế cái cần quan sát là dòng diện và tải lên trục motor cũng có thể quan sát được nếu bạn biết chính xác mô hình (hay hàm truyền đạt) của motor.

bluepine
16-11-2006, 01:40 PM
chào mọi người, các bạn làm PID đến đâu rồi, sao không ai pót bài lên tiếp vậy.
Anh F ơi, em đã thay đổi thử các thông số của bộ PID rồi lấy kết quả vẽ lên đồ thị đáp ứng xung của hệ, mọi người cùng xem nhé, các hình này đã dược chú thích rất cụ thể.

falleaf
16-11-2006, 04:18 PM
Cái hình picvietnam3, nhìn vào khá đầy đủ các trường hợp, thế thì bây giờ em dựa vào kết quả, viết một bài giải thích thử xem nào.

Mối quan hệ giữa các giá trị...

Chúc vui

minhcuong
25-11-2006, 11:39 AM
Lưu ý mức lương đưa ra 1500 USD/tháng. Nhưng bạn có thể yêu cầu thêm có thể đến 2200 USD /tháng tùy năng lực thực sự của bạn. Công ty đó ở đây:
http://www.spg.co.kr/en/


2.Ky su tin hoc
1. Position : Software engineer
Location: SPG comapany, Incheon Korea
Skill sets:
+Development Language: C, C++, Assemble
+DSP, Processors: AVR, ARM, Atmel
+Protocols: RS-232, CAN
Project details: + Development of Geared Motor/ PAN Motors
+Motor (BLDC, Servo),speed/position controller
Roles in the project: +Motion control software development
1) Motor speed/position control algorithm
-servo loop analysis and design
Modeling
Digital control algorithm (PID, fuzzy, Adaptive
Simulation
Tuning
- Micom/Dsp application and programming
2) BLDC/Servo motor drive algorithm
-Inverter drive logic for BLDC/servo motor
Square wave driving
Sine wave driving (vector driving)
3) Telecomunication protocol
-432/485 communication
-CAN
Mandatory experiences: -Digital motion control programming
-Servo loop analysis and design
Modeling
Digital control algorithm (PID, Fuzzy, Adaptive...)
Simulation
Tuning
-Micom /DSP application and programming
Preferred experiences: BLDC/Servo motor drive algorithm
-inverter drive logic for BLDC/servo motor
Square wave driving (Vector driving)
Telecommunication application
Hard ware development
3 phase inverter design

Qualification:over 5 years after passing degree
Degree: ME of motion control or related Degree
Salary: 1500$/Month
Accomodations:Free House
Fringe Benefit: Free round way air ticket
Medical check-up support

sinhvien
06-03-2007, 09:31 PM
Em chưa biết gì nhiều muốn đăng ký tham gia bây giờ.
Đây là cơ hội để em hoc về điều khiển. Rất mong được sự hổ trợ từ diễn đàn.

trungkien_0914373773
13-03-2007, 02:50 AM
Thưa Bác F cho em tham gia dự án này với em đang tìm hiểu điều khiển động cơ DC bằng 89 qua mạch cầu H .

bluepine
13-03-2007, 10:50 AM
Hoan nghênh các bạn tham gia đề tài, các bạn hãy đọc các bài trong luồn này trước đi, sau đó chúng ta sẽ thảo luận, tôi hiện đã làm mô hình rồi, phần mạch do chạy chưa ổn định nên phải test lại,
chúc vui

hieulongan039
23-03-2007, 11:01 AM
các bac cho mình hỏi tí nhé, lúc trước mình có làm 1 cái autodoor phan mạch điều khiển cái dộng cơ DC 24v chạy nhanh chậm ngược xuôi (dùng 89 làm điều khiển độ nhanh chậm thông qua 1 cầu phân áp dùng relay) nhưng mình chưa nghe nói qua cái encorder la như thế nào phiền các bác giải thích giúp. dông cơ của mình công suất khoảng 70W, mình dùng 2 con tranistor láy ngang trong tivi làm phần công suất + với 1 relay 2 tiếp điểm (1 thường đóng và 1 thường hở) để dảo chiều. mạch khá đơn giản và chạy cũng tam nhưng 89 ko ổn dịnh lắm, nên mình dịnh chuyển sang PIC (mình dang tìm hiểu PIC). nhưng chưa hiểu mô tê gì về encorder và nếu như dc chưa có thì mình làm sao để có encorder vậy? mong các bác giúp đở.

falleaf
23-03-2007, 01:01 PM
http://www.picvietnam.com/forum//showthread.php?t=224

Bạn nên đọc bài từ đầu tới cuối của luồng để nắm các nội dung chi tiết.

Chúc vui

chuongnlt
23-03-2007, 01:57 PM
cho toi tham gia voi,

falleaf
24-03-2007, 01:10 PM
Giai đoạn tiếp theo, xây dựng đề tài này cho tới luôn. Đó là viết chương trình điều khiển động cơ thông qua hệ số được truyền từ máy tính vào vi điều khiển. Khi động cơ đang chạy, nó không đọc giá trị được nhập sẵn trong PIC, mà sẽ đọc giá trị đó thông qua giá trị đường truyền từ máy tính vào qua cổng RS232.

Như vậy, giai đoạn này, chúng ta sẽ làm một chương trình giao tiếp máy tính với PIC16F877A qua cổng COM, chuẩn RS232.

Nội dung của chương trình, sẽ là truyền 3 thông số Kp, Ki, Kd, xuống vi điều khiển, để vi điều khiển lấy 3 thông số đó và chạy.

Mục tiêu của bài toán này đặt ra là để làm gì? Hãy nghĩ tới vấn đề các thuật toán điều khiển hệ thống phức tạp, các hệ số Kp, Ki, Kd có thể thay đổi, và được cung cấp từ một nguồn ngoài (thuật toán tính toán bên ngoài). Như vậy, chúng ta đang nhấn tới một bước là chia sẻ chức năng điều khiển.

Các bạn nào tham gia tiếp giai đoạn 2 này, xin mời tham gia. Phần này chủ yếu viết phần mềm giao tiếp máy tính bằng VC++ hoặc VB giao tiếp qua RS232 (đã có hướng dẫn của Ngô Hải Bắc).

Chúc vui.

tda
25-03-2007, 04:28 PM
tiếp theo nữa là update online hệ số Kp, Ki, Kd bằng Neuron Network anh F nhẩy. Làm cho tới bến luôn. haha.

bluepine
26-03-2007, 09:27 AM
Chào mọi người,
em đã viết thử chương trình điều khiển động cơ dùng PID giao tiếp với máy tính qua cổng RS232 để hiển thị tốc độ, và nhập dữ liệu (Các hệ số Kp, Ki, Kd, tốc độ đặt) từ phím nhấn trên board điều khiển. Theo em nghĩ ta có thể cho mạch điêu khiển chạy độc lập, hiển thị kết quả ra led 7 đoạn luôn cũng là một giải pháp, mọi người thấy thế nào.
Thân,

omlun
27-03-2007, 02:11 AM
em đang bị bí phần tạo giao diện VB de giao tiep với động cơ!!!
ai giup em voi!!
phần VB ,em hơi bị gà

omlun
27-03-2007, 02:16 AM
cảm ơn anh F,anh F đề ra những đề tài hay quá!!
em đang tính tạo một giao diện bằng VB để điều khiển động cơ DC!
thông qua giao diện nhập các thông số ki.kp,kd và có luôn phần vẽ đồ thị
để so sánh 2 giải thuật diều khiển bằng PID và Nơ ron

falleaf
27-03-2007, 04:18 PM
Cái này rất tốt, bạn có thể tham gia đề tài. Phần giao diện VB hoặc VC++ có thể được thiết kế đơn giản. Hôm nào mình sẽ vẽ một cái hình đơn giản lên để các bạn xem mẫu giao diện chương trình, và các bạn có thể thực hành trên bất kỳ phần mềm nào các bạn muốn, kể cả Matlab nếu muốn.

Chúc vui

trungkien_0914373773
28-03-2007, 12:41 PM
toi gui len mach ve dieu khien toc do dong co DC. Vao trang web cua no co ma nguon day. Toi cung chua lam mach that nen chua biet the nao?

trungkien_0914373773
28-03-2007, 12:43 PM
mach nguyen ly

omlun
16-04-2007, 10:12 PM
Chào mọi người, em hiện đã điều khiển được động cơ dùng PID, số liệu khá chính xác (sai lệch về tốc độ rất nhỏ). Tuy nhiên chỉ điều khiển được với một tải cố định thôi, khi gỡ cục tải ra thì không còn đúng nữa nên em nghĩ các thông số PID thay đổi khi tải thay đổi. Anh F cho em hỏi có cách nào tính các thông số PID theo sự thay đổi của tải không?
Đây là chương trình em đã chạy tốt với 1 tải cố định

#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 = 250;

/////////////////////////////////////////////////////////
int16 v_cur;
int16 e_sum;
int16 e_del;
int16 flag_timer1;


///////////////////////////////////////////////////////////
unsigned long kp =5;
unsigned long ki = 0.62;
unsigned long kd = 10;
////////////////////////////////////////////////////////////


int16 pw_duty;
int16 counted_round_value;
int16 temp_timer0;
int16 update_counted_round_value;

#byte TMR0 = 0x01 //timer0 REGISTER
#byte TMR1_L = 0X0E
#byte TMR1_H = 0X0F

#define START_VALUE_TIMER0 55 //tri khoi tao ban dau cua timer0 55, so xung dem duoc moi khi ngat la 255 - 55
#define START_VALUE_TIMER1 15535 //tri khoi tao ban dau cua timer1 65536-15536

#INT_TIMER0 // ngat timer0 tang bien len 1
void TIMER0_int()
{

set_timer0(START_VALUE_TIMER0);
counted_round_value++;

}

#INT_TIMER1 // ngat timer0 tang bien len 1
void timer1_int()
{

set_timer1(START_VALUE_TIMER1);


temp_timer0 = get_timer0();

if (temp_timer0 == 0){
temp_timer0 = 255;
}
v_cur = counted_round_value*400 + 2*(temp_timer0 - START_VALUE_TIMER0);
set_timer0(START_VALUE_TIMER0);
counted_round_value = 0;
//printf("%ld\t",pw_duty);
flag_timer1 = 1;
}


void init_timer0()
{

setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_2); // timer0 dung xung ngoai va chia xung vao


setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // moi lan tran timer1 la 50000*4* (1/5) uS = 40ms

set_timer0(START_VALUE_TIMER0);
set_timer1(START_VALUE_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);

while(true){
if (flag_timer1 ==1){
flag_timer1 = 0;
cal_pid();
set_pwm1_duty(pw_duty);
}
}
}

mến


Bạn có thể cho mình biết thông số động cơ Dc cuả bạn.Và giải thích giùm đoạn code này cho mình được không:
v_cur = counted_round_value*400 + 2*(temp_timer0 - START_VALUE_TIMER0);

mình mới tập lập trình nên không rành lắm.

bluepine
18-04-2007, 09:30 AM
Chào bạn,
thông số động cơ của tớ là:
Ra= 2.1 ohm; La = 3.3 mH, moment inertia: J = 5.5x10^(-4); Kt= 0.11N.m/A, damping ratio b= 0.29
Động cơ tớ mua là đồ second hand, cái nhãn bị mờ ròi nên nhìn không rõ, nên lên mạng tìm và thấy cái này có hình rất giống thôi, không biết chính xác hay không nữa.
còn về đoạn code trên thì tớ giải thích ngắn gọn thế này: tớ dùng timer0 ở chế độ ngắt tràn để đếm xung ngoài từ encoder, timer1 ở chế độ ngắt tràn.
đoạn chương trình trên có thể viết lại như sau

v_cur = timer0_interupt_number*2*(255 - START_VALUE_TIMER0) + 2*(get_timer0() - START_VALUE_TIMER0);

+ v_cur: số xung đếm được trong mỗi chu kì ngắt timer1
+ timer0_interupt_number: số làn timer0 tràn trong mỗi chu kì ngắt timer1
+ START_VALUE_TIMER0 giá trị nạp cho thanh ghi timer0 ban đầu
+ phải nhân 2 vì ở chế độ đếm xung ngoài thì scaler min =2, (coi datasheet)
+ Nhân (255 - START_VALUE_TIMER0) là số xung mỗi lần timer0 tràn
+ Cộng 2*(get_timer0() - START_VALUE_TIMER0) vì khi ngắt timer1 thì timer0 vẫn đang đếm nên phải cộng thêm giá trị hiện tại của timer0.
chút vui

linhnc308
18-04-2007, 02:26 PM
Code lập trình này trông quen quen. Trước cũng làm một chương trình điều khiển DC như vầy, thế chú e đã cho thủ vẽ đồ thị tín hiệu chưa. Còn về các tham số của bộ PID, sao ko dùng đường 232 và dùng ngắt 232 để truyền và cập nhật các tham số PID khi có tải thay đổi, như vậy sẽ test được với nhiều tải hơn và tìm ra dc bộ tham số thích hợp.

omlun
18-04-2007, 05:29 PM
cảm ơn bạn nhiều!!vì tớ đang làm đồ án về đề tài này!!

nguyenphuocviet
18-04-2007, 08:26 PM
Anh F em hiện đang rất thích về PIC va đang chuẩn bi làm dề tài vê điều khiển DC nhưng diện giờ em chưa hình dung ra là bắt đầu từ đâu . Hiện em chỉ biết sơ về encoder, DC , và viet chương trình cho VDK họ 89** không ah .Còn về PIC thi ko biết , nhưng thời gian em làm dề tài chi có hờ gian là 2 tháng rưỡi thôi nên hi vọng các sư quynh chỉ giúp cho .

falleaf
18-04-2007, 09:57 PM
Đọc lại từ đầu luồng này tới giờ, chắc chắn bạn sẽ có đầy đủ thông tin để làm đề tài. Về bắt đầu học PIC, đọc ở portal trang chủ, bên trái có cái "Dành cho người mới học".

Đọc từ đó đọc đi.

Chúc vui

bluepine
19-04-2007, 09:25 AM
Code lập trình này trông quen quen. Trước cũng làm một chương trình điều khiển DC như vầy, thế chú e đã cho thủ vẽ đồ thị tín hiệu chưa. Còn về các tham số của bộ PID, sao ko dùng đường 232 và dùng ngắt 232 để truyền và cập nhật các tham số PID khi có tải thay đổi, như vậy sẽ test được với nhiều tải hơn và tìm ra dc bộ tham số thích hợp.
chào bạn,
tớ đã truyền tín hiệu về máy tính qua RS 232 , dùng matlab vẽ đồ thị rồi, nhưng kết quả vẫn chưa được tốt ( sai số xác lập và độ vọt lố còn lớn),
với lại đang test thì bổng nhiên động cơ chạy ầm ầm lên, rồi tớ tắt nguồn thì thấy cái cúc tản nhiệt trên cầu H nóng quá, sau đó bật nguồn lại thì động cơ không chạy nữa. kiểm tra thấy xuất VDk suất xung bình thường, chắc cái cầu cháy rồi, đang chuẩn bị mua con khác về thử.

omlun
25-04-2007, 10:23 PM
hiccc!! không thấy ai làm phần điều khiển DC dùng điều khiển PID với các thông số Ki,Kp,Kd nhập từ máy tính hết vậy

omlun
09-05-2007, 06:40 PM
Chào mọi người, em hiện đã điều khiển được động cơ dùng PID, số liệu khá chính xác (sai lệch về tốc độ rất nhỏ). Tuy nhiên chỉ điều khiển được với một tải cố định thôi, khi gỡ cục tải ra thì không còn đúng nữa nên em nghĩ các thông số PID thay đổi khi tải thay đổi. Anh F cho em hỏi có cách nào tính các thông số PID theo sự thay đổi của tải không?
Đây là chương trình em đã chạy tốt với 1 tải cố định

#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 = 250;

/////////////////////////////////////////////////////////
int16 v_cur;
int16 e_sum;
int16 e_del;
int16 flag_timer1;


///////////////////////////////////////////////////////////
unsigned long kp =5;
unsigned long ki = 0.62;
unsigned long kd = 10;
////////////////////////////////////////////////////////////


int16 pw_duty;
int16 counted_round_value;
int16 temp_timer0;
int16 update_counted_round_value;

#byte TMR0 = 0x01 //timer0 REGISTER
#byte TMR1_L = 0X0E
#byte TMR1_H = 0X0F

#define START_VALUE_TIMER0 55 //tri khoi tao ban dau cua timer0 55, so xung dem duoc moi khi ngat la 255 - 55
#define START_VALUE_TIMER1 15535 //tri khoi tao ban dau cua timer1 65536-15536

#INT_TIMER0 // ngat timer0 tang bien len 1
void TIMER0_int()
{

set_timer0(START_VALUE_TIMER0);
counted_round_value++;

}

#INT_TIMER1 // ngat timer0 tang bien len 1
void timer1_int()
{

set_timer1(START_VALUE_TIMER1);


temp_timer0 = get_timer0();

if (temp_timer0 == 0){
temp_timer0 = 255;
}
v_cur = counted_round_value*400 + 2*(temp_timer0 - START_VALUE_TIMER0);
set_timer0(START_VALUE_TIMER0);
counted_round_value = 0;
//printf("%ld\t",pw_duty);
flag_timer1 = 1;
}


void init_timer0()
{

setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_2); // timer0 dung xung ngoai va chia xung vao


setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // moi lan tran timer1 la 50000*4* (1/5) uS = 40ms

set_timer0(START_VALUE_TIMER0);
set_timer1(START_VALUE_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);

while(true){
if (flag_timer1 ==1){
flag_timer1 = 0;
cal_pid();
set_pwm1_duty(pw_duty);
}
}
}

mến


bạn có thể pót sơ đồ nguyên lý của mạch điều khiển động cơ l;ên ko??
xung encoder pha A ban nối vào chân nào vậy?
đọc xong code của bạn tớ đang tính làm 1 mạch để tét thử

bluepine
11-05-2007, 09:57 AM
Chào bạn,
đây là sơ đồ nguyên lý của mạch điều khiển động cơ của mình, nếu bạn muốn test thử thì cứ dùng khối pic, khối cầu và khối Rs232 để gủi dữ liệu về máy tính là được rồi.
thân

omlun
12-05-2007, 06:07 PM
cảm ơn bạn!!
mạch của mình ,do chân encoder mình đưa chân timer 1!
nên mình tính dùng timer 1 để đọc encoder, động cơ mình dùng có công
suất thấp với lại encoder 100 xung/1 vòng nên timer 1 ko sợ bị tràn
mình có sửa lại đoạn code của cậu cho phù hợp với mạch của mình!
khi chạy thử thì no báo lỗi
mong bạn giúp đỡ
#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 = 250;

/////////////////////////////////////////////////////////
int16 v_cur;
int16 e_sum;
int16 e_del;
int16 flag_timer1;


///////////////////////////////////////////////////////////
unsigned long kp =5;
unsigned long ki = 0.62;
unsigned long kd = 10;
////////////////////////////////////////////////////////////

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++;

}

void doc_xung()
{
if ( i==50 )

temp_timer1 = get_timer1();
set_timer1(START_VALUE_TIMER1);//lan tran thu 50 cua timer0 se set timer1
i=0;
if (temp_timer0 == 0){
temp_timer0= 255;
}
v_cur = 2*(temp_timer1 - START_VALUE_TIMER1);
set_timer1(START_VALUE_TIMER1);
i = 1;
//printf("%ld\t",pw_duty);
flag_timer1 = 1;
}


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*50=40ms


setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // moi lan tran timer0 , khoi tao lai luon gia tri dem xung timer1

enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);

}

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 <800)
pw_duty += temp_ki;
if (pw_duty <800)
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 >800) // bao hoa
pw_duty = 800;

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);

while(true){
if (flag_timer1 ==1){
flag_timer1 = 0;
cal_pid();
set_pwm1_duty(pw_duty);
}
}
}

bluepine
14-05-2007, 11:28 AM
#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,

gaumisa
16-05-2007, 03:07 AM
minh co tham khao doan code cua bluepine va lam nhu sau : minh da tao 4 nut nhan tren Vb : opencom , closecom , start , stop . Nut start se gui gia tri "a" , stop goi gia tri "b" .
Phan pic minh viet voi muc dich nhu sau :
dung ngat RDA de khi co 1 bye du lieu truyen tu may tinh ( ki tu "a" hay "b" ) , thi con pic dung hoat dong , nhay den gan gia tri do ( khong biet gia tri luc do la ma hay la ki tu nhi ) vao bien tam va kiem tra !
Dung ngat timer0 lam chu ki lay mau , va doc gia tri timer1 ( doc encoder ; chan ccp2 : gan voi tin hieu encoder )
chuong trinh nhu sau :


#include <16f877a.h>
#device *=16 ADC=10
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT, NODEBUG
#use delay (clock = 20000000)
// Giao tiep vi dieu khien
#use rs232(baud=9600, parity=N,xmit=PIN_C6, rcv=PIN_C7 ) // Giao tiep RS232
#use i2c(master,fast,sda=PIN_C4,scl=PIN_C3,FORCE_HW)
#use fast_io(A)
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include<ctype.h>

#byte PR2 = 0x92

int16 e2;
int16 e1;
///////////////////////////////////////////////////////

int16 v_set = 200;

/////////////////////////////////////////////////////////
int16 v_cur;
int16 e_sum;
int16 e_del;
int16 flag_timer1;
int16 i=1 ;

///////////////////////////////////////////////////////////
unsigned long kp =5;
unsigned long ki = 0.62;
unsigned long kd = 10;
////////////////////////////////////////////////////////////


int16 pw_duty;

int16 temp_timer1;

char tam ;
#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 55, so xung dem duoc moi khi ngat la 255 - 5
#define START_VALUE_TIMER1 15535 //tri khoi tao ban dau cua timer1 65536-15536
#define dir PIN_B3 //or #bit dir = 0x6.3
#define brk PIN_B4
#define pwm PIN_C2
#priority RDA , timer0
#INT_RDA// ngat khi nhan 1 bye
RDA_isr()
{

tam=getc(); // lay gia tri tu cong
}

#INT_TIMER0 // ngat timer0 tang bien len 1
void timer0_int()
{

set_timer0(START_VALUE_TIMER0);
i++ ;


if ( i==50 )//neu nhu sau 50 lan tran cua timer0 (40ms:chu ki lay mau ) thi :

temp_timer1 = get_timer1();
set_timer1(START_VALUE_TIMER1);//lan tran thu 50 cua timer0 se set timer1
v_cur = 8*(temp_timer1 - START_VALUE_TIMER1);
i = 0;
printf("%ld\t",pw_duty);
flag_timer1 = 1;
}


void init_timer0()
{

setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16); // timer0 dung xung ngoai va chia xung vao


setup_timer_1(T1_EXTERNAL | T1_DIV_BY_8); //

set_timer0(START_VALUE_TIMER0);
set_timer1(START_VALUE_TIMER1);
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
}

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 <1000) // 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);

while(tam=='a') //vd 'a' ung voi nut quay thuan // khac a , khac (b) la stop
{


if (flag_timer1 ==1)
{
flag_timer1 = 0;
cal_pid();
output_low(pwm);// tat 4 con fet tuc thoi
delay_us(20);
output_low(brk);
output_low(dir);
delay_us(50);
set_pwm1_duty(pw_duty);

}
}
}
Mong cac ban giup minh ! minh khong biet tai sao khi nhan nut tren VB , mach lai khong chay ! chuong trinh VB da kiem tra dung roi ! thanks nhieu !

gaumisa
16-05-2007, 11:48 AM
va day la code vb cua minh :


Private Sub cmdClosecom_Click()
MSComm.PortOpen = False
Cmdopencom.Enabled = True
Cmdstart.Enabled = False
cmdClosecom.Enabled = False
End Sub

Private Sub cmdexit_Click()
Unload Me
End Sub

Private Sub Cmdopencom_Click()
If MSComm.PortOpen = True Then
MSComm.PortOpen = False
End If
MSComm.CommPort = 1
MSComm.Settings = "9600,N,8,1"
MSComm.InBufferCount = 0
MSComm.InputLen = 0
MSComm.PortOpen = True
cmdStop.Enabled = False
Cmdstart.Enabled = True
Cmdopencom.Enabled = False
cmdClosecom.Enabled = True
End Sub

Private Sub Cmdstart_Click()

MSComm.Output = "a"
cmdStop.Enabled = True
Cmdstart.Enabled = False
End Sub

Private Sub cmdStop_Click()
MSComm.Output = "b"
cmdStop.Enabled = False
Cmdstart.Enabled = True
End Sub



Private Sub Form_Load()
Cmdstart.Enabled = False
cmdStop.Enabled = False
cmdClosecom.Enabled = False
End Sub

falleaf
16-05-2007, 06:43 PM
Gửi thêm cái tutorial PID, cái này cực đơn giản, làm với Matlab, lại rất hay.

Chúc vui

VJC1
17-05-2007, 12:51 PM
Các bác cho em hỏi làm thế nào chỉ dùng 1 con PIC 16F877 mà đọc được 2 encoder? hoặc các bác có giải pháp nào khác không chỉ bảo giúp em với.

falleaf
17-05-2007, 01:29 PM
Bạn có thể ngắt onchange RB để sử dụng 4 ngắt cùng lúc. Khi portB thay đổi (RB4 - RB7) thì sẽ tạo ra ngắt. Khi ngắt, bạn quét bốn 4 chân này.

Chúc vui

gaumisa
17-05-2007, 02:50 PM
Anh F cho em hoi ! neu em muon dung ngat ( khi co du lieu truyen tu may tinh xuong cong com ) , thi se gay ra 1 ngat ! con pic se dung , va nhay den thuc hien lenh cua ham ngat do ! thi phai dung nhu the nao ? ( hinh nhu dung int_RDA ) nhung em chua ro cach dung su dung ngat nay ! ngoai cach do , minh co the dung ngat nao de ngat khi co du lieu tu may tinh truyen xuong cong com kg anh ! Thanks

falleaf
17-05-2007, 05:15 PM
Nó có 2 cái cờ RCIF và cờ TXIF là ngắt khi giao tiếp USART. Em set cái này bằng RCIE và TXIE (nhớ kiểm tra lại, vì F không nhớ rõ lắm đâu).

Lấy cuốn Manual Reference cho dòng Midrange ra xem phần USART, trong đó sẽ nói rõ về hoạt động ngắt của hai thằng này.

Chúc vui

tda
27-05-2007, 05:38 PM
Các bác cho em hỏi làm thế nào chỉ dùng 1 con PIC 16F877 mà đọc được 2 encoder? hoặc các bác có giải pháp nào khác không chỉ bảo giúp em với.

Bạn có thể ngắt onchange RB để sử dụng 4 ngắt cùng lúc. Khi portB thay đổi (RB4 - RB7) thì sẽ tạo ra ngắt. Khi ngắt, bạn quét bốn 4 chân này.

-->>the thi` ngat hoai` a`,
Chắc phải mua thêm con PIC khác thôi

bk_future
25-07-2007, 07:53 PM
Có lẽ chương trình này không thích hợp cho mình rùi.Vì mình chuyên về VDK của Philip (8051) .Nhưng mà xin hỏi về 1 câu ngoài lề là tại sao chúng ta phải dùng FET mà không dùng bóng bán dẫn PNP hoặc NPN ?

namqn
25-07-2007, 08:19 PM
Có lẽ chương trình này không thích hợp cho mình rùi.Vì mình chuyên về VDK của Philip (8051) .Nhưng mà xin hỏi về 1 câu ngoài lề là tại sao chúng ta phải dùng FET mà không dùng bóng bán dẫn PNP hoặc NPN ?
Bạn đặt lại câu hỏi thích hợp hơn thì có lẽ mới trả lời được. Còn ở đây, người ta không hề nói 'chúng ta phải dùng FET' nên không trả lời câu hỏi tại sao của bạn được. Trong một số sơ đồ ở các post đầu vẫn có các mạch dùng các BJT.

Thân,

Sangcao
26-07-2007, 12:40 PM
Gửi bk_future :Đối với các mạch công suất lớn, dùng Fet là thích hợp nhất, do FET có dòng điều khiển nhỏ hơn các bóng bán dẫn khác (NPN, PNP) rất nhiều, chỉ khoảng 100mA là mở được rồi, trong khi các bóng NPN dòng kích cỡ A cơ.

bk_future
26-07-2007, 03:28 PM
Thanks bác Sangcao nhìu,À mình xin góp ý là chúng ta nên dùng mạch role vì nó gọn hơn mạch cầu H và tiết kiệm được port của VDK .

huybo02
26-07-2007, 04:45 PM
Role có tốc độ đóng ngắt thấp. Ở đây chúng ta dùng PWM khoảng 25KHz nên không dùng role.
Cho em hỏi về cách khởi động gián tiếp động cơ. Dùng mạch gì là thích hợp nhất vậy? Em có xem mấy mạch khởi động gián tiếp dùng role (theo dòng, theo áp, theo thời gian) nhưng không biết phải kết hợp với cầu H và VDK như thế nào.

Sangcao
26-07-2007, 06:04 PM
Bạn nên dùng thuật ngữ đúng chuyên ngành, nói 'khởi động gián tiếp động cơ' thì đúng là lần đầu tiên tôi đc nghe, ko hiểu nên ko thể giúp gì được!

namqn
26-07-2007, 06:40 PM
... À mình xin góp ý là chúng ta nên dùng mạch role vì nó gọn hơn mạch cầu H và tiết kiệm được port của VDK .
Bạn đang góp ý theo kiểu đi ngược về quá khứ, người ta chuyển từ rơle sang van (khóa) bán dẫn theo sự phát triển của công nghệ chế tạo linh kiện.

Thân,

Tuấn Anh CVN
27-07-2007, 12:41 AM
Chào các bạn, mình vừa đọc mẩu tin về điều khiển PID cho động cơ DC và biết rằng PIC Vietnam cần những thành viên làm sample cho việc này. Hiện mình đang làm ở CVN (CanonVietnam). Mình đã từng sử dụng AT89C51 để đo tốc độ động cơ DC hiển thị ra LED 7 vạch. Trong công ty mình sản xuât máy in loại mobile khá hiện đại và có rất nhiều động cơ DC có gắn sẵn encoder với độ phân giải khá lớn 600 vạch/vòng. Động cơ này tuy nhỏ nhưng có thể chịu đựng mức điện áp 32V và speed max trên 9000 vòng/phút. Mình mới lập trình trên PIC 18F452 và cũng biết qua một số chức năng cơ bản nhưng chưa thành thạo và hiểu sâu các chức năng này. Mình rất muốn tham gia vào hoạt động này. Đối với mình công việc mà một thành viên phải làm như đã nêu thật quá dễ vì ở trong công ty mình những thứ để làm ra phần cứng như vậy rất sẵn.

Tuấn Anh CVN
05-08-2007, 06:39 PM
Hiện giờ mình đã chuẩn bị đầy đủ phần cứng cho việc thực hành điều khiển PID cho DC motor. Mình sử dụng PIC 18F452 để điều khiển và DC motor loại nhỏ thôi (Umax=32V) có gắn sẵn encoder loại 600 xung/vòng. IC driver dùng loại L298 (sử dụng cả 2 cầu H để tăng dòng chịu tải). Lần đầu mình tính chỉ hàn câu dây thôi. Khi nào chạy OK mới vẽ Orcad để làm mạch in hoàn chỉnh. Hiện mình vẫn đang đọc phần PWM trong datasheet. Khi nào có câu hỏi gì mong các bạn giải thích giúp.

cuopbienquin
18-08-2007, 12:28 PM
http://i190.photobucket.com/albums/z275/rosanhdieu/modulecs.jpg
Mình đang tìm hiểu vê đề tài này.Nhưng chưa biết rõ nguyên lý hoạt động của mạch công suất ntn?
1.Tốc độ động cơ phụ thuộc vào dòng điện qua cuộn dây,vậy chân PWM xuất xung ntn để ?Có phải tần số càng cao thì tốc đọ động cơ càng lớn,chu kỳ duty ảnh hưởng ntn?
2.Nguyên lý hoạt động các module trên mạch như FET,relay ntn?
3.Nguyên lý hoạt động tỏng quát của mạch ra sao?
Bạn nào đã làm rồi hay hiểu thì có thể giải thích gium` mình hay chỉ link có sẵn cũng được.Cám ơn nhiều.Chúc vui vẻ

microteck
20-08-2007, 03:06 AM
Cho em hỏi.
Em ở Tp.HCM
Em nên mua động cơ ở đâu là tốt nhất và giá mềm :P.
Các bác chỉ em cái.
Em dân điện tử chưa biết gì về động cơ mong các bác chỉ luôn cho em mua động cơ loại nào.
Để em quyết tâm học tập cho bằng anh bằng chị:P
Cám ơn các bác. Mong các bác luôn khỏe.

vào đây coi thử

http://dientuvietnam.net/forums/showthread.php?t=6804

ntkha1985
13-09-2007, 09:07 PM
Chào bạn,
đây là sơ đồ nguyên lý của mạch điều khiển động cơ của mình, nếu bạn muốn test thử thì cứ dùng khối pic, khối cầu và khối Rs232 để gủi dữ liệu về máy tính là được rồi.
thân

sao cái file đó mình down về rồi kô thấy gì cả nhỉ.
bạn có thể post lại được không
nếu vẽ kỹ lại sơ ồ thì càng tốt

hampic
12-10-2007, 05:38 PM
Có lẽ chương trình này không thích hợp cho mình rùi.Vì mình chuyên về VDK của Philip (8051) .Nhưng mà xin hỏi về 1 câu ngoài lề là tại sao chúng ta phải dùng FET mà không dùng bóng bán dẫn PNP hoặc NPN ?

Người ta sử dụng FET/MOSFET để đk đco vì khả năng đóng ngắt của nó có tốc độ cao hơn, điều khiển đơn giản hơn (điều khiển bằng áp ở cực cổng), khả năng chịu dòng tải cũng lớn hơn. Do đk bằng áp nên tiêu tán cũng nhỏ hơn so với BJT....

Thân.

binhdt04
30-10-2007, 10:16 AM
no hoat động như sau
pwm-> kít hai mức 0, va 1 khi kít mức 0 thi fet dẩn lam cho dồng cơ có dòng đổ qua thi no hoạt động còn duty có ảnh hưởng ntn tới tốc độ động cơ thì nó la ntn :
thời gian kít mức 0 cang chím nhiều trong chu kỳ thì %tốc độ động cơ càng cao
còn relay thì nó chỉ làm nhiệm vụ đảo chiều dộng cơ thôi khi chan dir dược kít thì trans đuoc kít làm relay chuyen trang thái
:d
hihi
giai thich như thế không biết có đúng không các bac chỉ hộ tôi với

tbdgroup45
08-11-2007, 10:11 AM
Chào các bác em cũng đang có một đề tầi về con encoder này nhưng làm với con PSOC cụ thể là như thế này:
Đo tốc độ xe và đo quãng đường côngtơmet
Đầu vào : Cảm biến vòng quay mỗi vòng, bộ kiểm soát tốc độ báo về 2 xung
Quy chuẩn ra km/h và km
Độ chính xác 0.1km
Nhờ các bác chỉ bảo giúp về tkế hệ thống,sơ đồ khối phần mềm và code chương trình

tbdgroup45
08-11-2007, 10:57 AM
Các bác có thể giup em thiết kế mạch đo tốc độ xe và quãng đường công tơ met sử dụng con PSOC với :
đầu vào :Cảm biến vòng quay mỗi vòng . bộ kiểm soát tốc độ báo về 2 xung, độ chính xác 0.1km
Tkees sơ đồ khối phần mềm, code chương trình

navy
29-11-2007, 09:50 PM
http://i190.photobucket.com/albums/z275/rosanhdieu/modulecs.jpg
Mình đang tìm hiểu vê đề tài này.Nhưng chưa biết rõ nguyên lý hoạt động của mạch công suất ntn?
1.Tốc độ động cơ phụ thuộc vào dòng điện qua cuộn dây,vậy chân PWM xuất xung ntn để ?Có phải tần số càng cao thì tốc đọ động cơ càng lớn,chu kỳ duty ảnh hưởng ntn?
2.Nguyên lý hoạt động các module trên mạch như FET,relay ntn?
3.Nguyên lý hoạt động tỏng quát của mạch ra sao?
Bạn nào đã làm rồi hay hiểu thì có thể giải thích gium` mình hay chỉ link có sẵn cũng được.Cám ơn nhiều.Chúc vui vẻ
Khi cach li quang = '0' thi động cơ chạy vi phần ứng có dòng điện chạy qua, khi ='1' thì động cơ bị mất điện áp phần ứng (do quán tính nên chưa dừng ngay được) nó rơi vào trạng thái hãm động năng. Nếu tần số f (tương đương với tần số cấp xung '0' '1') tăng lên thì giá trị trung bình của điện áp đặt vào phần ứng của động cơ cũng tăng lên do đó tốc độ động cơ cũng tăng theo (%duty tăng lên). Đây là một trong ba pp điều chỉnh tốc độ động cơ điện DC.

Gửi các bạn tham khao một ý kiến nhỏ khi hiệu chỉnh theo tải bộ điều khiển PID !

Đặc tính điều áp bằng pp điều chế độ rộng xung(PWM) này là một họ đường thẳng song song với nhau, tốc độ không tải lí tưởng thay đổi mà độ cứng đặc tính cơ không thay đổi. Khi làm bài toán PID các bạn chú ý với tải Mc = cosnt thì khi thay đổi tốc độ điểm làm việc của hệ truyền động sẽ thay đổi theo nên các bạn phải tính tương ứng với việc hiệu chỉnh Kx để có điểm làm việc và đáp ứng đầu ra mong muốn.Nếu tải Mc != cosnt(dạng bậc hai, hypepol hay bậc nhất...) thì các bạn phải khảo sát, phân tích hệ truyền động tương ứng và tính toán theo đặc tính của phụ tải + đặc tính của động cơ (= Hệ TDD ) từ đó xác định được các điểm làm việc tương ứng với phụ tải mà bạn thay đổi .

navy
24-12-2007, 03:03 PM
Các cao thủ PIC trong luồng này không biết đã làm xong hết phần PID này chưa mà lâu rồi không thấy thảo luận nữa? Mình mày mò làm thực hành với PIC nhưng vừa mới kiếm được 1 em động cơ có Encorder 100x/v giống của tinhthanthep định làm theo các bạn. Không biết các bạn đã thực hiện xong chưa và kết quả có khả quan không để minh đọc kỹ lại luồng này từ đầu và làm theo? rất mong các cao thủ cầm trịch trong luồng hồi đáp!

navy
24-12-2007, 03:09 PM
Nếu như các cao thủ đã làm xong và có báo cáo rồi thì mong F bang chủ post báo cáo lên diễn đàn cho anh em làm sau học theo mới!Mình dạo này mới có thời gian lên diễn đàn nhiều hơn vì bây giờ muốn nghiên cứu kỹ tên PIC6F877A.

navy
01-01-2008, 12:20 PM
Mình muốn làm một bộ điều khiển PID như của bạn. Mình kiếm mãi mới tìm được một em động cơ Encorder 100x/v. Mình đã đọc hết tất cả những bài bạn viết trong luồng "Tìm người làm bài thực hành PID..." và muốn bạn giúp đỡ trong quá trình làm. Không biết luồng trên còn làm việc không hay xong rồi mà mình hỏi mãi không thấy ai trả lời cả. Mình down sơ đồ nguyên lý của bạn bằng Orcard về rồi nhưng không sao mở được,bạn vẽ trên orcard 9.0,9.1,hay 10.0 vậy. Nếu có thể bạn gửi cho mình cả sơ đồ và chương trình bạn viết cho PID giao tiếp với máy tính được không?Cảm ơn bạn nhiều! Mình thực sự rất muốn thử làm cái bạn đã làm này. Cám ơn bạn rất nhiều!Happy New Year 2008! Nếu có thể gửi cho mình qua mail nguyenvan_lanh3@yahoo.com.Mong học hỏi ở bạn nhiều điều bổ ích nhờ các bạn và PICVN!

manhha2799
02-01-2008, 12:54 AM
Sao ko thảo luận tiếp vậy các bác. Chủ đề này rất hay mà.

buoiit
05-02-2008, 10:36 PM
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
http://i270.photobucket.com/albums/jj103/buoiit/dongco.jpg
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
http://i270.photobucket.com/albums/jj103/buoiit/Picture079.jpg
http://i270.photobucket.com/albums/jj103/buoiit/Picture078.jpg
http://i270.photobucket.com/albums/jj103/buoiit/Picture081.jpg
http://i270.photobucket.com/albums/jj103/buoiit/Picture082.jpg

namqn
06-02-2008, 01:47 AM
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
http://i270.photobucket.com/albums/jj103/buoiit/dongco.jpg
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
http://i270.photobucket.com/albums/jj103/buoiit/Picture079.jpg
http://i270.photobucket.com/albums/jj103/buoiit/Picture078.jpg
http://i270.photobucket.com/albums/jj103/buoiit/Picture081.jpg
http://i270.photobucket.com/albums/jj103/buoiit/Picture082.jpg
+ 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,

buoiit
06-02-2008, 10:40 AM
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?

namqn
07-02-2008, 05:24 PM
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,

dvnccbmacbt
19-02-2008, 01:19 PM
Biết ai ko mechatronic, he he làm interface xấu quá. Interface nè

dao động liên tục
http://i71.photobucket.com/albums/i123/scentoflove_ppan/p4i0d02.jpg
dao động tắt dần
http://i71.photobucket.com/albums/i123/scentoflove_ppan/p3i0d0.jpg
vọt lố
http://i71.photobucket.com/albums/i123/scentoflove_ppan/p2i0d0.jpg
vọt lố sau đó tiến tới set point
http://i71.photobucket.com/albums/i123/scentoflove_ppan/p1i0d0.jpg

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.

tuyenqs
15-04-2008, 12:11 AM
đề 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é.

phanyen
17-04-2008, 02:00 AM
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 !

phanyen
17-04-2008, 02:01 AM
liên hệ với em theo địa chỉ này nè ! nguyenson8486@yahoo.com or Mr.son84@gmail.com

phanyen
17-04-2008, 02:09 AM
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

phanyen
17-04-2008, 11:39 PM
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

jean
20-04-2008, 06:29 PM
#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é :D

namqn
21-04-2008, 12:52 AM
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,

kstn
05-05-2008, 07:29 PM
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

namqn
05-05-2008, 08:25 PM
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,

kstn
07-05-2008, 12:52 AM
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!

namqn
07-05-2008, 02:37 AM
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!
Dòng kích nhỏ vẫn có thể kích tốt cho các MOSFET/IGBT có điện dung ngõ vào nhỏ (thường là các linh kiện có điện áp định mức thấp).

Có thể dùng 1N5819 để thay cho BYV79E, tuy nhiên điện áp của rail nguồn của cầu H không nên vượt quá 40 V (tốt nhất là không vượt quá 35 V).

Cầu H này có thể chạy tốt ở tần số 20 kHz.

Thân,

ranhcon
09-05-2008, 12:57 AM
các anh cho em hỏi nếu dùng LM393 để nâng điện áp PWM 5v lên 12V rồi đưa vào IR2101 mà không cần dùng opto có được không, như vậy chắc là sẽ nâng được tần số PWM lên phải không ạ

namqn
09-05-2008, 01:06 AM
các anh cho em hỏi nếu dùng LM393 để nâng điện áp PWM 5v lên 12V rồi đưa vào IR2101 mà không cần dùng opto có được không, như vậy chắc là sẽ nâng được tần số PWM lên phải không ạ
IR2101 chấp nhận ngõ vào mức 5 V như là logic '1', tại sao cần phải nâng điện áp đó lên 12 V?

Việc dùng optocoupler hay không là tùy người thiết kế. Câu trả lời cho câu hỏi của bạn là được: bạn có thể nối thẳng tín hiệu logic đến ngõ vào của IR2101, không cần qua optocoupler.

Tất nhiên khi không có optocoupler thì giới hạn tần số do đáp ứng chậm của optocoupler sẽ không còn. Nói vậy không có nghĩa là muốn nâng tần số lên bao nhiêu cũng được, vì còn nhiều yếu tố ràng buộc khác.

Thân,

dangtq84
09-05-2008, 11:31 AM
Em có sơ đồ mạch trong file đỉnh kèm. Em muốn điều khiển tốc độ 4 động cơ dùng 2 con slave Pic 16f876a và dùng L298.

ranhcon
09-05-2008, 05:49 PM
cảm ơn anh, em cứ tưởng phải đúng 12v mới được, em cũng muốn ghép qua lm393 để cách li luôn giữa mạch pwm và mosfet vì lm393 có dạng open drain mà

bigtitan
09-05-2008, 11:39 PM
2. Phương pháp điều khiển.
Phương pháp điều khiển tốt nhất là sử dụng cấu trúc vòng phân cấp. với 3 vòng điều khiển.

- Vòng điều khiển dòng (điều khiển momen) là vòng điều khiển trong cùng có động học nhanh nhất, yêu cầu chu kì đk nhỏ nhất (cỡ 100us-400us).
- Vòng điều khiển vận tốc đứng thứ 2 với chu kì gấp 1 số nguyên lần vòng thứ nhất (thường là 10 lần)
- Vòng điều khiển vị trí là vong ngoài cùng, yêu cẫu chu kì điều khiển lớn nhất và cũng gấp 1 số nguyên lần vòng đk vận tốc.

Chu kì trích mẫu của các vòng là khác nhau nhưng chúng tỉ lệ với nhau. Chu kì này sẽ quyết định hàm truyền rời rạc của đối tượng trong vòng điều khiển.

Vòng điều khiển dòng có thể sử dụng khâu điều chỉnh Dead-beat (tối ưu cấu trúc).
Vòng điều khiển vận tốc có thể dùng thiết kế tối ưu module số (tối ưu tham số)
Vòng điều khiển vị trí tương tự vòng điều khiển vận tốc.



Mấy bác cho em hỏi cái này.Về đk động cơ, ta có thể tìm hiểu lý thuyết chán chê, xây dựng mô hình matlab, nhưng khi làm thực tế chỉ cần xuất PWM để đk vận tốc hoặc vị trí.
Vậy còn dòng, đk làm chi, và như thế nào.vận tốc hay vị trí có thể làm thông qua encoder.Dòng thì sao.Em coi các bài hướng dẫn mô hình( tut trên dieukhien.net) thì thấy làm phần dòng,nhưng thực tế thì ko biết áp dụng như thế nào.Các bác giúp dùm..

bigtitan
09-05-2008, 11:43 PM
http://www.dieukhien.net/vn/index.php?arid=1090

namqn
09-05-2008, 11:57 PM
http://www.dieukhien.net/vn/index.php?arid=1090
Có vẻ như chỉ có thành viên của diễn đàn đó mới xem được bài viết.

Thân,

bigtitan
10-05-2008, 04:08 PM
đại khái là mô hình trên Mfile và simulink, đk dòng và số vòng quay như mong muốn.
Nhưng em ko hiểu mình đk dòng làm gì khi đk số vòng quay và vị trí, thực hiện 3 vòng như bác sphinx nói trên trong khi với PIC chỉ cần đọc encoder, tính sai số, viết hàm PID thế là có số vòng hay vị trí mong muốn.

bigtitan
14-05-2008, 01:18 AM
Có lẽ như bác nam nói, mọi người đã hoàn thành cả rồi.

Greenmouse
06-06-2008, 03:56 PM
Tôi đang làm đồ án về PID dùng để điều khiển nhiệt độ lò nhiệt, thiết bị sử dụng là màn hình HMI có tên là ST402 của hãng Pro-face. Nhưng cái khó là phải viết Script cho PID. Có gì mong anh em chỉ giáo! Cảm ơn nhiều!

tungtuantu
03-07-2008, 07:39 PM
các bác ơi, vậy là cái đề án này vẫn còn đang dở dang ah, đã có ai làm thành công chưa ah, các bác post lên cho newmember bọn em học hỏi với

tungtuantu
07-07-2008, 10:09 PM
bác F chủ trì vụ này sao ko cho bọn em thêm ý kiến j thế, em đọc hết 28 trang rồi mà vẫn thấy dự án bỏ ngỏ, đến thời điểm này là 2 năm rồi mà chưa thấy có một bài báo cáo hoàn chỉnh, hay 1 bạn nào đó thông báo đã làm chạy thành công.
Khẩn mong bác F cho thêm ý kiến, nếu có bác post luôn bài báo cáo thì tốt quá

Thân

manhha2799
07-07-2008, 11:16 PM
Vấn đến này đã giải quyết rồi mà, bạn đọc kỹ lại các trang và xem trang 20,21,22.

tungtuantu
08-07-2008, 08:54 AM
em đã xem các trang đó rồi, nhưng mọi nguòi chưa ai chạy đuọc hoàn chỉnh cả, mà cũng ko co post bài kiểu như báo cáo lên, các sơ đò mạch, thuật toán.... Rất mong anh chủ trì vụ này tổng kết lại cho bọn em với,

tungtuantu
09-07-2008, 03:43 PM
anh F ơi cho bọn em chút ý kiến đi, bọn e đang mong a từng ngày 1

tuanhunghp298
13-07-2008, 01:35 PM
các bác ơi, vậy là cái đề án này vẫn còn đang dở dang ah, đã có ai làm thành công chưa ah, các bác post lên cho newmember bọn em học hỏi với

em tự làm đi, anh chỉ có thể hướng dẫn sơ bộ thôi

manhha2799
27-07-2008, 05:28 PM
Các bác cho em hỏi ý nghĩa những dòng sau(copy trong code mấy bài trên ):
1) v_set = 350; v_set là tốc độ động cơ tính bằng xung hay là tính bằng vòng/phút hay tính bằng gì?
2) Các thông số Kp,Ki,Kd lấy ở đâu?
unsigned long kp =2.5;
unsigned long ki = 0.0092;
unsigned long kd = 0;
3) Giải thích giùm em đoạn code sau:
void cal_pid()
{
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
}

vleminh
06-10-2008, 04:54 PM
em muốn tham gia quá.nhưng không biết đăng kí thế nào đây! với lại em mới vào học pic gần đây nên còn gà lắm.mong các bác giúp đỡ.

vleminh
06-10-2008, 04:58 PM
chà! vừa pót thì lại sai rum. mong các mod bỏ qua. em muốn tham gia thí nghiêm mà bác F đưa ra.nhưng không biết đăng kí thế nào đây! với lại mới học pic nên còn gà lắm mong các bác chỉ giáo. em rất muốn tham gia.

longphi_batbai
13-10-2008, 10:44 PM
em cũng muốn tham gia nhưng thấy mình hơi muộn hơn mọi người, ko biết bây giờ tham gia có đuợc ko vậy bác F? em cũng đang cố gắng xem lại các trang cũ để bắt kịp mọi người, nếu có thể tham gia được,khi nào có mô hình em sẽ post lên để cùng a e trong diễn đàn cùng trao đổi

ilove HUT
15-10-2008, 10:00 AM
Trời đất
Như vậy thì còn j tốt bằng hả anh.Em cũng đang làm một đề tài về robot cứu nạn .Nếu em muốn tham gia thì có được không hả anh.Em phải làm những gì để có thể tham gia được ,mong anh chỉ bảo. Cảm ơn anh nhìu nhìu nhé

trongtin1988
08-12-2008, 10:07 AM
có bác nào có tài liệu liên quan tới mạch cầu H thì giúp với.thanks các bác nhiều nhiều

nmhai
08-12-2008, 11:02 AM
có bác nào có tài liệu liên quan tới mạch cầu H thì giúp với.thanks các bác nhiều nhiều

Bạn có thể tham khảo bài viết về mạch cầu H tại đây http://forum.suno.vn/showthread.php?p=824#post824

cau7_sd
08-02-2009, 12:25 AM
Chủ đề này đang rất hay sao ko thấy các bác thảo luận nữa vậy? Tui đang cố học pic để có thể tự làm một bộ, mong các bác thảo luận tiếp để anh em còn học hỏi chứ!

manhha2799
08-02-2009, 08:26 AM
Cái chủ đề này xong lâu rồi bạn ơi. Cố gắng xem lại mà làm. Mình thấy có đủ hết rồi đó.

longphi_batbai
25-02-2009, 12:53 PM
em mới thiết kế mạch điều khiển động cơ mà không biết có hoạt động ổnko, mong các cao thủ góp ý giùm e,thanks every body

namqn
25-02-2009, 05:38 PM
em mới thiết kế mạch điều khiển động cơ mà không biết có hoạt động ổnko, mong các cao thủ góp ý giùm e,thanks every body
Bạn chưa nối chân 4, 5 của L293 vào GND của mạch. Nguồn 5 V của bạn hơi thừa phần đệm dòng, vì dòng tiêu thụ không lớn lắm. Nguồn 24 V là nguồn động lực, cấp cho động cơ, không nhất thiết phải ổn áp kiểu tuyến tính. Có lẽ bạn đánh nhầm, nhưng 15 V ngõ vào sẽ không bao giờ cho bạn 24 V ở ngõ ra của 7824.

Thân,

mhily07
26-02-2009, 07:10 PM
em chào anh Hiệp , em đang học lớp CĐT do thầy Chung Tấn Lâm phụ trách . sáng nay anh đã đứng lớp dạy tụi em đó . em rất muốn tham gia chương trình mà anh đã đề ra này . anh cho em đăng ký với nhé . em có 1 cái động cơ servo 400 xung /vòng rùi . em đang đăng kí mua PIC 16f887 mà anh giới thiệu hồi sáng đó , còn mạch nạp thì em dự định sẽ tự làm thông qua tìm hiểu trên PVN (có rất nhiù nên em chưa biết chọn loại mạch nạp nào , anh có thể cho em ý kiến ko ạ ? ) . em đang tìm hiểu về Matlab và giải thuật PID . còn về mạch điều khiển thì em đang xoắn óc đây ạ , chưa đâu vào đâu hết (em chỉ mới tìm hiểu hk này thôi ) . mong các anh chỉ dạy thêm ạ .

mhily07
26-02-2009, 07:22 PM
em chào anh Hiệp , em đang học lớp CĐT do thầy Chung Tấn Lâm phụ trách . sáng nay anh đã đứng lớp dạy tụi em đó . em rất muốn tham gia chương trình mà anh đã đề ra này . anh cho em đăng ký với nhé . em có 1 cái động cơ servo 400 xung /vòng rùi . em đang đăng kí mua PIC 16f887 mà anh giới thiệu hồi sáng đó , còn mạch nạp thì em dự định sẽ tự làm thông qua tìm hiểu trên PVN (có rất nhiù nên em chưa biết chọn loại mạch nạp nào , anh có thể cho em ý kiến ko ạ ? ) . em đang tìm hiểu về Matlab và giải thuật PID . còn về mạch điều khiển thì em đang xoắn óc đây ạ , chưa đâu vào đâu hết (em chỉ mới tìm hiểu hk này thôi ) . mong các anh chỉ dạy thêm ạ .

gà mờ
21-03-2009, 09:48 AM
Chào mọi người không biết luông này còn hoạt động không nhỉ,em đang rất cần bộ thông số của động cơ Nisca nhãn hiệu NF5475E . Em tìm trên trang web của Nisca nhưng thông số nó cho chỉ có momen xoắn , hệ số mômen km,chứ chẳng thấy J,b,La,Ra đâu cả . Bác nào có cho em xin với
Thanks!

gà mờ
26-03-2009, 10:51 AM
Luồng này kết thúc rùi sao các bác? Một kết thúc rất là "vietnam" mình :D : Lúc mới bắt đầu các bác giới thiệu đề tài rất hoành tráng bao nhiêu dự định,vơí những mục đích và tham vong lớn lao vậy mà kết thúc chỉ thế này thôi sao không có nổi một cái báo cáo thậm chí tối thiểu là cái kết luận đề tài xem là đã làm đc những gì ,mức độ thành công của đề tài đến đâu(hay các bác làm được thì giữ lại làm bí kíp cho mình luôn hi...:d) . Em đã kiểm tra lại một lượt từ đầu tới cuối luồng thì thấy có mỗi nhóm bác bluepine là đi gần tới cùng (phải chăng vì cái động cơ của bác đó có datasheet nên có được đủ các thông số?) em nói vậy vì thấy với các loại động cơ của các nhóm khác không có đây đủ thông số thì đều không có kết quả cuối cùng (chẳng hạn như nhóm của bác tinhthanthep em thấy tắt ngóm từ phần làm pid...). Em nghe nói phương pháp Ziegler – Nichols 2 không cần đến hàm truyền vẫn tính được các hệ số pid (trích nội dung:Thay bộ điều khiển PID trong hệ kín bằng bộ khuếch đại. Sau đó tăng hệ số khuếch đại tới giá trị tới hạn kth để hệ kín ở chế độ biên giới ổn định, tức là có dạng dao động điều hòa . Xác định chu kỳ Tth của dao động sau do suy ra các hệ số kp,ki,kd) không biết phương pháp này thế nào nhỉ . các bác cao thủ còn tâm huyết với đề tài này xin chỉ giáo cho em với
thanks

mgdaubo
31-03-2009, 02:38 AM
Cho em hỏi: biểu thức toán học của PID là
U(t) = Kp*e(t) + Ki*tich_phan(e(t)) + Kd*vi_phan(e(t)) ; (1)
Vậy sao lại biến đổi ra biểu thức PID rời rạc điều khiển động cơ là:
duty = duty + Kp*e2 + Ki*e_sum + Kd*e_del; (2)
Theo em nghĩ thì phải là "duty = Kp*e2 + Ki*e_sum + Kd*e_del;" mới đúng chứ??? (không phải là cộng dồn duty lên...)

Em có làm thử theo công thức thứ (2) mà mới để Kp = 1; Ki = Kd = 0; mà động cơ đã vọt lố, giao động mạnh rồi, phải dùng tay ghì bánh xe lại (tải rất lớn) thì động cơ mới đỡ giao động ???

Mecha
31-03-2009, 07:16 AM
http://i13.photobucket.com/albums/a262/dbphong/PicVN/Discrete_PID.jpg

Trên đây là công thức tính PID (cấu trúc song song) rời rạc đã được đề cập đến trong rất nhiều sách.

Kp, Ti, Td: thông số của PID
Ts: chu kỳ trích mẫu


<code>

// sense: đọc dữ liệu từ sensor
ek = ref – pv; // pv = present value

// calculate & anti-windup limits
uk = theo công thức;

if ( uk > ukmax )
uk = ukmax;
else if ( uk < ukmin )
uk = ukmin;

// update biến trạng thái
ek-2 = ek-1;
ek-1 = ek;
uk-2 = uk-1;
uk-1 = uk;

// actuate: ghi dữ liệu ra actuator
outPortUk.data()->Set(uk); // ví dụ 1 lệnh gửi dữ liệu ra output port

</code>

Chú ý tuần tự thực hiện nên là: sense(), calculate(), update(), actuate().

Astrom and Wittenmark có đề xuất là “writing first”, khi đó tuần tự thực hiện sẽ là actuate(), sense(), calculate(), update(). Tuy nhiên trong vấn đề này mỗi người có một quan điểm khác nhau.

sandro_bk
31-03-2009, 10:36 AM
Cái PID này người ta đã làm từ rất rất lâu rồi,cái thread này cũng đã tạo ra từ rất lâu mà đến nay cũng chỉ kết thúc ở công thức PID,thật đáng thất vọng,
có điều khi làm lý thuyết là 1 chuyện,thực nghiệm là 1 chuyện,mô phỏng chạy rất ok nhưng thực nghiệm thì lại ko có thông số động cơ?vậy là cuối cùng cũng phải mò mấy hệ số KP,Ki,Kd,

thanhdai
31-03-2009, 02:48 PM
Em đã làm xong bộ điếu khiển dc servo chạy rất ok , đã kết nối với bộ điều khiển cnc tốt có một đoạn phim nhưng không biết làm thế nào pót lên để các bác góp ý

nhatson.elec
31-03-2009, 04:44 PM
gởi lên youtube roi post link bác ah

b/r

Mecha
31-03-2009, 05:23 PM
Cái PID này người ta đã làm từ rất rất lâu rồi,cái thread này cũng đã tạo ra từ rất lâu mà đến nay cũng chỉ kết thúc ở công thức PID,thật đáng thất vọng,
có điều khi làm lý thuyết là 1 chuyện,thực nghiệm là 1 chuyện,mô phỏng chạy rất ok nhưng thực nghiệm thì lại ko có thông số động cơ?vậy là cuối cùng cũng phải mò mấy hệ số KP,Ki,Kd,

@sandro_bk
- Thành viên mgdaubo có thắc mắc về phần công thức nên tôi cung cấp một chút thông tin cho bạn ý.
- Topic này tính đến nay đã có gần 75 nghìn lượt xem và ít nhiều các nhóm cũng đã có kết quả cho nên không thể nói là đáng thất vọng được. Hơn nữa đây là diễn đàn nên việc "học hành" ở đây không giống như trên lớp. Khi tham gia điễn đàn, không ai bắt ai phải thi, phải nộp báo cáo, thuyết minh đầy đủ cả.
- Đề tài tuy đã kết thúc nhưng các thông tin trong topic này vẫn còn giá trị của nó. Các thành viên mới vẫn có thể tham khảo và áp dụng vào công việc học tập của mình.

sandro_bk
31-03-2009, 07:38 PM
gửi bác Mecha,ở đây em thật sự ko có ý gì cả,thật sự cái PID này người ta đã làm lâu lắm rồi,bây giờ mình làm lại,việc mở ra topic này là rất hay,nhưng cách làm theo kiểu phong trao hô hào rồi tất ngấm,em nói chỉ muốn để sau này có topic nào cũng hay như vầy nên làm có quy củ,ví dụ hướng dẫn từng module của PIC cần sử dụng,recommend nên dùng con PIC nào?tại sao?về thiết kế phần cứng về,giải thuật chung,....mô phỏng rồi thực nghiệm,để nếu ko đi đến cuối cùng thì các bạn lứa sau muốn làm cũng có cơ sở,chứ đã hơn 400 bài rồi mà vẫn có bạn hỏi về công thức PID,thì những bài trước đó nói về cái gì?
Cái DC này em đã làm 2,3 cái rồi,nhưng PID toàn mò,vì sao?ko có thông số động cơ mà thực tế đâu phải lúc nào em cũng có thể có được thông số động cơ để tìm hệ số PID theo lý thuyết này,lý thuyết nọ,rõ ràng thực tế rất khác với lý thuyết,
Ở đây,em biết các bác mod và bang chủ đều rất giỏi,em ko dám chê ai,nhưng chúng ta có thể làm tốt hơn thế này phải ko các bác?

thanhdai
02-04-2009, 10:19 AM
EM MỚI LÀM XONG CÁI NÀY . CHẠY THẤY CŨNG KHÁ TỐT INPUT <100Kz ĐIỀU KHIỂN PID NHƯNG HIỆN TẠI CHỈ NHỎ HƠN 40VOL. EM ĐANG LÀM CÁI SẺVO 200VOL - 20A BỊ MẮC KẸT CÁI NGUỒNG XUNG , BÁC NÀO CÓ CÁI NGUỒN DAO ĐỘNG NGHẸT NÀO CHẠY TỐT CHO EM XIN ĐƯỢC KHÔNG, VÌ LÀM ÁP CAO PHẢI CÓ NHIỀU NGUỒN ĐIỀU KHIỂN RIÊNG .
MONG CÁC BÁC GIÚP ĐƠ&

http://www.youtube.com/watch?v=TTu06sOmMRA

gà mờ
06-04-2009, 03:16 AM
Chào các bác em cung làm về đề tài pid điều khiển động cơ và cũng tìm các hệ số kp,ki,kd theo phương pháp thực nghiệm có điều động cơ của em khi chạy không tải thì đáp ứng khá tốt ở tốc độ cao . còn khi cho tốc độ nhỏ khoảng 30v/phút thì nó lại chạy rật cục,em thử rất nhiều giá trị pid mà không làm thay đổi tình hình . vả lại khi cho tải vào thì nó mất ổn định . Bác nào đã làm Pid cho động cơ với cả hai vòng phản hổi,dòng điện và tốc độ cho em xin mạch điện và chương trinh để tham khảo với
THANKS!!!

Mecha
06-04-2009, 04:02 AM
Chào các bác em cung làm về đề tài pid điều khiển động cơ và cũng tìm các hệ số kp,ki,kd theo phương pháp thực nghiệm có điều động cơ của em khi chạy không tải thì đáp ứng khá tốt ở tốc độ cao . còn khi cho tốc độ nhỏ khoảng 30v/phút thì nó lại chạy rật cục,em thử rất nhiều giá trị pid mà không làm thay đổi tình hình . vả lại khi cho tải vào thì nó mất ổn định . Bác nào đã làm Pid cho động cơ với cả hai vòng phản hổi,dòng điện và tốc độ cho em xin mạch điện và chương trinh để tham khảo với
THANKS!!!


Khi thay đổi giá trị của tải, bạn đã tính lại thông số cho PID chưa?

Với vòng điều khiển dòng và tốc độ, bạn chỉ nên dùng PI thôi. Thành phần D có thể là nguyên nhân (phần mềm) gây cho đáp ứng động cơ của bạn bị giật. Ngoài ra có thể còn do thiết kế phần cứng của bạn nữa.

gà mờ
08-04-2009, 12:22 AM
trưởng lão cho em hỏi công thức PID dùng cho dong điện thì cũng giống công thức của tốc độ phải không vậy.em tìm trên mạng nhưng ít thấy nói về dùng pid để điều chỉnh dòng điện ,vì chúng em không được đào tạo bài bàn về điều khiển nên nhờ trưởng lão nói chi tiết một chút
THANKs

mtuankct
08-04-2009, 12:45 AM
Về công thức tổng quát thì PID cho mạch tốc độ hay dòng điện đều như nhau, vấn đề là ở bộ tham số, người ta có nhiều cách để tính toán các bộ tham số cho mỗi mạch vòng (các đối tượng cần thiết kế là khác nhau nên các bộ tham số là khác nhau) bạn có thể tìm đọc cách thiết kế các bộ tham số trong nhiều sách khác nhau về đk tự động, truyền động điện

Mecha
08-04-2009, 06:00 PM
Như bạn mtuankct đã trả lời, công thức PID cho vòng dòng điện và tốc độ là như nhau (thường là PI). Chỉ khác nhau ở thông số P và I của bộ điều khiển. Vòng điều khiển dòng yêu cầu tốc độ đáp ứng phải nhanh hơn vòng tốc độ nên chu kỳ trích mẫu sẽ phải nhỏ hơn. Tương tự nếu vòng ngoài cùng là điều chỉnh vị trí thì chu kỳ trích mẫu của vòng tốc độ cũng phải nhỏ hơn chu kỳ trích mẫu của vòng điều chỉnh vị trí.

Chu kỳ trích mẫu được chọn theo định lý Nyquist-Shannon (http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem) thì tần số lấy mẫu được chọn > 2 lần bandwidth của hệ thống (tức là chu kỳ mẫu nhỏ hơn 2 lần):

- Bandwidth của vòng điều chỉnh dòng điện vào khoảng 10^6 rad/s (chu kỳ khoảng 6 micro giây) => chu kỳ lấy mẫu tầm 3 micro giây. Mô phỏng với chu kỳ lấy mẫu nhỏ như thế này thì oki những khi lập trình thực tế thì vòng điều khiển (real-time) với chu kỳ lấy mẫu nhỏ như thế này là không tưởng. Nên thực tế thường thực hiện lấy mẫu cỡ 0.1 mili giây (10kHz).
- Bandwidth của vòng điều chỉnh tốc độ vào khoảng 120-150 rad/s (20-25Hz) => tần số trích mẫu vào khoảng > 40-50Hz. Tuy nhiên thực tế thường chọn f của vòng điều chỉnh tốc độ vào khoảng 1kHz.
- Bandwidth của vòng điều chỉnh vị trí vào khoảng 30-40 rad/s (5-6Hz) => tần số trích mẫu vào khoảng > 10-12Hz. Tuy nhiên thực tế thường chọn f của vòng điều chỉnh vị trí vào khoảng 100Hz.

Thực hiện 3 tần số trích mẫu khác nhau trên cùng 1 hệ thống điều khiển real-time sẽ là một vấn đề. Cách đơn giản nhất là dùng tần số trích mẫu cơ bản = 10kHz, rồi dùng biến counter trong vòng lặp để giảm tần số trích mẫu xuống cho vòng tốc độ và vị trí. Ví dụ counter=10 sẽ được f=1kHz, counter=100 sẽ được f=100Hz.

gà mờ
08-04-2009, 10:40 PM
Cảm ơn trưởng lão ! Từ gợi ý của anh em làm như vầy không biết có đúng không mong anh chỉ giáo giùm thêm (tạm thời em tiến hành làm hai vòng phản hồi là tốc độ và dòng.) như sau:
Bước 1:
Thực hiện vòng phản hồi tốc độ với chu kỳ 100msec
ev=Vset-Vcur;
ev_cur = ev + evlast; // e_cur sai so hien tai
ev_sum+= ev_cur;
ev_del=ev-elast;
duty +=((kp*ev)+(ki*ev_sum)+(kd*ev_del)); // Công thưc tinh PID(không biết += hay chỉ = thôi anh nhỉ)
if(duty >511) //gioi han PWM 9Bit
{ duty =511; }
if(duty <0) {duty =0; }
evlast=ev;
Bước 2 từ duty em suy ra điện áp Uư= (duty/TOP)*Umax (top =511)
--> Iset = (Uư-kb*ω)/Rư
---> sau đó em cũng thực hiện phản hồi dòng như trên chu kỳ 10msec
ei=I set-Icur;
ei_cur = ei + eilast;
ei_sum+= ei_cur;
ei_del=ei-eilast;
duty +=((kp*ei)+(ki*ei_sum)+(kd*ei_del));
if(duty >511)
{ duty =511; }
if(duty <0) {duty =0; }
eilast=ei;
Pwm = duty;
Anh xem giúp xem em làm vậy có được không nếu không thì anh chỉ giúp em cách lồng hai vòng phản hồi này vào nhau với nếu mà lồng được cả vòng phản hồi vị trí nữa thì càng tốt
Em cảm ơn!!!

Mecha
09-04-2009, 01:38 AM
Bạn chú ý những chỗ in đậm:
- Đây là PID số nên bạn phải có chu kỳ trích mẫu trong công thức.
- Tín hiệu ra của vòng điều chỉnh tốc độ được dùng làm setpoint cho vòng điều chỉnh dòng điện.


// Cho mach vong toc do:
// ham truyen PI trong s-plane: uOutvantoc = Kvantoc [1 + 1/(s*Tivantoc)] errorV
Tvantoc = 0.1; // sampletime = 100ms
errorV = Vref - Vcur;
uPvantoc = Kvantoc * errorV;
uIvantoc = uIvantoc_previous + ( ( Kvantoc * Tvantoc * errorV ) / Tivantoc );
uOutvantoc = uPvantoc + uIvantoc;
uIvantoc_previous = uIvantoc;


// Cho mach vong dong dien:
// ham truyen PI trong s-plane: uOutdong = Kdong [1 + 1/(s*Tidong)] errorD
Tdong = 0.01; // sampletime = 10ms
errorD = uOutdong - Dcur;
uPdong = Kdong * errorD;
uIdong = uIdong_previous + ( ( Kdong * Tdong * errorD ) / Tidong );
uOutdong = uPdong + uIdong;
uIdong_previous = uIdong;

gà mờ
20-04-2009, 01:05 AM
Anh mecha ! cho em làm phiền chút trong công thức trên của anh có nói tín hiệu điều chỉnh vòng tốc độ được dùng làm setpoint của vòng phản hồi dòng có nghĩa là mình đặt luôn uOutdong = uOutvantoc hay gì bởi vì nếu làm như thế thì setpoint sẽ bị thay đổi nên em hỏi lại mong anh chỉ rõ thêm nữa
Cảm ơn anh!!

hutdragon
25-05-2009, 03:10 AM
Như bạn mtuankct đã trả lời, công thức PID cho vòng dòng điện và tốc độ là như nhau (thường là PI). Chỉ khác nhau ở thông số P và I của bộ điều khiển. Vòng điều khiển dòng yêu cầu tốc độ đáp ứng phải nhanh hơn vòng tốc độ nên chu kỳ trích mẫu sẽ phải nhỏ hơn. Tương tự nếu vòng ngoài cùng là điều chỉnh vị trí thì chu kỳ trích mẫu của vòng tốc độ cũng phải nhỏ hơn chu kỳ trích mẫu của vòng điều chỉnh vị trí.

Chu kỳ trích mẫu được chọn theo định lý Nyquist-Shannon (http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem) thì tần số lấy mẫu được chọn > 2 lần bandwidth của hệ thống (tức là chu kỳ mẫu nhỏ hơn 2 lần):

- Bandwidth của vòng điều chỉnh dòng điện vào khoảng 10^6 rad/s (chu kỳ khoảng 6 micro giây) => chu kỳ lấy mẫu tầm 3 micro giây. Mô phỏng với chu kỳ lấy mẫu nhỏ như thế này thì oki những khi lập trình thực tế thì vòng điều khiển (real-time) với chu kỳ lấy mẫu nhỏ như thế này là không tưởng. Nên thực tế thường thực hiện lấy mẫu cỡ 0.1 mili giây (10kHz).
- Bandwidth của vòng điều chỉnh tốc độ vào khoảng 120-150 rad/s (20-25Hz) => tần số trích mẫu vào khoảng > 40-50Hz. Tuy nhiên thực tế thường chọn f của vòng điều chỉnh tốc độ vào khoảng 1kHz.
- Bandwidth của vòng điều chỉnh vị trí vào khoảng 30-40 rad/s (5-6Hz) => tần số trích mẫu vào khoảng > 10-12Hz. Tuy nhiên thực tế thường chọn f của vòng điều chỉnh vị trí vào khoảng 100Hz.

Thực hiện 3 tần số trích mẫu khác nhau trên cùng 1 hệ thống điều khiển real-time sẽ là một vấn đề. Cách đơn giản nhất là dùng tần số trích mẫu cơ bản = 10kHz, rồi dùng biến counter trong vòng lặp để giảm tần số trích mẫu xuống cho vòng tốc độ và vị trí. Ví dụ counter=10 sẽ được f=1kHz, counter=100 sẽ được f=100Hz.
cho em hỏi cách tính cái Bandwidth của vòng điều chỉnh dòng điện,tốc độ như thế nào vậy bác

baodinh88
30-05-2009, 04:18 PM
Mecha xin cung cấp một số tài liệu về vấn đề chỉnh định thông số cho bộ điều khiển PID:

1. PI and PID controller tuning rules for time delay processes: A summary
http://www.tailieuvietnam.net/download/upload/Mecha/PID%20Control/PI%20and%20PID%20controller%20tuning%20rules%20for %20time%20delay%20processes.pdf
Tài liệu tiếng Anh, tập hợp khoảng 60 phương pháp chỉnh định PID cho nhiều dạng mô hình đối tượng có trễ khác nhau.

2. Một số khái niệm cơ bản về lý thuyết điều khiển PID, điều khiển mờ và mờ lai PID.
http://www.tailieuvietnam.net/download/upload/Mecha/PID%20Control/INF01.01.PVN.DBPG.221205.pdf
Tài liệu tiếng Việt nhưng hiện vẫn còn đang trong giai đoạn xây dựng.

3. Một phần mềm viết bằng Basic cho phép tính toán thông số bộ điều khiển PID theo phương pháp Reinisch
http://www.tailieuvietnam.net/download/upload/Mecha/PID%20Control/PID_Reinisch.zip
Phần mềm tự động tính toán thông số bộ điều khiển PID cho các đối tượng quán tính bậc nhất, bậc hai và các đối tượng theo mô hình của Reinisch; xét ổn định theo tiêu chuẩn Routh và vẽ đồ thị đáp ứng quá độ. Trong phần mềm đã có phần hướng dẫn sử dụng.
Chú ý: sử dụng không đúng các bước rất dễ bị báo lỗi. Thông cảm chạy lại từ đầu!;)

Falleaf: Các tài liệu này đã được chuyển về kho. Nếu sau này bị mất link của ftp, các bạn tìm lại bằng tên trong www.kho.tailieuvietnam.net.

link death roi bac oi !!

nguyenluong
30-05-2009, 09:52 PM
Nếu vậy thì rất tuyệt. Nhưng bác F nói rõ đề tài đi, làm trong thời gian bao lâu, và nộp đề tài qua phương tiện gì?

king0205
15-06-2009, 07:35 PM
sao du an toi day lai ket thuc?ket qua cac ban da dat duoc chua?bac F cung ko con port bai len nua vay?de tu mao mui hoi.co gi bo qua nhe!

chuc vui!

TQN1234
17-06-2009, 12:14 PM
Thấy đề tài hay mà lại bị bỏ bê thế này thì hơi tiếc. Mình xin đóng góp cái luận văn của mình làm từ năm 2005. LV này làm về đề tài đk tay máy 3 bậc tự do dùng động cơ DC, có dùng thuật toán PID để điều khiển vận tốc và vị trí động cơ. Lúc làm mô hình, mình đã điều khiển chính xác được vị trí (số vòng quay hay số xung) và tốc độ của động cơ đối với tải thay đổi, Có thể cho động cơ quay với vận tốc rất thấp, chẳng hạn 1 v/p mà vẫn bảo đảm moment...
Nếu bạn nào có đam mê thì nghiên cứu để phát triển tiếp nhé. Lúc đó có tham vọng làm mô hình máy CNC nhưng không có tiền đầu tư, và cũng chẳng có nhiều thời gian nữa, đành bỏ lỡ một thời đam mê, hic hic.

qtiem
17-06-2009, 12:31 PM
Hic, dùng acc kia không up được file. Thử dùng acc này cũng thế. MÌnh úp lên MF, các bạn chịu khó down nhé
http://www.mediafire.com/download.php?mt1nqlzgoza
Mà tại sao mình hay bị log out lắm. Mỗi lần log out, đăng nhập lại bị báo sai pass, chán :(

anhga
14-07-2009, 10:50 AM
Đề tài hay nhưng kết thúc k có hậu:D
Việt Nam mình k ít người làm được bài toán này rồi nhưng ít người chịu chia sẻ. Nếu có chia sẻ thì cũng k hết mình. Có lẽ nước mình nghèo nên các bậc tiền bối giũ miếng kiếm xiền.
Em có vài lời tâm sự vậy thôi. Hy vọng các đề tài hay sẽ có kết thúc có hậu.

biengam
13-09-2009, 11:02 PM
Chào mọi người, không biết kế hoạch này còn thưc hiện không, một ý tưởng rất hay như thế này cần duy trì và phát triển chứ nhỉ.Nếu còn thì tôi xin được tham gia, tôi học dh lạc Hồng.

greenfield
21-09-2009, 12:33 AM
Em đang định làm mạch điều khiển động cơ dùng L298 bác nào có sơ đồ úp lên cho em xem với. Chúc mọi người vui vẻ!

thienhaiblue
19-10-2009, 12:16 PM
uhm! Chào all mọi người! 1 năm trước khi mình còn gà mờ về điều khiển động cơ! Và mình cũng đã đọc qua luồng này và cũng đã đọc all các mục roài! Mình nhận thấy cái gì cũng vậy! căn cơ phải cứng rồi mới tính đến bước tiếp theo! giống như cố nhân đã dạy "chưa học bò đã lo học chạy" Bởi vậy trước khi chúng ta muốn điều khiển động cơ theo các thuật toán trên trời dưới đất gì đó thì cũng phải có một cái mạch driver cho động cơ thiệt tốt cái đã! Chứ chơi kiểu relay đóng ngắt mà đòi PID thì khác gì bắn pháo hoa chơi! :D .Nhưng mà nói đi thì cũng phải nói laị mình thấy có rất nhiều ý bạn đã viết bài ý kiến về việc chưa có ai post một mạch thực sự hoàn chỉnh lên cho mọi người tham khảo, ngay cả bac namqn cũng chỉ post mạch IR2110 bản ko đầy đủ chức năng! Cứ làm theo cái mạch đó thì chắc là phải chạy mua linh kiện dài dài! Chấp nhận là ở đây để cho mọi người chủ động tìm hiểu đi nữa thì cũng phải có nền tảng để mà dựa theo!
Còn 1 điều nữa mình muốn gửi đến những người đã từng đọc luồng này làm thành công mà không chịu chia sẻ cho mọi người là "Đừng có chỉ biết nhận, mà hãy biết chia sẻ"
để đi đầu phong trào mình xin chia sẻ mạch công suất của mình làm và đã test chạy rất tốt!
+chạy ở PWM 20k và duty đáp ứng từ 0 đến 95%
+chống quá dòng và deadtime phần cứng là 3us
+ OPTO cach ly high speed 6N137 10MHZ
+Nguồn nuôi chia làm 2 nguồn: 15V cho driver và 0V đến 100V cho động cơ!
+Có chế độ shutdown
Nơi mua linh kiện:
OPTO 6N137 + IR2110 Mua ở tiệm bên phải tiệm Ngọc nhìn từ trước vào giá 17K và 20k;
Cách linh kiện dán trong mạch mua tại chip lê trần 88 đường nguyễn kim!
file .zip các bạn down về bỏ đuôi zip di và mở bằng orcad layout!
Hy vọng sẽ giúp ích được cho mọi người!
http://dientuvietnam.net/forums/attachment.php?attachmentid=18672&d=1255919116
http://dientuvietnam.net/forums/attachment.php?attachmentid=18671&d=1255918788

nguyenbahai
10-05-2010, 03:43 PM
Em đang định làm mạch điều khiển động cơ dùng L298 bác nào có sơ đồ úp lên cho em xem với. Chúc mọi người vui vẻ!

Bạn có thể xem tài liệu L298 tại đây (tiếng Việt) và tự làm một cái driver với giá vài chục ngàn.
http://vagam.dieukhien.net/bibliography.php?um=a&refmode=showreference&name=DSH00001

Hoặc nếu không thích tự làm thì có thể mua tại đây dùng IC 18200 (sản phẩm do nhóm của mình sản xuất và bán, nếu bạn khó khăn tài chính thì apply chương trình Bạn và Hocdelam thì có thể mua giá rất rẻ < 3-8USD).
http://sanpham.hocdelam.org/index.php?option=com_content&view=article&id=52:hocdelam-motor-driver-3a-dcs&catid=1:hang-doc

http://sanpham.hocdelam.org/images/stories/food/motor%20driver%20hocdelam%20-%20small%20version2.jpg

xinhgai1010
15-05-2010, 08:42 PM
các bác làm xong thì share cho mọi người chiêm ngưỡng nhé !

vanmanh1988
11-06-2010, 05:04 PM
mấy bác cho em hỏi tí.tại sao khi sử dụng động cơ dc thì anh fall không đồng ý sử dụng động cơ có bộ giảm tốc.
em thấy động cơ có bọ giảm tốc thì làm tăng moment tải đầu ra rất nhiều mà.
mong các bác chi cho.

inoob
13-07-2010, 02:40 AM
Mấy cái tải sắt (như hình sau) làm thế nào (hay mua ở đâu) thế ạ?
http://i32.photobucket.com/albums/d28/picvietnam/Anh024.jpg

emilvv
14-07-2010, 07:24 PM
please send me project files to tét the DC sẻvo ..

emilvv [ @ ] gmail.com

nanshi90
13-09-2010, 11:02 PM
em chỉ biết về AT89C51 , AT89C52, 8051 chứ PIC thì chưa biết gì hết vì không được học, để tìm hiểu và đi sâu về pic thì tôi phải bắt đầu từ đâu vậy các bạn? Xin hãy giúp tôi với, tôi cảm ơn rất nhiều! Tiến Tuyên
tientuyen2010@yahoo.com

semipower
14-09-2010, 09:53 AM
Bạn đã biết AT (hoặc một dòng VDK nào đó) thì việc học PIC sẽ không gặp nhiều khó khăn. Ngay trên diễn đàn này cũng có nhiều thông tin cho bạn. Vì vậy điều đầu tiên là bạn phải tìm đúng "luồng", không post nhầm.

dangvanchanh
17-10-2010, 04:54 AM
Hiện nay, diễn đàn chúng ta đã có một số thành viên là các anh đang học và đã tốt nghiệp Tiến sĩ tham gia giúp đỡ hoạt động cộng đồng (anh Nam, anh Phong, anh Hùng, anh Lâm).

Thiết nghĩ rằng một số bài toán mang tính chất cơ bản về các lĩnh vực: Điều khiển, Robot, và công suất là những điều rất cần thiết và cơ bản. Chúng ta không chỉ nên trao đổi không thôi, mà nên có những bạn sinh viên theo làm thực tế và thực hiện những bài thí nghiệm mà chúng ta thảo luận ở đây.

Nếu làm được như vậy, chúng ta sẽ có thể có những tư liệu sống cho những công việc tiếp theo.

Một thí dụ điển hình, đó là bài toán điều khiển PID cho động cơ DC chẳng hạn. Chúng ta cứ phải nói đi nói lại mãi về bài toán này một cách rất mất thời gian. Chính vì để không mất thời gian nữa, tại sao chúng ta không cùng nhau làm một bài thực hành, trong đó các anh sẽ đứng trên quan điểm của mỗi người, hướng dẫn làm thế nào để thực hiện một bộ điều khiển PID cho động cơ DC, từ việc mô phỏng, tính toán và giảng giải.

Nhiệm vụ của các bạn sinh viên, đó là thực hành, và chụp hình lại sản phẩm của mình, công bố các thiết kế mà các bạn đã học và đã thực hiện được, làm tư liệu cho picvietnam. Điều này vô cùng quan trọng.

Còn rất nhiều bài toán dạng kinh điển như vậy.

Yêu cầu:
- Các bạn phải làm việc (yêu cầu này là số 1)
- Các bạn cần phải tự trang bị phần cứng thí nghiệm (riêng về PIC để làm, picvietnam sẽ chỗ trợ cho các bạn PIC để làm, còn lại các phần cơ khí, các bạn phải tự làm).
- Cần có đôi chút hiểu biết cơ bản về lập trình PIC, biết sơ sơ về module PWM, sơ sơ về encoder, sơ sơ về động cơ DC ... (ý F nói ở đây, đó là chúng tôi sẽ hướng dẫn các bạn đi từng ly từng tí, để đi đến một kết quả hoàn toàn đầy đủ).

Công việc phải làm:
- Mua một động cơ DC, càng to càng tốt (tuỳ theo khả năng và số tiền có thể), thực ra to thì nó đẹp, và các đặc tính, dải vận tốc có thể nhìn rõ ràng hơn, không sử dụng hộp số, nhưng phải có encoder. Encoder độ phân giải càng cao càng tốt.
- Mua một cục sắt gắn vào trục động cơ, làm thành các cục khác nhau như sau: cục trụ tròn, cục trụ vuông, cục trụ chữ nhật, và một cục méo tùm lum, gắn vào trục động cơ để làm tải.
- Thiết kế mạch điều khiển động cơ DC (làm mạch in, làm càng đẹp càng tốt, nhớ sử dụng PIC, dsPIC càng tốt nếu thích).
- Tất cả gắn trên một cái bệ, thích làm bệ gì cũng được.

Đó là công việc về phần cơ mà các bạn phải làm. Giải đáp luôn phần chi phí, các bạn làm xong, hoàn toàn có thể giữ sản phẩm của mình, vì tiền các bạn bỏ ra mua đồ. Riêng PIC, picvietnam sẽ hỗ trợ các bạn, mỗi người tham gia dự án 2 con PIC để làm việc.

Chúng tôi sẽ xem xét lại chi phí có thể, và có thể cung cấp thêm một số công cụ khác để các bạn làm việc nữa. Nhưng việc này để sau.

Trong quá trình làm, yêu cầu các bạn thường xuyên cung cấp hình ảnh, tài liệu, thiết kế, source code... tất cả, vì đây là một dự án mở.

Cuối cùng, sau khi các bạn làm xong hết mọi thứ, các bạn có thể bán lại sản phẩm cho picvietnam để picvietnam làm sản phẩm trưng bày, hoặc có thể giữ lại làm kỷ niệm tuỳ thích.

Picvietnam thực sự muốn mua lại mô hình đó, nếu các bạn làm ra và các bạn học được chút gì đó, vì sau này, cũng với mô hình đó, chúng ta còn có thể làm các bộ điều khiển khác nữa, và mô hình sẽ được picvietnam lưu giữ, điều này sẽ rất tốt.

Tiếc rằng hiện nay picvietnam quá thiếu người ... ở Vietnam :D.. nên không thể làm được các mô hình này, và vì vậy, chúng tôi cần các thành viên sinh viên tình nguyện, tham gia vào hoạt động này.

Bạn nào có nguyện vọng, đăng ký trực tiếp trên diễn đàn, chúng ta sẽ cùng thực hiện.
may dai ca cho e tham gia nua...dang tim hieu PID

blackmask
20-10-2010, 12:31 PM
Không biết mục này còn hoạt động không vậy ?

blackmask
20-10-2010, 12:41 PM
Kì này có làm cái đồ án hơi giống cái này nhưng mà điều khiển vị trí của vít me -đai ốc
Vừa mới thiết kế xong phần cơ khí.Đợi thi xong giữa kì làm tiếp phần điện với giao tiếp máy tính nữa,nhưng không biết có kịp không
Sau đây là mô hình của mình:

nguyenthang
01-11-2010, 11:01 AM
Như vậy rất hay rồi, các bạn khi viết bài, đăng ký chính thức luôn đi, hãy xác định rõ bằng câu: "mình tham gia". Bởi vì nhiều khi các bạn còn lưỡng lự, chúng ta sẽ phải mất nhiều thời gian để xác định rõ hướng.

F tính sơ sơ chi phí mà các bạn phải đầu tư để các bạn xem rõ:

Động cơ, giá khoảng 100K/cái.
Mạch chạy PIC, trên đó có bộ driver điều khiển động cơ đơn giản (giai đoạn thiết kế mạch điều khiển động cơ DC, hiển nhiên chúng ta có anh Nam đủ khả năng hướng dẫn, nhưng F muốn các bạn tự sáng tạo, hoặc tự học, anh Nam sẽ tư vấn trực tiếp trên đây, mọi thiết kế phải được công bố thì mới được tư vấn, không trả lời thư riêng nữa.) Mạch này từ 100 - 200K (2 con PIC sẽ được picvietnam cung cấp), nên có thể các bạn chỉ tốn khoảng 100K cho việc làm mạch in và mua mấy con FETs thôi.
Các bạn phải mua một bộ encoder tốt, gắn vào động cơ, có thể ở tầm khoảng 500xung/vòng (để có thể đọc lên tới 2000 xung/vòng). Loại này, hồi trước F mua giá là 70K (có kèm một cái động cơ nhỏ 502 xung/vòng), nhưng bây giờ thì không biết thế nào rồi, qua đợt robocon không biết giá có biến động gì không?
Sau nữa, các bạn ra chợ, mua mấy cục sắt cân ký, tốt nhất nên chọn mấy cục tròn và vuông sẵn có, mua như vậy thì nó rẻ. Đây là đối với những bạn muốn làm bộ thí nghiệm tương đối lớn. Các bạn sẽ tốn khoảng 100K nữa cho phần cơ và mấy thứ linh tinh.

Như vậy, các bạn sẽ tốn tổng cộng khoảng 400K để làm một bộ thí nghiệm đẹp, chất lượng cao.

Có lẽ F sẽ xem lại, chúng ta sẽ chọn 877A hoặc 16F91x để thực hành, vì đây là dòng PIC thông dụng nhất, nó sẽ là bài thí nghiệm kinh điển, vả lại, về mặt tính năng hoàn toàn oki cho thí nghiệm này, dùng vi điều khiển 8bit là quá đủ. Ai có các thiết kế đặc biệt, công bố, chất lượng mà mọi người cảm thấy đạt yêu cầu (thiết kế mạch in, mạch nguyên lý cho driver tốt), muốn làm bằng dsPIC, picvietnam cũng sẵn sàng hỗ trợ.

Đó là tất cả số tiền mà các bạn phải chi, để thực hiện phần cứng thí nghiệm.

Riêng bạn nào có ý định làm việc với picvietnam (sau khi F về nước và sang Hàn lại, sẽ mở khoá đào tạo mod lần 2, ý đồ rất rõ ràng, càng ngày càng chuyển giao diễn đàn lại cho những người trẻ hơn, có tâm huyết, xây dựng đội ngũ mod hùng hậu hơn), muốn bắt đầu làm việc với picvietnam và ở SG, đến gặp trực tiếp anh Đăng, hoặc bạn Chính. Theo F biết, cộng với cái encoder của anh Phứơc hỗ trợ, thì hiện picvietnam có 2 cái encoder độ phân giải cao, rất phù hợp cho dự án này.

(*Rất xin lỗi các bạn ở HN lần này, vì các bạn ở HN, đã có may mắn hơn ở HCM khi có bác BA mở lớp dạy PIC định kỳ, trong HCM không có, vậy thì lần làm thí nghiệm này, các bạn nhường cho các bạn HCM nhé, nhưng các bạn vẫn có thể tham gia tự làm bình thường, chỉ là không làm việc trực tiếp với nhóm PIC ở HCM thôi).

Tất nhiên, các bạn sẽ làm việc trực tiếp với Nguyễn Trung Chính (mod) để xây dựng mô hình mẫu cho picvietnam.

Chú ý, mô hình mẫu, cố gắng làm thật đẹp, thật bắt mắt.

Sau khi làm xong mô hình, picvietnam chỉ xin phép mượn các bạn mô hình để chụp hình mà thôi, và mong rằng các báo cáo thí nghiệm của các bạn, cũng có các hình ảnh thực tế. Khi đó, chúng ta sẽ tuyên bố chính thức xoá sổ bài toán điều khiển PID cho động cơ DC.

Dự án này sẽ còn được tiếp tục dài hạn, với các bộ điều khiển khác nhau, cũng chỉ cần thực hiện trên cùng một mô hình.

Tất cả những gì thảo luận, các anh ở đây sẽ thảo luận trước mặt các bạn luôn, và hoàn toàn không có thảo luận riêng. Có thể khi làm việc trong trường, các thầy của các bạn cho rằng bài toán quá dễ, không hướng dẫn kỹ lưỡng, nhưng đây là một sản phẩm của picvietnam, và các bạn cũng là những người đóng góp công sức, tiền bạc vào đó, chúng ta đã làm, thì làm tới cùng, làm cho ra hồn ra cháo luôn.

Cụ thể, phần điều khiển, có anh Phong, anh Nam, bạn ami, và F sẽ hỗ trợ, phần mô phỏng, anh Phong, anh Nam và ami, phần lập trình PIC, anh Nam, ami và F. Các anh Chung Tấn Lâm (mod, nhưng đang bận đi công tác), anh Hải Âu cũng rất thường vào với chúng ta, cũng làm về điều khiển.

Như vậy, không có lý gì chúng ta không thể làm được việc. Chỉ cần quan trọng, các bạn vững chí, và mong muốn một sản phẩm là một bộ thí nghiệm hoàn thiện, chúng ta sẽ làm, cùng nhau làm.

Chúc vui.
ý tưởng hay thiệt.

tôi đang muốn làm mạch điều khiển động cơ điện DC (dùng nguồn từ 5 - 24 VDC). sử dụng cổng song song để ghép nối, code phải gán phím T để tăng tốc, phím G giảm tốc, Phím D để đảo chiều, phím Q để dừng đông cơ.

hiện tại mình định làm mạch dùng: IC cầu H lm 298 và Pic, vậy có cần phải lắp thêm tầng công suất để cấp nguồn cho tải không?

mong các bác chỉ giáo thêm. Xin đa tạ các bác trước!

- nguyenthangcv@gmail.com.
- langtusay83@yahoo.com.vn
- DT 0986 703 229

tuyetmuavienxu
10-01-2011, 08:14 PM
Các anh kiên trì thiệt. Làm đề tài này mấy năm luôn :D

prolove101189
12-01-2011, 09:57 PM
anh ơi em ở xa lắm nhưng niềm đam mê về điện tử thì em có. các anh có thể up lên từng bước làm để giúp mọi người yêu thích ở xa cùng làm không?

hangocminh1989
31-03-2011, 11:09 AM
Chào mọi người, em hiện đã điều khiển được động cơ dùng PID, số liệu khá chính xác (sai lệch về tốc độ rất nhỏ). Tuy nhiên chỉ điều khiển được với một tải cố định thôi, khi gỡ cục tải ra thì không còn đúng nữa nên em nghĩ các thông số PID thay đổi khi tải thay đổi. Anh F cho em hỏi có cách nào tính các thông số PID theo sự thay đổi của tải không?
Đây là chương trình em đã chạy tốt với 1 tải cố định


#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 = 250;

/////////////////////////////////////////////////////////
int16 v_cur;
int16 e_sum;
int16 e_del;
int16 flag_timer1;


///////////////////////////////////////////////////////////
unsigned long kp =5;
unsigned long ki = 0.62;
unsigned long kd = 10;
////////////////////////////////////////////////////////////


int16 pw_duty;
int16 counted_round_value;
int16 temp_timer0;
int16 update_counted_round_value;

#byte TMR0 = 0x01 //timer0 REGISTER
#byte TMR1_L = 0X0E
#byte TMR1_H = 0X0F

#define START_VALUE_TIMER0 55 //tri khoi tao ban dau cua timer0 55, so xung dem duoc moi khi ngat la 255 - 55
#define START_VALUE_TIMER1 15535 //tri khoi tao ban dau cua timer1 65536-15536

#INT_TIMER0 // ngat timer0 tang bien len 1
void TIMER0_int()
{

set_timer0(START_VALUE_TIMER0);
counted_round_value++;

}

#INT_TIMER1 // ngat timer0 tang bien len 1
void timer1_int()
{

set_timer1(START_VALUE_TIMER1);


temp_timer0 = get_timer0();

if (temp_timer0 == 0){
temp_timer0 = 255;
}
v_cur = counted_round_value*400 + 2*(temp_timer0 - START_VALUE_TIMER0);
set_timer0(START_VALUE_TIMER0);
counted_round_value = 0;
//printf("%ld\t",pw_duty);
flag_timer1 = 1;
}


void init_timer0()
{

setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_2); // timer0 dung xung ngoai va chia xung vao


setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // moi lan tran timer1 la 50000*4* (1/5) uS = 40ms

set_timer0(START_VALUE_TIMER0);
set_timer1(START_VALUE_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);

while(true){
if (flag_timer1 ==1){
flag_timer1 = 0;
cal_pid();
set_pwm1_duty(pw_duty);
}
}
}

mến

bạn ơi, cái file mạch của bạn mình đọc không được, bạn xem lại được không, mình sài orcad 9.2
thanks

quocyenkcd
01-05-2011, 05:18 PM
Ai có code C lập trình cho PIC điều chế PWM cho bộ inverter để có điện áp đầu ra dạng sin tần số 50 Hz không?

Hard
23-05-2011, 09:47 AM
Ai có code C lập trình cho PIC điều chế PWM cho bộ inverter để có điện áp đầu ra dạng sin tần số 50 Hz không?

Vụ này bác qua diễn đàn điện tử tham khảo nhé, không nên post bài ở đây làm loãng chủ đề. Làm xong thì tui sẽ open source cho các bác góp ý.

Quay trở lại chủ đề, đề tài này đã có ai làm xong chưa? còn tiếp tục không vậy? Tui cũng rất muốn tham gia vụ này nhưng ở chỗ tui không thể nào kiếm được cái động cơ nào để làm thực tế cả.

songmai
11-11-2011, 02:03 PM
có bác nào từng làm hay nghiên cứu về PID vị trí không ah..........giúp em với @_@ em đang làm đồ án về nó mà chưa biết giải thuật như thê nào.........mong các bác giúp đỡ em @_@

nguoiditim21
11-06-2012, 11:56 AM
Mình cũng muốn biết về PID điều khiển cả vị trí và tốc độ.Mình đọc sơ qua (mình không biết lập trình pic) thì thấy hình như các đàn anh chỉ làm về pid tốc độ, ai đã làm thực tế rồi mong được chia sẻ kinh nghiệm. Xin cảm ơn trước.

vuductap
04-10-2012, 06:29 PM
có cái AN 00696A ở trong example của phần mềm C18 viết rất hay gần như là đầy đủ về lập trình điều khiển vị trí của động cơ có đầy đủ giải thuật từng phần rất chi tiết. Ai chịu khó tìm hiểu cái này có ích lắm đó.

toancdt
11-03-2015, 02:35 PM
Cho e hỏi động cơ dc servo hitachi 38v 53w của a tinh thần thép mua bao nhiêu tiền vậy, dây cấp nguồn và tín hiệu của encorder là dây nào, nguồn encorder bao nhiêu vol.