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 14-05-2007, 11:28 AM   #361
bluepine
Đệ tử 3 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 53
:
tôi đã sửa một số chỗ sai trong đoạn code của bạn rồi, xem lại đi nhe

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 = 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,
File Kèm Theo
File Type: rar PID.rar (45.5 KB, 597 lần tải)

thay đổi nội dung bởi: namqn, 14-05-2007 lúc 07:23 PM.
bluepine vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-05-2007, 03:07 AM   #362
gaumisa
Nhập môn đệ tử
 
Tham gia ngày: May 2007
Bài gửi: 10
:
Help Me !

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 :

Code:
#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 !

thay đổi nội dung bởi: falleaf, 16-05-2007 lúc 05:12 PM.
gaumisa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-05-2007, 11:48 AM   #363
gaumisa
Nhập môn đệ tử
 
Tham gia ngày: May 2007
Bài gửi: 10
:
code chuong trinh VB cua minh ne !

va day la code vb cua minh :

Code:
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

thay đổi nội dung bởi: falleaf, 16-05-2007 lúc 05:13 PM.
gaumisa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-05-2007, 06:43 PM   #364
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
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
File Kèm Theo
File Type: pdf matlab_simulink_dc_motor.pdf (91.5 KB, 1424 lần tải)

thay đổi nội dung bởi: falleaf, 23-05-2007 lúc 02:26 AM.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-05-2007, 12:51 PM   #365
VJC1
Nhập môn đệ tử
 
Tham gia ngày: Nov 2006
Bài gửi: 1
:
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.
VJC1 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-05-2007, 01:29 PM   #366
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
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

thay đổi nội dung bởi: falleaf, 23-05-2007 lúc 02:23 AM.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-05-2007, 02:50 PM   #367
gaumisa
Nhập môn đệ tử
 
Tham gia ngày: May 2007
Bài gửi: 10
:
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
gaumisa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-05-2007, 05:15 PM   #368
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
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

thay đổi nội dung bởi: falleaf, 23-05-2007 lúc 02:23 AM.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-05-2007, 05:38 PM   #369
tda
Đệ tử 3 túi
 
Tham gia ngày: Jul 2005
Bài gửi: 51
:
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
tda vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-07-2007, 07:53 PM   #370
bk_future
Đệ tử 2 túi
 
bk_future's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 38
:
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 ?
bk_future vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-07-2007, 08:19 PM   #371
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi bk_future View Post
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-07-2007, 12:40 PM   #372
Sangcao
Đệ tử 1 túi
 
Tham gia ngày: May 2006
Bài gửi: 25
:
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ơ.
Sangcao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-07-2007, 03:28 PM   #373
bk_future
Đệ tử 2 túi
 
bk_future's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 38
:
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 .
bk_future vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-07-2007, 04:45 PM   #374
huybo02
Đệ tử 4 túi
 
Tham gia ngày: Aug 2006
Bài gửi: 61
:
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.
huybo02 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-07-2007, 06:04 PM   #375
Sangcao
Đệ tử 1 túi
 
Tham gia ngày: May 2006
Bài gửi: 25
:
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!
Sangcao 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à 09:04 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