![]() |
|
Tài trợ cho PIC Vietnam |
Thực hành Bắt đầu làm một robot như thế nào? Mẹo vặt? Kỹ thuật? Công nghệ?... Hãy bắt tay vào việc... |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
PIC Bang chủ
|
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.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#2 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 53
: |
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, |
![]() |
![]() |
![]() |
#3 |
Đệ tử 3 túi
Tham gia ngày: Jul 2005
Bài gửi: 51
: |
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.
|
![]() |
![]() |
![]() |
#4 |
Đệ tử 1 túi
Tham gia ngày: Mar 2007
Bài gửi: 25
: |
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à |
![]() |
![]() |
![]() |
#5 |
Đệ tử 1 túi
Tham gia ngày: Mar 2007
Bài gửi: 25
: |
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 |
![]() |
![]() |
![]() |
#6 |
PIC Bang chủ
|
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
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#7 |
Đệ tử 1 túi
Tham gia ngày: Sep 2006
Bài gửi: 15
: |
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?
|
![]() |
![]() |
![]() |
#8 |
Đệ tử 1 túi
Tham gia ngày: Sep 2006
Bài gửi: 15
: |
dong co DC
mach nguyen ly
|
![]() |
![]() |
![]() |
#9 |
Đệ tử 5 túi
Tham gia ngày: Oct 2005
Bài gửi: 117
: |
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.
__________________
CallerID, Ethernet-RS232, PICWEB, Cảnh báo BTS Giải pháp toàn diện giám sát - điều khiển từ xa qua GSM/Internet 0988006696 http://linhnc308.blogspot.com linhnc308@gmail.com |
![]() |
![]() |
![]() |
#10 | |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 53
: |
Trích:
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ử. |
|
![]() |
![]() |
![]() |
#11 |
Đệ tử 1 túi
Tham gia ngày: Mar 2007
Bài gửi: 25
: |
cảm ơn bạn nhiều!!vì tớ đang làm đồ án về đề tài này!!
|
![]() |
![]() |
![]() |
#12 |
Nhập môn đệ tử
|
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 .
|
![]() |
![]() |
![]() |
#13 |
PIC Bang chủ
|
Đọ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
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#14 |
Đệ tử 1 túi
Tham gia ngày: Mar 2007
Bài gửi: 25
: |
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
|
![]() |
![]() |
![]() |
#15 |
Đệ tử 1 túi
Tham gia ngày: Mar 2007
Bài gửi: 25
: |
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 đỡ Code:
#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); } } } thay đổi nội dung bởi: namqn, 12-05-2007 lúc 06:50 PM. |
![]() |
![]() |
![]() |
|
|