PIC Vietnam

Go Back   PIC Vietnam > Robotics > Thực hành

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 24-03-2007, 01:10 PM   #1
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
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.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-03-2007, 09:27 AM   #2
bluepine
Đệ 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,
bluepine vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-03-2007, 04:28 PM   #3
tda
Đệ 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.
tda vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2007, 02:11 AM   #4
omlun
Đệ 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à
omlun vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2007, 02:16 AM   #5
omlun
Đệ 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
omlun vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2007, 04:18 PM   #6
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
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
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-03-2007, 12:41 PM   #7
trungkien_0914373773
Đệ 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?
trungkien_0914373773 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-03-2007, 12:43 PM   #8
trungkien_0914373773
Đệ tử 1 túi
 
Tham gia ngày: Sep 2006
Bài gửi: 15
:
dong co DC

mach nguyen ly
File Kèm Theo
File Type: pdf mach dieu khien toc do dong co DC.pdf (10.5 KB, 743 lần tải)
trungkien_0914373773 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-04-2007, 02:26 PM   #9
linhnc308
Đệ 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
linhnc308 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-04-2007, 09:25 AM   #10
bluepine
Đệ tử 3 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 53
:
Trích:
Nguyên văn bởi linhnc308 View Post
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ử.
bluepine vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-04-2007, 05:29 PM   #11
omlun
Đệ 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!!
omlun vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-04-2007, 08:26 PM   #12
nguyenphuocviet
Nhập môn đệ tử
 
Tham gia ngày: Oct 2005
Bài gửi: 3
:
Send a message via Yahoo to nguyenphuocviet
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 .
nguyenphuocviet vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-04-2007, 09:57 PM   #13
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Đọ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
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-04-2007, 10:23 PM   #14
omlun
Đệ 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
omlun vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-05-2007, 06:07 PM   #15
omlun
Đệ 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.
omlun vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 06:53 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam