PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

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

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 23-02-2011, 06:11 PM   #1
ElecTel
Đệ tử 2 túi
 
Tham gia ngày: Jan 2011
Bài gửi: 36
:
[help]ứng dụng PID ???

Chào các bạn !các bạn có thể xem giùm mình đoạn code này đã tối ưu chưa,mong sự giúp đở của mọi người!!!!!!
Đây là đoạn code sử dụng PID trong dò line

tại vì mình rất rất yếu về lập trình nên ko tự tin lắm khi tự mình viết code

mình sử dụng ngắt để tạo khoảng thời gian lấy mẩu
Code:
 #int_timer0
void interrupt_timer0()
   {

      set_timer0(5);
      ++dem;
      if(dem==3000)
         {
            dem=0;
         };}
Code:
 void main()
      {      
         signed int setpoint=0,previous_error=0,error,control,read;
         float output,derivative,integral=0;
         enable_interrupts(int_timer0);
         setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);
         enable_interrupts(INT_RTCC);
         set_timer0(5);
         while(1)
         {
         if
         (check_cross_line()==1)
            {speed(70,70);
            n++;}                              //nếu gặp vạch ngang thì tăng biến n
         else
            {
            while(dem==3000)              //dem 3000 tương ứng với 1 khoảng dt
               {                                   //thực hiện việc lấy mẫu và tính toán Output
                  switch(sensor)
                     {  
                        case 0b11111111  :  read=0;    break;
                        case 0b00011000  :  read=0;    break;
                        case 0b00010000  :  read=-1;   break;
                        case 0b00110000  :  read=-2;   break;//lech trai;
                        case 0b00100000  :  read=-3;   break;
                        case 0b01100000  :  read=-4;   break;   //lech phai
                        case 0b01000000  :  read=-5;   break;
                        case 0b11000000  :  read=-6;   break;
                        case 0b10000000  :  read=-7;   break;
                        case 0b00001000  :  read=1;    break;
                        case 0b00001100  :  read=2;    break;//lech phai
                        case 0b00000100  :  read=3;    break;
                        case 0b00000110  :  read=4;    break;
                        case 0b00000010  :  read=5;    break;
                        case 0b00000011  :  read=6;    break;
                        case 0b00000001  :  read=7;    break; 
                        case 0b00000000  :  { if(n<=4) speed(100,40);if(n>4) speed(100,10);};break; //chổ này mình viết mình cũng cảm thấy khó hiểu ý tưởng của mình là khi không có vạch tương ứng với giá trj n mà làm...???!
                     }
                 error = setpoint - read;
                 integral = integral + (error*dem);
                 derivative = (error - previous_error)/dem;
                 output = (K*error) + (i*integral) + (d*derivative);
                 previous_error = error;
                 control=(signed int)(output);
                 if(control>max)
                  control=max;
                 if(control<-max) 
                  control=-max;
                 }
                 if(control>0)
                  speed(max-control,max);
                 else
                  speed(max,max+control);}     
    
         }}

thay đổi nội dung bởi: ElecTel, 26-02-2011 lúc 07:49 AM.
ElecTel vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


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:29 PM.


Đượ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