![]() |
Trích:
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, |
anh trả lời rất thuyết phục. cảm ơn anh nhiều.
mến |
1 Attachment(s)
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 |
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 |
cho em hỏi về tốc độ động cơ
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 |
Trích:
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, |
1 Attachment(s)
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 |
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 |
minh thay y tuong nhu the la rat hay , nhung minh cung ban khoan ve tuong lai cua y tuong nay ?
|
Đọ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) |
Trích:
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 |
Trích:
mến |
1 Attachment(s)
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, |
picvietnam.c
Code:
#include <16F877A.h> |
Code:
#include <16F877A.h> 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 |
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. |
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. |
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) |
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 |
Trích:
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 |
tôi mới tìm hiểu về pic và thấy ý kiến hay đấy .
|
Hỏi về interrupt on change
Trích:
|
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ì. |
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. |
Trích:
mến |
hỏi về hàm truyền động cơ DC
1 Attachment(s)
chào mọi người, khi tham khảo địa chỉ http://www.library.cmu.edu/ctms/ctms...or/digital.htm
em thấy hàm truyền động cơ DC có dạng 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 |
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, |
Trích:
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. |
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.
|
Trích:
|
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)
|
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. |
1 Attachment(s)
Đây là sơ đồ bộ điều khiển:
http://i72.photobucket.com/albums/i1.../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 |
Mạch điều khiển 6 motor đồng thời + current sensing
1 Attachment(s)
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.
|
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 |
báo cáo sơ bộ công việc
1 Attachment(s)
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ơ: 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é. |
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. |
Mô phỏng Matlab
2 Attachment(s)
Đâ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 |
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 |
Trích:
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. |
Múi giờ GMT. Hiện tại là 06:52 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam