1. THÔNG BÁO TUYỂN ADMIN DIỄN ĐÀN 2013
    Tìm kiếm nhà trọ - Ở ghép
    THÔNG BÁO BÁN ÁO SPKT.NET CHO THÀNH VIÊN DIỄN ĐÀN


    HÃY TÌM KIẾM Ở ĐÂY TRƯỚC KHI ĐẶT CÂU HỎI
    {xen:phrase loading}

Bộ điều khiển PID cho động cơ DC

Thảo luận trong 'Servo-Robot-T.Lực-Khí nén' bắt đầu bởi bmnhy, 15 Tháng bảy 2007.

  1. bmnhy Giảng Viên

    Số bài viết: 914
    Đã được thích: 0
    Điểm thành tích: 0
    Hiện tại, VAGAM đang tìm thêm 1 người thực hành thí nghiệm bộ điều khiển PID cho động cơ DC trên Vi điều khiển AVR hoặc PIC.

    Yêu cầu
    - Giỏi lập trình C
    - Giỏi vi điều khiển
    - Yêu thích điều khiển tự động, cơ điện tử.


    Xin liên hệ trực tiếp Liên hệ tại đây
  2. hoangleanh87 New Member

    Số bài viết: 244
    Đã được thích: 5
    Điểm thành tích: 0
    Mình đã Post bài báo cáo này theo yêu cầu của khoahoctre trong Topic Báo cáo giửa kỳ VĐK bên CLB Khoa Học Trẻ
    Hôm wa lên Google search với từ khóa "Bo dieu khien PID cho dong co DC dung AVR" nó ra cái Topic này của anh Hải mà ko ra mấy cái bài mình Post bên CLBKHT ,mình quyết định ké anh Hải luôn.
    http://www.google.com.vn/search?hl=vi&...A%BFm&meta=

    2.1 -Họ tên sinh viên: Lê Hoàng Anh

    -Email: hoangleanh87@yahoo.com.vn
    -Numer Phone : 0909319477

    2.2 -Tên đề tài thực hiện:Nghiên cứu và ứng dụng vi điều khiển AVR điều khiển tốc độ động cơ DC dùng thuật toán PID.

    -Mô tả vấn tắt các yêu cầu cần giải quyết:

    Xây dựng thuật toán điều khiển PID trên nền vi điều khiển AVR.
    Xây dựng chương trình trên PC điều khiển, khảo sát, đánh giá chất lượng điều khiển của hệ thống.
    2.3 -Các phương án có thể lựa chọn, ưu điểm của từng phương án.
    -Thuật toán điều khiển PID trên nền vi điều khiển AVR có thể viết bằng Bascom-AVR hoặc Codevision-AVR
    -Chương trình trên PC điều khiển, khảo sát, đánh giá chất lượng điều khiển của hệ thống
    có thể viết bằng VB-VC-6.0 hoặc Visual studio 2005 (Visual Basic - Visual C++2005)…

    -Phương án lựa chọn giải quyết trong đề tài.

    -Thuật toán điều khiển PID trên nền vi điều khiển AVR viết bằng Codevision-AVR
    -Chương trình trên PC điều khiển, khảo sát, đánh giá chất lượng điều khiển của hệ thống
    viết Visual C++2005.
    Ưu điểm: C là ngôn ngữ rất có hiệu quả,
    C là một ngôn ngữ lập trình tương đối nhỏ gọn vận hành gần với phần cứng và nó giống với ngôn ngữ Assembler hơn hầu hết các ngôn ngữ bậc cao. Hơn thế, C đôi khi được đánh giá như là "có khả năng di động", cho thấy sự khác nhau quan trọng giữa nó với ngôn ngữ bậc thấp như là Assembler, đó là việc mã C có thể được dịch và thi hành trong hầu hết các máy tính, hơn hẳn các ngôn ngữ hiện tại trong khi đó thì Assembler chỉ có thể chạy trong một số máy tính đặc biệt. Vì lý do này C được xem là ngôn ngữ bậc trung. C đã được tạo ra với một mục tiêu là làm cho nó thuận tiện để viết các chương trình lớn với số lỗi ít hơn.
    2.4 -Sơ đồ mạch nguyên lý và layout.
    Nguồn cung cấp-Nguồn xung chuẩn.
    Mainboard:
    [IMG]
    [IMG]

    Mạch cầu hắc:
    [IMG]
    [IMG]
  3. hoangleanh87 New Member

    Số bài viết: 244
    Đã được thích: 5
    Điểm thành tích: 0
    Mã:
    
    [B]Code chương trình AVR dạng text.[/B]
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V1.24.8d Professional
    Automatic Program Generator
    © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
    [URL="http://spktforum.info/redirector.php?url=http%3A%2F%2Fwww.hpinfotech.com"]http://www.hpinfotech.com[/URL]
    
    Project : 
    Version : 
    Date    : 12/4/2008
    Author  : F4CG                            
    Company : F4CG                            
    Comments: 
    
    
    Chip type           : ATmega32
    Program type        : Application
    Clock frequency     : 16.000000 MHz
    Memory model        : Small
    External SRAM size  : 0
    Data Stack size     : 512
    
    PWM 9bit OCR1A
    Counter0 co ngat dem so > 255
    Timer2 ngat o che do so sanh tao chu ky lay mau 12ms
    ******************************************************/
    #include <mega32.h>
    #include <string.h> 
    #include <delay.h>
    #include<stdlib.h> 
    
    /*****************************************************/
    
    #define pwm  OCR1A
    #define dir1 PORTD.6
    
    /*****************************************************/
    // Declare your global variables here
    //unsigned int pv,sp; 
    char string_cur_vel[10];
    char in_str[10]; 
    unsigned char time,count;
    char current_char;    //ki tu vua nhan
    char in_count;        //so ki tu hien tai
    //char tempp[10],tempi[10],tempd[10],str_vset[10];
    float kp,ki,kd,err,elast,sum_err,eht,d_err,cv,sp;
    int pwm1,pv;
    //char tempp[10],tempi[10],tempd[10],str_vset[10];
    bit ok,ngat=0,run=0;
    
    /*****************************************************/
    
    //Functions initialization 
    void start_counter0();
    void stop_counter0();
    void reset_counter0();
    void show_cur_vel();
    void start_timer2();
    void reset_timer2();
    void stop_timer2();
    void pid();   
    void getstr();
    //void null_in_str();
    //void start_pwm();
    //void stop_pwm();
    
    /*****************************************************/
    
    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7
    
    #define FRAMING_ERROR (1<<fe)>
    #define PARITY_ERROR (1<<upe)>
    #define DATA_OVERRUN (1<<ovr)>
    #define DATA_REGISTER_EMPTY (1<<udre)>
    #define RX_COMPLETE (1<<rxc)>
    
    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];
    
    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif
    
    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;
    
    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    stop_timer2();
    run=0;
    ngat=1;
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
       {
       rx_buffer[rx_wr_index]=data;
       if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
       if (++rx_counter == RX_BUFFER_SIZE)
          {
          rx_counter=0;
          rx_buffer_overflow=1;
          };
       };
    //run=1;
    }
    
    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli")
    --rx_counter;
    #asm("sei")
    return data;
    }
    #pragma used-
    #endif
    
    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 8
    char tx_buffer[TX_BUFFER_SIZE];
    
    #if TX_BUFFER_SIZE<256
    unsigned char tx_wr_index,tx_rd_index,tx_counter;
    #else
    unsigned int tx_wr_index,tx_rd_index,tx_counter;
    #endif
    
    // USART Transmitter interrupt service routine
    interrupt [USART_TXC] void usart_tx_isr(void)
    {
    if (tx_counter)
       {
       --tx_counter;
       UDR=tx_buffer[tx_rd_index];
       if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
       };
    }
    
    #ifndef _DEBUG_TERMINAL_IO_
    // Write a character to the USART Transmitter buffer
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while (tx_counter == TX_BUFFER_SIZE);
    #asm("cli")
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
       {
       tx_buffer[tx_wr_index]=c;
       if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
       ++tx_counter;
       }
    else
       UDR=c;
    #asm("sei")
    }
    #pragma used-
    #endif
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
            count++;
    }
    
    // Timer 2 output compare interrupt service routine
    interrupt [TIM2_COMP] void timer2_comp_isr(void)
    {       
            
            stop_timer2();
            reset_timer2();
            start_timer2();
            //time++;
            pv=count*256;
            pv=pv+TCNT0;
            //pv=200;
            reset_counter0();
            count=0;
            pid();
            if(ok==1)
            {
                    time++;
                    ok=0;
                    if(time==13)
                    {        
                            show_cur_vel();
                            puts(string_cur_vel);        
                            time=0;
                    }
            }
            
            if(run==0)
            {
                    pwm=511;
                    stop_timer2();
                    stop_counter0();
            }
            start_timer2();
    
    
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here   
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTA=0x00;
    DDRA=0xFF;
    
    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=T State0=T 
    PORTB=0x00;
    DDRB=0xFC;
    
    // Port C initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTC=0x00;
    DDRC=0xFF;
    
    // Port D initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=In 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=P 
    PORTD=0x01;
    DDRD=0xFE;
    
    // Timer/Counter 0 initialization
    // Clock source: T0 pin Rising Edge
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 16000.000 kHz
    // Mode: Ph. correct PWM top=01FFh
    // OC1A output: Non-Inv.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x82;
    TCCR1B=0x01;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0xFF;
    OCR1AL=0xFF;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 15.625 kHz
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=188;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x81;
    
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud rate: 19200
    UCSRA=0x00;
    UCSRB=0xD8;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
          { 
            if(ngat==1)
            {
            getstr();               //nhan gia tri tu PC
            ngat=0;
            }
          };
    }
    
    /******************************************/
    
    void show_cur_vel()                        //chuyen gia tri encoder sang char rui gui len PC
    {            
            ftoa(pv,0,string_cur_vel);
    }  
    
    /******************************************/
    
    void start_counter0()
    {
            TCCR0=0x07;
    }
    
    /******************************************/
    
    void stop_counter0()
    {
            TCCR0=0x00;
    }
    
    /******************************************/     
    
    void reset_counter0()
    {
            TCNT0=0;
    } 
    
    /******************************************/ 
    
    void reset_timer2()
    {
            TCNT2=0x00;;
    } 
    
    /******************************************/
    
    void start_timer2()
    { 
            TCCR2=0x07;
    }
    
    /******************************************/
    
    void stop_timer2()
    {
            TCCR2=0x00;
    }
    
    /******************************************/
    
    void pid()
    {    
            
         err=sp-pv;                 // err = sp - pv;(err = setpoint - process variable)
         eht = err + elast;         // eht = err + elast;   
         sum_err+=eht;              // tinh tong sai so theo cong thuc hinh thang
         d_err=err-elast;           // vi phan sai so = sai so hien tai - sai so truoc do
         cv=((kp*err)+(ki*sum_err)+(kd*d_err));    // Cong thuc tinh toan PID
         cv=cv/1000;                // Cho nay / 1000 vi tren giao dien ki,kp,kd da * 1000 
                                    // VD: ki=0.01*1000=10 gui xuong VDK - tranh gui dau "."
         if(cv>511)                 //gioi han PWM 9Bit
         {
            cv=511;
         }   
         if(cv<0)
         {
            cv=0;                   // chay maximum
         }
         pwm1=(int)cv;              // ep kieu sang so nguyen
         pwm=511-pwm1;              // xuat pwm(OCR1A)
         //PORTA.4=0; 
         elast=err;                 // sai so hien tai se tro thanh sai so truoc no khi co sai so moi
         ok=1;                      // bit danh dau da xuat dc pwm
    
     
    }
    
    /*******************Received String proccess***********************/
    // Cho nay minh gap truc trac nhieu nhat va ton nhieu time. 
    // Ban nao co cach truyen hay hon chi minh voi
    
     void getstr()
    {
            in_count=0;
            while((current_char=getchar()) != '\r')       //return first line
            {
                    if(current_char==0x08)  //backspace
                    {
                           --in_count;
                    }
                    else
                    {
                           switch(current_char)
                           {
                                    case'p':                        //nap kp
                                            in_count=0;
                                            kp=atof(in_str); 
                                            //PORTA.0=1;            // test
                                            //kp=kp+1;              // test kp gui len giao dien dung khong                          
                                            //ftoa(kp,0,tempp);     // vd tren giao dien gui kp=100
                                            //puts(tempp);          // puts len fai la 101 thi OK
                                            //run=1;                // tuong tu cho ki,kd,vset   
                                            break;                  // test OK rui bo di.
                                    case'i':                        //nap ki
                                            in_count=0;
                                            ki=atof(in_str);
                                            //PORTA.1=1;
                                            //ki=ki+2;
                                            //ftoa(ki,0,tempi);
                                            //puts(tempi);
                                            //run=1;
                                            break;
                                    case'd':                    //nap kd
                                            in_count=0;
                                            kd=atof(in_str);
                                            //PORTA.2=1;
                                            //kd=kd+3;
                                            //ftoa(kd,0,tempd);
                                            //puts(tempd);
                                            //run=1;
                                            break;
                                    case'a':                    // nap vset
                                            //stop_timer2();
                                            //run=0;
                                            //pwm1=0;
                                            //time=0;
                                            //err=0;
                                            //elast=0;
                                            //sum_err=0;
                                            //d_err=0;
                                            //////////////
                                            in_count=0;
                                            sp=atof(in_str); 
                                            //PORTA.3=1; 
                                            //sp=sp+4;
                                            //ftoa(sp,0,str_vset);                    
                                            //puts(str_vset);
                                            //reset_timer2();
                                            //PORTC.4=1;
                                            //run=1;
                                            break;
                                    case'r':                                         
                                            reset_timer2();                                         
                                            run=1;             // nut run da dc nhan                                                        
                                            break;
                                    case's':
                                            stop_timer2();
                                            reset_timer2();
                                            run=0;             //  nut stop da dc nhan 
                                            pwm=511;           //  ngung cap pwm cho dong co 
                                            time=0;            //  reset cac gia tri tinh toan trong bo PID
                                            err=0;             //  err = sp - pv;(err = setpoint - process variable)
                                            eht=0;             //  eht = err + elast; sum_err+=eht;  tinh tong sai lech theo cong thuc hinh thang
                                            elast=0;
                                            sum_err=0;
                                            d_err=0;                                        
                                            break;
                                    case't':                   // dao chieu
                                            dir1=0;            // luc dau nhan Run dir = 1                             
                                            run=1;             // Check vao direction tren giao dien gui xuong char 't' dir = 0
                                            break;        
                                    default:                   // neu char ko la 'p' 'i' 'd' 'r' 's' 't' 'a' thi thuc hien cho nay
                                            in_str[in_count++]=current_char;     // gan cac char vao mang char 
                           }                                                     // neu bat duoc char la 'p' 'i' 'd' 'a' 'r' 's' 't'  thi chuyen mang char do thanh so float
                                                                                 // rui gan vao kp,ki,kd,vset,run,stop,dir.
                                                                                
                           if(run==1)    // Run dong co
                           {
                                    start_timer2();
                                    reset_counter0();
                                    start_counter0();
                           } 
                           
                           
                    }
                    
            }
            
    }
    /******************************************/
    
    /*void null_in_str()
    {
                    for(i=0;i<=in_count;i++)
                    {
                    in_str[i] ='';
                    }
    }*/
    
    /******************************************/
    
    /*void start_pwm()
    { 
            TCCR1A=0xC2;
            TCCR1B=0x01;
    }*/
    /*void stop_pwm()
    { 
            TCCR1A=0x00;
            TCCR1B=0x00;
    }*/[/b]</stdio.h></rxc)></udre)></ovr)></upe)></fe)></stdlib.h></delay.h></string.h></mega32.h>
  4. hoangleanh87 New Member

    Số bài viết: 244
    Đã được thích: 5
    Điểm thành tích: 0
    Mã:
    [B]Code chương trình giao diện dạng text.[/B]
    #pragma once
    
    
    namespace PIDHA {
    
        using namespace System;
        using namespace System::ComponentModel;
        using namespace System::Collections;
        using namespace System::Windows::Forms;
        using namespace System::Data;
        using namespace System::Drawing;
    
        /// <summary>
        /// Summary for Form1
        ///
        /// WARNING: If you change the name of this class, you will need to change the
        ///          'Resource File Name' property for the managed resource compiler tool
        ///          associated with all .resx files this class depends on.  Otherwise,
        ///          the designers will not be able to interact properly with localized
        ///          resources associated with this form.
        /// </summary>
        public ref class Form1 : public System::Windows::Forms::Form
        {
        public:
            
            Form1(void)
            {
                InitializeComponent();
                /*txtkp->Text="0.1";
                txtki->Text="0.1";
                txtkd->Text="0.1";
                txtcur->Text="0";*/
                
                
                
                //
                //TODO: Add the constructor code here
                //
            }
    
        protected:
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            ~Form1()
            {
                if (components)
                {
                    delete components;
                }
            }
        private: AxTeeChart::AxTChart^  tChart1;
        protected: 
    
        protected: 
    
        private: System::Windows::Forms::GroupBox^  groupBox1;
        private: System::Windows::Forms::GroupBox^  groupBox2;
        private: System::Windows::Forms::GroupBox^  groupBox3;
        private: System::Windows::Forms::GroupBox^  groupBox4;
        private: System::Windows::Forms::Button^  btnexi;
    
        private: System::Windows::Forms::Button^  btnref;
    
        private: System::Windows::Forms::Button^  btncon;
        private: System::Windows::Forms::Button^  btnrun;
    
    
    
    
    
    
    
    
    
    
        private: System::Windows::Forms::Label^  label3;
        private: System::Windows::Forms::Label^  label2;
        private: System::Windows::Forms::Label^  label1;
        private: System::Windows::Forms::TextBox^  txtcur;
    
    
        private: System::Windows::Forms::NumericUpDown^  num1;
        private: System::Windows::Forms::Button^  btnapp;
    
    
        private: System::Windows::Forms::ComboBox^  cb1;
    
    
        private: System::Windows::Forms::CheckBox^  check1;
    
        private: System::Windows::Forms::Label^  label5;
        private: System::Windows::Forms::Label^  label4;
        private: System::Windows::Forms::Button^  btnato;
    
    
        private: System::Windows::Forms::Button^  btnabo;
    
        private: System::IO::Ports::SerialPort^  sp1;
        private: System::Windows::Forms::Timer^  tm1;
        private: System::ComponentModel::IContainer^  components;
        private: System::Windows::Forms::Label^  label7;
    
    
    
    
        protected: 
    
        private:
            /// <summary>
            /// Required designer variable.
            /// </summary>
            int time;
            int timet;
            int time1;
            int time2;
            int dir1;
            double kp,ki,kd;
            String^velre;
            double veloc;
            String^str_vset;
            String^string_vset;
            unsigned int sp,vset;
            bool run;
            
            
        private: System::Windows::Forms::Label^  label8;
        private: System::Windows::Forms::Label^  label9;
    
        private: System::Windows::Forms::MaskedTextBox^  mtbkd;
    
        private: System::Windows::Forms::MaskedTextBox^  mtbki;
    private: System::Windows::Forms::MaskedTextBox^  mtbkp;
    private: System::Windows::Forms::Label^  label6;
    private: System::Windows::Forms::Button^  btnkp;
    private: System::Windows::Forms::Button^  btnkd;
    private: System::Windows::Forms::Button^  btnki;
    
    
    
    
    
        private: System::Windows::Forms::Timer^  tm2;
                 
            
    
    
    #pragma region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            void InitializeComponent(void)
            {
                this->components = (gcnew System::ComponentModel::Container());
                System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
                this->tChart1 = (gcnew AxTeeChart::AxTChart());
                this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
                this->cb1 = (gcnew System::Windows::Forms::ComboBox());
                this->label9 = (gcnew System::Windows::Forms::Label());
                this->label6 = (gcnew System::Windows::Forms::Label());
                this->groupBox2 = (gcnew System::Windows::Forms::GroupBox());
                this->btnkd = (gcnew System::Windows::Forms::Button());
                this->btnki = (gcnew System::Windows::Forms::Button());
                this->btnkp = (gcnew System::Windows::Forms::Button());
                this->mtbkd = (gcnew System::Windows::Forms::MaskedTextBox());
                this->mtbki = (gcnew System::Windows::Forms::MaskedTextBox());
                this->mtbkp = (gcnew System::Windows::Forms::MaskedTextBox());
                this->label3 = (gcnew System::Windows::Forms::Label());
                this->label2 = (gcnew System::Windows::Forms::Label());
                this->label1 = (gcnew System::Windows::Forms::Label());
                this->groupBox3 = (gcnew System::Windows::Forms::GroupBox());
                this->check1 = (gcnew System::Windows::Forms::CheckBox());
                this->txtcur = (gcnew System::Windows::Forms::TextBox());
                this->num1 = (gcnew System::Windows::Forms::NumericUpDown());
                this->label5 = (gcnew System::Windows::Forms::Label());
                this->label4 = (gcnew System::Windows::Forms::Label());
                this->btnapp = (gcnew System::Windows::Forms::Button());
                this->groupBox4 = (gcnew System::Windows::Forms::GroupBox());
                this->btnexi = (gcnew System::Windows::Forms::Button());
                this->btnref = (gcnew System::Windows::Forms::Button());
                this->btnabo = (gcnew System::Windows::Forms::Button());
                this->btnato = (gcnew System::Windows::Forms::Button());
                this->btncon = (gcnew System::Windows::Forms::Button());
                this->btnrun = (gcnew System::Windows::Forms::Button());
                this->sp1 = (gcnew System::IO::Ports::SerialPort(this->components));
                this->tm1 = (gcnew System::Windows::Forms::Timer(this->components));
                this->label7 = (gcnew System::Windows::Forms::Label());
                this->label8 = (gcnew System::Windows::Forms::Label());
                this->tm2 = (gcnew System::Windows::Forms::Timer(this->components));
                (cli::safe_cast<system::componentmodel::isupportinitialize^>(this->tChart1))->BeginInit();
                this->groupBox1->SuspendLayout();
                this->groupBox2->SuspendLayout();
                this->groupBox3->SuspendLayout();
                (cli::safe_cast<system::componentmodel::isupportinitialize^>(this->num1))->BeginInit();
                this->groupBox4->SuspendLayout();
                this->SuspendLayout();
                // 
                // tChart1
                // 
                this->tChart1->Enabled = true;
                this->tChart1->Location = System::Drawing::Point(1, 17);
                this->tChart1->Name = L"tChart1";
                this->tChart1->OcxState = (cli::safe_cast<system::windows::forms::axhost::state^>(resources->GetObject(L"tChart1.OcxState")));
                this->tChart1->Size = System::Drawing::Size(722, 574);
                this->tChart1->TabIndex = 0;
                // 
                // groupBox1
                // 
                this->groupBox1->BackColor = System::Drawing::Color::DarkBlue;
                this->groupBox1->BackgroundImage = (cli::safe_cast<system::drawing::image^>(resources->GetObject(L"groupBox1.BackgroundImage")));
                this->groupBox1->Controls->Add(this->cb1);
                this->groupBox1->Controls->Add(this->label9);
                this->groupBox1->Controls->Add(this->label6);
                this->groupBox1->ForeColor = System::Drawing::Color::Yellow;
                this->groupBox1->Location = System::Drawing::Point(52, 42);
                this->groupBox1->Name = L"groupBox1";
                this->groupBox1->Size = System::Drawing::Size(115, 131);
                this->groupBox1->TabIndex = 1;
                this->groupBox1->TabStop = false;
                this->groupBox1->Text = L"Connection";
                // 
                // cb1
                // 
                this->cb1->BackColor = System::Drawing::Color::White;
                this->cb1->ForeColor = System::Drawing::Color::Maroon;
                this->cb1->FormattingEnabled = true;
                this->cb1->Items->AddRange(gcnew cli::array< System::Object^  >(5) {L"COM1", L"COM2", L"COM3", L"COM4", L"COM5"});
                this->cb1->Location = System::Drawing::Point(37, 34);
                this->cb1->Name = L"cb1";
                this->cb1->Size = System::Drawing::Size(68, 21);
                this->cb1->TabIndex = 0;
                this->cb1->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::cb1_SelectedIndexChanged);
                // 
                // label9
                // 
                this->label9->AutoSize = true;
                this->label9->BackColor = System::Drawing::Color::Transparent;
                this->label9->Location = System::Drawing::Point(6, 37);
                this->label9->Name = L"label9";
                this->label9->Size = System::Drawing::Size(31, 13);
                this->label9->TabIndex = 2;
                this->label9->Text = L"COM";
                // 
                // label6
                // 
                this->label6->BackColor = System::Drawing::Color::Transparent;
                this->label6->Font = (gcnew System::Drawing::Font(L"Times New Roman", 15, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                    static_cast<system::byte>(0)));
                this->label6->Location = System::Drawing::Point(16, 59);
                this->label6->Name = L"label6";
                this->label6->Size = System::Drawing::Size(99, 63);
                this->label6->TabIndex = 2;
                this->label6->Text = L"Baud Rate\r\n 19200\r\n(default)";
                this->label6->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
                // 
                // groupBox2
                // 
                this->groupBox2->BackgroundImage = (cli::safe_cast<system::drawing::image^>(resources->GetObject(L"groupBox2.BackgroundImage")));
                this->groupBox2->Controls->Add(this->btnkd);
                this->groupBox2->Controls->Add(this->btnki);
                this->groupBox2->Controls->Add(this->btnkp);
                this->groupBox2->Controls->Add(this->mtbkd);
                this->groupBox2->Controls->Add(this->mtbki);
                this->groupBox2->Controls->Add(this->mtbkp);
                this->groupBox2->Controls->Add(this->label3);
                this->groupBox2->Controls->Add(this->label2);
                this->groupBox2->Controls->Add(this->label1);
                this->groupBox2->ForeColor = System::Drawing::Color::Yellow;
                this->groupBox2->Location = System::Drawing::Point(173, 42);
                this->groupBox2->Name = L"groupBox2";
                this->groupBox2->Size = System::Drawing::Size(158, 131);
                this->groupBox2->TabIndex = 1;
                this->groupBox2->TabStop = false;
                this->groupBox2->Text = L"Parameter";
                // 
                // btnkd
                // 
                this->btnkd->ForeColor = System::Drawing::Color::Blue;
                this->btnkd->Location = System::Drawing::Point(114, 95);
                this->btnkd->Name = L"btnkd";
                this->btnkd->Size = System::Drawing::Size(38, 23);
                this->btnkd->TabIndex = 4;
                this->btnkd->Text = L".....";
                this->btnkd->UseVisualStyleBackColor = true;
                this->btnkd->Click += gcnew System::EventHandler(this, &Form1::btnkd_Click);
                // 
                // btnki
                // 
                this->btnki->ForeColor = System::Drawing::Color::Blue;
                this->btnki->Location = System::Drawing::Point(114, 57);
                this->btnki->Name = L"btnki";
                this->btnki->Size = System::Drawing::Size(38, 23);
                this->btnki->TabIndex = 4;
                this->btnki->Text = L".....";
                this->btnki->UseVisualStyleBackColor = true;
                this->btnki->Click += gcnew System::EventHandler(this, &Form1::btnki_Click);
                // 
                // btnkp
                // 
                this->btnkp->ForeColor = System::Drawing::Color::Blue;
                this->btnkp->Location = System::Drawing::Point(114, 16);
                this->btnkp->Name = L"btnkp";
                this->btnkp->Size = System::Drawing::Size(38, 23);
                this->btnkp->TabIndex = 4;
                this->btnkp->Text = L".....";
                this->btnkp->UseVisualStyleBackColor = true;
                this->btnkp->Click += gcnew System::EventHandler(this, &Form1::btnkp_Click);
                // 
                // mtbkd
                // 
                this->mtbkd->ForeColor = System::Drawing::Color::Maroon;
                this->mtbkd->Location = System::Drawing::Point(28, 97);
                this->mtbkd->Mask = L"00.000000";
                this->mtbkd->Name = L"mtbkd";
                this->mtbkd->Size = System::Drawing::Size(80, 20);
                this->mtbkd->TabIndex = 3;
                // 
                // mtbki
                // 
                this->mtbki->ForeColor = System::Drawing::Color::Maroon;
                this->mtbki->Location = System::Drawing::Point(28, 59);
                this->mtbki->Mask = L"00.000000";
                this->mtbki->Name = L"mtbki";
                this->mtbki->Size = System::Drawing::Size(80, 20);
                this->mtbki->TabIndex = 3;
                // 
                // mtbkp
                // 
                this->mtbkp->ForeColor = System::Drawing::Color::Maroon;
                this->mtbkp->Location = System::Drawing::Point(28, 18);
                this->mtbkp->Mask = L"00.000000";
                this->mtbkp->Name = L"mtbkp";
                this->mtbkp->Size = System::Drawing::Size(80, 20);
                this->mtbkp->TabIndex = 3;
                // 
                // label3
                // 
                this->label3->AutoSize = true;
                this->label3->BackColor = System::Drawing::Color::Transparent;
                this->label3->Location = System::Drawing::Point(6, 100);
                this->label3->Name = L"label3";
                this->label3->Size = System::Drawing::Size(20, 13);
                this->label3->TabIndex = 2;
                this->label3->Text = L"Kd";
                // 
                // label2
                // 
                this->label2->AutoSize = true;
                this->label2->BackColor = System::Drawing::Color::Transparent;
                this->label2->Location = System::Drawing::Point(6, 22);
                this->label2->Name = L"label2";
                this->label2->Size = System::Drawing::Size(20, 13);
                this->label2->TabIndex = 2;
                this->label2->Text = L"Kp";
                // 
                // label1
                // 
                this->label1->AutoSize = true;
                this->label1->BackColor = System::Drawing::Color::Transparent;
                this->label1->Location = System::Drawing::Point(6, 62);
                this->label1->Name = L"label1";
                this->label1->Size = System::Drawing::Size(16, 13);
                this->label1->TabIndex = 2;
                this->label1->Text = L"Ki";
                // 
                // groupBox3
                // 
                this->groupBox3->BackgroundImage = (cli::safe_cast<system::drawing::image^>(resources->GetObject(L"groupBox3.BackgroundImage")));
                this->groupBox3->Controls->Add(this->check1);
                this->groupBox3->Controls->Add(this->txtcur);
                this->groupBox3->Controls->Add(this->num1);
                this->groupBox3->Controls->Add(this->label5);
                this->groupBox3->Controls->Add(this->label4);
                this->groupBox3->Controls->Add(this->btnapp);
                this->groupBox3->ForeColor = System::Drawing::Color::Yellow;
                this->groupBox3->Location = System::Drawing::Point(337, 42);
                this->groupBox3->Name = L"groupBox3";
                this->groupBox3->Size = System::Drawing::Size(145, 131);
                this->groupBox3->TabIndex = 1;
                this->groupBox3->TabStop = false;
                this->groupBox3->Text = L"Velocity";
                // 
                // check1
                // 
                this->check1->AutoSize = true;
                this->check1->BackColor = System::Drawing::Color::Transparent;
                this->check1->Location = System::Drawing::Point(57, 73);
                this->check1->Name = L"check1";
                this->check1->Size = System::Drawing::Size(66, 17);
                this->check1->TabIndex = 3;
                this->check1->Text = L"Reverse";
                this->check1->UseVisualStyleBackColor = false;
                this->check1->CheckedChanged += gcnew System::EventHandler(this, &Form1::check1_CheckedChanged);
                // 
                // txtcur
                // 
                this->txtcur->BackColor = System::Drawing::Color::White;
                this->txtcur->ForeColor = System::Drawing::Color::Maroon;
                this->txtcur->Location = System::Drawing::Point(57, 48);
                this->txtcur->Name = L"txtcur";
                this->txtcur->Size = System::Drawing::Size(77, 20);
                this->txtcur->TabIndex = 2;
                // 
                // num1
                // 
                this->num1->BackColor = System::Drawing::Color::White;
                this->num1->ForeColor = System::Drawing::Color::Maroon;
                this->num1->Location = System::Drawing::Point(57, 19);
                this->num1->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) {3000, 0, 0, 0});
                this->num1->Name = L"num1";
                this->num1->Size = System::Drawing::Size(77, 20);
                this->num1->TabIndex = 1;
                // 
                // label5
                // 
                this->label5->AutoSize = true;
                this->label5->BackColor = System::Drawing::Color::Transparent;
                this->label5->Location = System::Drawing::Point(6, 51);
                this->label5->Name = L"label5";
                this->label5->Size = System::Drawing::Size(41, 13);
                this->label5->TabIndex = 2;
                this->label5->Text = L"Current";
                // 
                // label4
                // 
                this->label4->AutoSize = true;
                this->label4->BackColor = System::Drawing::Color::Transparent;
                this->label4->Location = System::Drawing::Point(10, 22);
                this->label4->Name = L"label4";
                this->label4->Size = System::Drawing::Size(23, 13);
                this->label4->TabIndex = 2;
                this->label4->Text = L"Set";
                // 
                // btnapp
                // 
                this->btnapp->ForeColor = System::Drawing::Color::Blue;
                this->btnapp->Location = System::Drawing::Point(57, 97);
                this->btnapp->Name = L"btnapp";
                this->btnapp->Size = System::Drawing::Size(77, 28);
                this->btnapp->TabIndex = 0;
                this->btnapp->Text = L"Apply";
                this->btnapp->UseVisualStyleBackColor = true;
                this->btnapp->Click += gcnew System::EventHandler(this, &Form1::btnapp_Click);
                // 
                // groupBox4
                // 
                this->groupBox4->BackgroundImage = (cli::safe_cast<system::drawing::image^>(resources->GetObject(L"groupBox4.BackgroundImage")));
                this->groupBox4->Controls->Add(this->btnexi);
                this->groupBox4->Controls->Add(this->btnref);
                this->groupBox4->Controls->Add(this->btnabo);
                this->groupBox4->Controls->Add(this->btnato);
                this->groupBox4->Controls->Add(this->btncon);
                this->groupBox4->Controls->Add(this->btnrun);
                this->groupBox4->ForeColor = System::Drawing::Color::Yellow;
                this->groupBox4->Location = System::Drawing::Point(488, 42);
                this->groupBox4->Name = L"groupBox4";
                this->groupBox4->Size = System::Drawing::Size(190, 131);
                this->groupBox4->TabIndex = 1;
                this->groupBox4->TabStop = false;
                this->groupBox4->Text = L"Control Panel";
                // 
                // btnexi
                // 
                this->btnexi->BackColor = System::Drawing::Color::LightGray;
                this->btnexi->ForeColor = System::Drawing::Color::Blue;
                this->btnexi->Location = System::Drawing::Point(105, 97);
                this->btnexi->Name = L"btnexi";
                this->btnexi->Size = System::Drawing::Size(75, 28);
                this->btnexi->TabIndex = 0;
                this->btnexi->Text = L"Exit";
                this->btnexi->UseVisualStyleBackColor = false;
                this->btnexi->Click += gcnew System::EventHandler(this, &Form1::btnexi_Click);
                // 
                // btnref
                // 
                this->btnref->BackColor = System::Drawing::Color::LightGray;
                this->btnref->ForeColor = System::Drawing::Color::Blue;
                this->btnref->Location = System::Drawing::Point(6, 97);
                this->btnref->Name = L"btnref";
                this->btnref->Size = System::Drawing::Size(75, 28);
                this->btnref->TabIndex = 0;
                this->btnref->Text = L"Refresh";
                this->btnref->UseVisualStyleBackColor = false;
                this->btnref->Click += gcnew System::EventHandler(this, &Form1::btnref_Click);
                // 
                // btnabo
                // 
                this->btnabo->BackColor = System::Drawing::Color::LightGray;
                this->btnabo->ForeColor = System::Drawing::Color::Blue;
                this->btnabo->Location = System::Drawing::Point(6, 59);
                this->btnabo->Name = L"btnabo";
                this->btnabo->Size = System::Drawing::Size(75, 28);
                this->btnabo->TabIndex = 0;
                this->btnabo->Text = L"About";
                this->btnabo->UseVisualStyleBackColor = false;
                // 
                // btnato
                // 
                this->btnato->BackColor = System::Drawing::Color::LightGray;
                this->btnato->ForeColor = System::Drawing::Color::Blue;
                this->btnato->Location = System::Drawing::Point(105, 59);
                this->btnato->Name = L"btnato";
                this->btnato->Size = System::Drawing::Size(75, 28);
                this->btnato->TabIndex = 0;
                this->btnato->Text = L"Auto";
                this->btnato->UseVisualStyleBackColor = false;
                this->btnato->Click += gcnew System::EventHandler(this, &Form1::btnato_Click);
                // 
                // btncon
                // 
                this->btncon->BackColor = System::Drawing::Color::LightGray;
                this->btncon->ForeColor = System::Drawing::Color::Blue;
                this->btncon->Location = System::Drawing::Point(6, 19);
                this->btncon->Name = L"btncon";
                this->btncon->Size = System::Drawing::Size(75, 28);
                this->btncon->TabIndex = 0;
                this->btncon->Text = L"Connect";
                this->btncon->UseVisualStyleBackColor = false;
                this->btncon->Click += gcnew System::EventHandler(this, &Form1::btncon_Click);
                // 
                // btnrun
                // 
                this->btnrun->BackColor = System::Drawing::Color::LightGray;
                this->btnrun->ForeColor = System::Drawing::Color::Blue;
                this->btnrun->Location = System::Drawing::Point(105, 19);
                this->btnrun->Name = L"btnrun";
                this->btnrun->Size = System::Drawing::Size(75, 28);
                this->btnrun->TabIndex = 0;
                this->btnrun->Text = L"Run";
                this->btnrun->UseVisualStyleBackColor = false;
                this->btnrun->Click += gcnew System::EventHandler(this, &Form1::btnrun_Click);
                // 
                // sp1
                // 
                this->sp1->BaudRate = 19200;
                this->sp1->ReadBufferSize = 1000;
                this->sp1->WriteBufferSize = 1000;
                this->sp1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::sp1_DataReceived);
                // 
                // tm1
                // 
                this->tm1->Interval = 200;
                this->tm1->Tick += gcnew System::EventHandler(this, &Form1::tm1_Tick);
                // 
                // label7
                // 
                this->label7->BackColor = System::Drawing::Color::Transparent;
                this->label7->Font = (gcnew System::Drawing::Font(L"Times New Roman", 12, static_cast<system::drawing::fontstyle>((System::Drawing::FontStyle::Bold | System::Drawing::FontStyle::Italic)), 
                    System::Drawing::GraphicsUnit::Point, static_cast<system::byte>(0)));
                this->label7->ForeColor = System::Drawing::Color::LightCyan;
                this->label7->Location = System::Drawing::Point(50, 175);
                this->label7->Name = L"label7";
                this->label7->Size = System::Drawing::Size(468, 30);
                this->label7->TabIndex = 2;
                this->label7->Text = L"University of Technical Education HCMC - Author : Le Hoang Anh";
                this->label7->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
                this->label7->Visible = false;
                // 
                // label8
                // 
                this->label8->BackColor = System::Drawing::Color::Transparent;
                this->label8->Font = (gcnew System::Drawing::Font(L"Times New Roman", 12, static_cast<system::drawing::fontstyle>((System::Drawing::FontStyle::Bold | System::Drawing::FontStyle::Italic)), 
                    System::Drawing::GraphicsUnit::Point, static_cast<system::byte>(0)));
                this->label8->ForeColor = System::Drawing::Color::Yellow;
                this->label8->Location = System::Drawing::Point(210, 175);
                this->label8->Name = L"label8";
                this->label8->Size = System::Drawing::Size(468, 30);
                this->label8->TabIndex = 2;
                this->label8->Text = L"University of Technical Education HCMC - Author : Le Hoang Anh";
                this->label8->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
                this->label8->Visible = false;
                // 
                // tm2
                // 
                this->tm2->Interval = 200;
                this->tm2->Tick += gcnew System::EventHandler(this, &Form1::tm2_Tick);
                // 
                // Form1
                // 
                this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
                this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
                this->BackgroundImage = (cli::safe_cast<system::drawing::image^>(resources->GetObject(L"$this.BackgroundImage")));
                this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Center;
                this->ClientSize = System::Drawing::Size(724, 543);
                this->Controls->Add(this->label8);
                this->Controls->Add(this->label7);
                this->Controls->Add(this->groupBox4);
                this->Controls->Add(this->groupBox3);
                this->Controls->Add(this->groupBox2);
                this->Controls->Add(this->groupBox1);
                this->Controls->Add(this->tChart1);
                this->ForeColor = System::Drawing::Color::Yellow;
                this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
                this->MaximizeBox = false;
                this->Name = L"Form1";
                this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
                this->Text = L"Form1";
                this->TransparencyKey = System::Drawing::Color::Black;
                this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
                (cli::safe_cast<system::componentmodel::isupportinitialize^>(this->tChart1))->EndInit();
                this->groupBox1->ResumeLayout(false);
                this->groupBox1->PerformLayout();
                this->groupBox2->ResumeLayout(false);
                this->groupBox2->PerformLayout();
                this->groupBox3->ResumeLayout(false);
                this->groupBox3->PerformLayout();
                (cli::safe_cast<system::componentmodel::isupportinitialize^>(this->num1))->EndInit();
                this->groupBox4->ResumeLayout(false);
                this->ResumeLayout(false);
    
            }
    #pragma endregion        
        private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
                run=false;
                check1->Enabled=false;
                btnkp->Enabled=false;
                btnki->Enabled=false;
                btnkd->Enabled=false;
                btnapp->Enabled=false;
                btnrun->Enabled=false;
                btnato->Enabled=false;            
                mtbkp->Text="001";
                mtbki->Text="001";
                mtbkd->Text="001";
                txtcur->Text="0";
                cb1->Text="COM1";//dong nay va 3 dong duoi de test thu mac dinh
                sp1->BaudRate=19200;
                sp1->DataBits=8;            
                //sp1->Open();
                //sp1->WriteLine("s");
                tChart1->Location = System::Drawing::Point(0, -17);
                tChart1->Padding = System::Windows::Forms::Padding(10, 215, 45, 25);
                tChart1->Size = System::Drawing::Size(726, 583);
                tChart1->AutoScrollOffset = System::Drawing::Point(20);
                tChart1->Zoom->Animated=true;
                tChart1->Zoom->AnimatedSteps=5;
                tm1->Start();
                //tm2->Start();//ko can,de dong nay se chay sai
                
    
    
    
                 }
                 
                 
                 
    private: System::Void tm1_Tick(System::Object^  sender, System::EventArgs^  e) {
                 time1+=5;
    
                 int x=45;
                 label7->Visible=true;
                 label8->Visible=false;
                 label7->Location = System::Drawing::Point(x+time1,175);
                 x=x+time1;    
                 if(x==210)
                 {
                     tm1->Stop();
                     time1=0;
                     label7->Location = System::Drawing::Point(210, 175);
                     tm2->Start();
                 }
                 
                 
             }
    private: System::Void tm2_Tick(System::Object^  sender, System::EventArgs^  e) {
                 time2+=5;
                 int x=215;
                 label8->Visible=true;
                 label7->Visible=false;
                 label8->Location = System::Drawing::Point(x-time2,175);
                 x=x-time2;    
                 if(x==50)
                 {
                     tm2->Stop();
                     time2=0;    
                     label8->Location = System::Drawing::Point(50, 175);
                     tm1->Start();
                     
                 }    
                 
                 
             }
    private: System::Void btnref_Click(System::Object^  sender, System::EventArgs^  e) {
                      tChart1->Series(1)->Clear();
                      tChart1->Series(0)->Clear();
                      tChart1->Refresh();
             }
    private: System::Void btnexi_Click(System::Object^  sender, System::EventArgs^  e) {                  
                      time=0;
                      //sp1->Close();
                      this->Close();
             }
    private: System::Void cb1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) {
                      sp1->PortName=cb1->Text;
             }
    private: System::Void btncon_Click(System::Object^  sender, System::EventArgs^  e) {
    
                 if(btncon->Text->Equals("Connect"))
                 {                
                 sp1->Open();
                 btnkp->Enabled=true;
                 btnki->Enabled=true;
                 btnkd->Enabled=true;
                 btnapp->Enabled=true;             
                 cb1->Enabled=false;
                 btncon->Text = "Disconnect";
                 }
                 else
                 {
                 sp1->Close();
                 cb1->Enabled=true;
                 btnkp->Enabled=false;
                 btnki->Enabled=false;
                 btnkd->Enabled=false;
                 btnapp->Enabled=false;
                 btncon->Text = "Connect";
                 }
    
             }
    private: System::Void btnrun_Click(System::Object^  sender, System::EventArgs^  e) {
    
                 if(btnrun->Text->Equals("Run"))
                 {
                     if(sp1->IsOpen==false)
                     {
                         Windows::Forms::DialogResult result;
                         result=MessageBox::Show("You must connect first!","Warning",Windows::Forms::MessageBoxButtons::OK,Windows::Forms::MessageBoxIcon::Warn
    ing);
                         if(result==Windows::Forms::DialogResult::OK)
                                return;
                     }            
                     check1->Enabled=true;
                     sp1->Write("r");
                     run=true;
                     btnrun->Text="Stop";
                     //btnato->Enabled=false;
                     btnrun->ForeColor=Drawing::Color::Red;
                 }
                 else
                 {
                     if(sp1->IsOpen==false)
                     {
                         Windows::Forms::DialogResult result;
                         result=MessageBox::Show("You must connect first!","Warning",Windows::Forms::MessageBoxButtons::OK,Windows::Forms::MessageBoxIcon::Warn
    ing);
                         if(result==Windows::Forms::DialogResult::OK)
                                return;
                     }
                     else
                     {
                     sp1->Write("s");
                     run=false;
                     //sp1->Close();
                     check1->Enabled=false;
                     btnrun->Text="Run";
                     //btnato->Enabled=true;
                     btnrun->ForeColor=Drawing::Color::Blue;
                     veloc=0;
                     dir1=0;
                     txtcur->Text="0";
                     tChart1->Series(1)->AddXY(time,veloc,"",2000);
                     }
                     
                 }
    
             }
    
    private: System::Void check1_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
                 dir1++;
                 if((dir1%2)==0)
                 {
                    sp1->Write("r");
                 }
                 else
                 {
                     sp1->Write("t");
                 }
                 
             }
    private: System::Void sp1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
                     time++;
                     Control::CheckForIllegalCrossThreadCalls=false;
                     velre=sp1->ReadLine();
                     veloc=Convert::ToDouble(velre);
                     veloc=veloc*10;
                     txtcur->Text=Convert::ToString(veloc);
                     tChart1->Series(1)->AddXY(time,veloc,"",2000); //cac dong nay test ve teechart ko test nua thi xoa di
                     tChart1->Series(0)->AddXY(time,vset,"",2000);
                     if((tChart1->Series(1)->Count)>30)
                     {
                         tChart1->Axis->Bottom->MinimumOffset=(tChart1->Axis->Bottom->MinimumOffset - 3);
                         tChart1->Axis->Bottom->Maximum=(tChart1->Axis->Bottom->Maximum + 1);
                     }             
    
    
                     
                     
             }
    
    private: System::Void btnapp_Click(System::Object^  sender, System::EventArgs^  e) {
    
                 btnrun->Enabled=true;
                 btnato->Enabled=true;
                 str_vset=num1->Text;
                 vset=Convert::ToInt16(str_vset);
                 sp=(Convert::ToUInt16(str_vset))/10;
                 string_vset=Convert::ToString(sp);
                 
                 if(run==false)
                 {
                  sp1->WriteLine(string_vset+"a");
                 }
                 else
                 {
                     sp1->WriteLine(string_vset+"a");
                     sp1->Write("r");
                 }
                 Windows::Forms::DialogResult result;
                 result=MessageBox::Show("All parameters burned successful!","Successful",Windows::Forms::MessageBoxButtons::OK,Windows::Forms::MessageBoxIcon::Aste
    risk);
                         if(result==Windows::Forms::DialogResult::OK)
                                return;
             }
    
    private: System::Void btnkp_Click(System::Object^  sender, System::EventArgs^  e) {
    
                 String^tempp;
                 kp=(Convert::ToDouble(mtbkp->Text))*1000;
                 //kp=(Convert::ToDouble(mtbkp->Text))*1;
                 tempp=Convert::ToString(kp);
                 if(run==false)
                 {
                  sp1->Write(tempp+"p");
                 }
                 else
                 {
                     sp1->Write(tempp+"p");
                     sp1->Write("r");
                 }
                 //sp1->Write(tempp+"p");
                 Windows::Forms::DialogResult result;
                 result=MessageBox::Show("Kp burned successful!","Successful",Windows::Forms::MessageBoxButtons::OK,Windows::Forms::MessageBoxIcon::Aste
    risk);
                         if(result==Windows::Forms::DialogResult::OK)
                                return;
             }
    private: System::Void btnki_Click(System::Object^  sender, System::EventArgs^  e) {
    
                 String^tempi;
                 ki=(Convert::ToDouble(mtbki->Text))*1000;
                 //ki=(Convert::ToDouble(mtbki->Text))*1;
                 tempi=Convert::ToString(ki);
                 if(run==false)
                 {
                  sp1->Write(tempi+"i");
                 }
                 else
                 {
                     sp1->Write(tempi+"i");
                     sp1->Write("r");
                 }
                 //sp1->Write(tempi+"i");             
                 Windows::Forms::DialogResult result;
                 result=MessageBox::Show("Ki burned successful!","Successful",Windows::Forms::MessageBoxButtons::OK,Windows::Forms::MessageBoxIcon::Aste
    risk);
                         if(result==Windows::Forms::DialogResult::OK)
                                return;
    
             }
    private: System::Void btnkd_Click(System::Object^  sender, System::EventArgs^  e) {
    
                 String^tempd;
                 kd=(Convert::ToDouble(mtbkd->Text))*1000;
                 //kd=(Convert::ToDouble(mtbkd->Text))*1;
                 tempd=Convert::ToString(kd);
                 if(run==false)
                 {
                  sp1->Write(tempd+"d");
                 }
                 else
                 {
                     sp1->Write(tempd+"d");
                     sp1->Write("r");
                 }
                 //sp1->Write(tempd+"d");
                 Windows::Forms::DialogResult result;
                 result=MessageBox::Show("Kd burned successful!","Successful",Windows::Forms::MessageBoxButtons::OK,Windows::Forms::MessageBoxIcon::Aste
    risk);
                         if(result==Windows::Forms::DialogResult::OK)
                                return;
    
             }
    private: System::Void btnato_Click(System::Object^  sender, System::EventArgs^  e) {
    
                 
                 if(btnato->Text->Equals("Auto"))
                 {
                     btnato->Text="Modify";
                     //btnrun->Enabled=false;
                     //btnrun->Text="Stop";
                     btnkp->Enabled=false;
                     btnki->Enabled=false;
                     btnkd->Enabled=false;
                     mtbkp->Enabled=false;
                     mtbki->Enabled=false;
                     mtbkd->Enabled=false;
                 }
                 else
                 {
                     btnato->Text="Auto";
                     //btnrun->Enabled=true;
                     //btnrun->Text="Run";
                     btnkp->Enabled=true;
                     btnki->Enabled=true;
                     btnkd->Enabled=true;
                     mtbkp->Enabled=true;
                     mtbki->Enabled=true;
                     mtbkd->Enabled=true;
                 }
    
             }
    };
    }
    </system::componentmodel::isupportinitialize^></system::componentmodel::isupportinitialize^></system::drawing::image^></system::byte></system::drawing::fontstyle></system::byte></system::drawing::fontstyle></system::drawing::image^></system::drawing::image^></system::drawing::image^></system::byte></system::drawing::image^></system::windows::forms::axhost::state^></system::componentmodel::isupportinitialize^></system::componentmodel::isupportinitialize^>
  5. hoangleanh87 New Member

    Số bài viết: 244
    Đã được thích: 5
    Điểm thành tích: 0
    <span style="font-size:18pt;line-height:100%">Hình ảnh</span>
    -Mô hình:
    <div align='center'>[IMG]</div>
    -Giao diện PC
    <div align='center'>[IMG]</div>
    Chỉ có khâu P
    <div align='center'>[IMG]
    [IMG]</div>
    <div align='center'>[IMG]

    <div align='center'>[IMG]
    [IMG]</div>

    Kết quả đạt được, hạn chế của đề tài và phương hướng phát triển.
    +Kết quả đạt được:

    -Vận dụng lý thuyết đã học ( VĐK Atmega32,Ngôn ngử C,LTĐKTĐ ) vào ứng dụng cụ thể.

    -Đả điều khiển thành công vận tốc động cơ bằng thuật toán PID+đảo chiều động cơ dùng VĐK Atmega32 giao tiếp PC

    -Kiểm chứng với lý thuyết ĐKTĐ về vai trò của các khâu P,I,D nói riêng và bộ PID nói chung (Xem hình).

    +Hạn chế của đề tài:

    -Do hạn chế về đường truyền (chuẩn RS232) nên việc thu thập dữ liệu và hiển thị trên PC còn hạn chế.
    -Hạn chế về phần cứng và các tính toán phụ thuộc hoàn toàn vào VĐK.

    +Hướng phát triển:

    -Hoàn thiện phần cứng và phần mềm xây dựng mô hình thí nghiệm.
    -Tiến hành thử tải.
    -Nghiên cứu điều khiển vị trí và xa hơn là moment.
    -Nghiên cứu sử dụng các loại Card và phần mềm hổ trợ bộ PID để điều khiển.
    -Nghiên cứu các phương pháp điều khiển khác ( lý thuyết mờ...) so sánh các bộ điều khiển và tìm kiếm sự kết hợp.

    Tài liệu tham khảo:

    Lý thuyết ĐKTĐ
    Embedded C Programming and Atmel AVR,2e
    Hai Đồ Án của các anh CĐT03
    Và đặc biệt là sự giúp đở nhiệt tình của nhóm MEKATECH-CĐT04,các bạn và Thầy Lê Tấn Cường.
    Em chân thành cảm ơn các anh,các bạn và Thầy.
    Web tham khảo:
    Vagam
    Diễn Đàn Điện tử Việt Nam...
    </div>
  6. hoangleanh87 New Member

    Số bài viết: 244
    Đã được thích: 5
    Điểm thành tích: 0
  7. hoangvandung Guest

    Số bài viết: 0
    Đã được thích: 0
    Điểm thành tích: 0
    sin chao cac ban sinh vien DHSPKT.
    minh la mot thanh vien moi ,minh muon nhop cac ban giup minh voi.
    minh dang lam do an ve dieu khien PID nhung ko biet nhieu lam, bua nay thay trang nay minh rat vui,
    minh muon xin cac ban files do an " bo dieu khien PID cho toc do dong co DC " ko biet co duoc ko ?
    minh muon xin toan bo luan an nay de tham khao them vi minh thay rat hay.neu duoc minh rat cam on cac thanh vien nhieu .
  8. hoangvandung Guest

    Số bài viết: 0
    Đã được thích: 0
    Điểm thành tích: 0
    Nếu được mong các bạn post lên cho mình với nhe!
  9. mnhut Guest

    Số bài viết: 0
    Đã được thích: 0
    Điểm thành tích: 0
    thanks bác nhé. nhờ có cái project mà em hiểu ra đc một số vấn đề khúc mắc.
    thanhnhanqt91 thích bài này.
  10. KN Servant. Servant.

    Số bài viết: 1,291
    Đã được thích: 3
    Điểm thành tích: 0
  11. minhnghia360 New Member

    Số bài viết: 6
    Đã được thích: 0
    Điểm thành tích: 0
    em muốn làm một cái mạch điều khiển động cơ DC12v dạng cầu H anh chị nào có sơ đồ mạch cho em với em làm thành viên mới và cũng là sinh viên năm nhẩt rất mong mấy chị giúp đỡi: em xin cảm ơn nhiều lắm và đây là một diễn đàng rất hữu ích em chúc cho diễn đàng của mnihf sẽ ngày càng có nhiều nội dung phong phú hơn và nhiều thành viên hơn nữa. vì em làm mạch điều khiển giống như là mạch điều khiển ROBOCON đó. mấy anh chị giúp em nha nếu được thì mấy anh chị gởi qua địa chỉ mail cho em nha : (minhnghia360@yahoo.com.vn)( minhnghia360@gmail.com) nick yahoo: minhnghia360
  12. thanhmai Member

    Số bài viết: 606
    Đã được thích: 5
    Điểm thành tích: 18
    đây là mạch điều khiển mà em cần nè ! mạch đó thường ứng dụng để đảo chiều động cơ . thường kết hợp với vi điều khiển hoạc điều khiển bằng máy tính đó

    các thông số được ghi trên mạch rầu đó:
    [IMG]
  13. daihoa New Member

    Số bài viết: 184
    Đã được thích: 1
    Điểm thành tích: 0
    mình nghĩ bạn nên dùng các ic tích hợp cầu h bên trong để dùng cho thuận tiện, vì nếu làm bỏad cầu h mà dùng FET thì rất dễ bị chết FET nếu như bạn ko dùng những ic kích Fet chuyên dụng. còn về các dùng những ic này thì để vẽ đc nguyên lí rất khó. mình nghĩ bạn sẽ ko làm nổi. hiện nay có các ic như l298 (2 cầu h), lmd18200(1 cầu h), rất dễ sử dụng, tuy hiên nếu bạn dk các dc có công suât nhỏ thì ok. và hiện nay trên clb KHOA HỌC TRẺ có bán PCB của những bỏad này. bạn mua về hàn linh kiện vào thì sẽ đỡ tốn nhiều thời gian hơn. nếu cần thì bạn cứ lên trực tiếp clb để mua hoặc liên hệ
    Thầy Cường: 0909744100
    hoặc Đại Hòa: 01217536891
    chúc bạn gặp nhiều thành công!
    nếu bạn cần thì mình sẽ cho bạn nguyên lí bỏad cầu h mình vừa sử dụng trong robocon2009 vừa rồi. chạy rất tốt nhưng giá thành rất cao vì khi sử dụng cầu h thì phải sử dụng những ic kích FET chuyên dụng, như thế thì sẽ ko làm chết FEt, mà những ic này thì giá hơi cao. vì thế trong cuộc thi vừa rồi chỉ có đội SPK-MEC của clb khoa học trẻ mới dùng bỏad này
  14. himas88 New Member

    Số bài viết: 247
    Đã được thích: 1
    Điểm thành tích: 0
    tại sao bạn không làm 1 bộ FET+ rơle nhỉ? Rẻ thật đấy, test cho dễ, bạn mới năm 1 mà. làm cái gì dễ dễ, rẻ rẻ....test cho nhanh rồi còn nghiên cứu cái khác để chơi robot nữa chứ.
    Mình có 1 lời khuyên, tìm hiểu thì cố gắng tìm hiểu...nhưng nếu muốn công việc đi nhanh thì nên có 1 cái board chất lượng, tha hồ mà test
  15. minhnghia360 New Member

    Số bài viết: 6
    Đã được thích: 0
    Điểm thành tích: 0
    em cảm ơn các anh nhiều lắm, em sẻ thực hiện thử, em còn nhiều điều cần sự giúp đỡi của mấy anh mấy anh giúp em chứ.thật sự là em rất yêu thích robocon lắm nên em muốn mình có thể làm được một chú robocon nhưng vì em mới là sinh viên năm nhất nên còn rất nhiều điều chưa biết. có người khuyên em nên bỏ cuộc đi nhưng em sẻ cố gắn thực hiện vì đó là sự đam mê lớn nhất của em.
    em rất mong mấy anh giúp đỡi em nha.trước tiên là em cảm ơn mấy anh nhiều lắm.em không ngời mấy anh lại giúp đỡi em nhiều như vậy.
    anh ( daihoa) có thể cho em xin nguyên lý bỏad vừa được sử dụng trong cuộc thi robocon2009.
    và cho em hoi thêm các cơ cấu chuyển động thì mình nên chọn dạng làm chuyển động theo vítme bi hay theo hệ thống thủy lực khí nén cái nào tốt hơm mấy anh.
    mấy anh có tài liệu nào nói về robocon thi post cho em dc ko mấy anh em rất thích con robocon của mấy anh đó nó thật ấn tượng và chính xác nữa mấy anh có bí quyết gì không chỉ bảo cho em với .
    chào mấy anh nha và chúc cho diễn đàng của mình ngày cang thành công hơn nửa,:045:
  16. daihoa New Member

    Số bài viết: 184
    Đã được thích: 1
    Điểm thành tích: 0
    ok. minh có thể cho bạn nguyên lí của board c62u h cùng trong robocon vừa rồi
    nhưng mình ngi4 về tài liệu robocon thì rất khó đó bạn ah!
    ko phải mình ko cho mà là cái này bạn phải tham gia rồi trong quá trình làm robot bạn học luôn, chứ nếu bạn nói mình cho bạn tài liệu robocon thì mình chẳng biết cho bạn cái gì cả, mình khuyên bạn nên tham gia robot rồi trong quá trình làm bạn mới biết là bạn cấn học gì và cần những kiến thức gì rồi sau đó bạn học hỏi những thành viên trong đội. đây chính là cách học tốt nhất đó bạn ah
    mong năm sau bạn sẽ tham gia robocon
    chúc vui ve!
    file board cầu H:http://www.4shared.com/file/119586800/d1692508/cauH_robocon.html
  17. minhnghia360 New Member

    Số bài viết: 6
    Đã được thích: 0
    Điểm thành tích: 0
    thanks anh nhìu lắm. nhưng anh ơi cái file anh cho đó mình dùng chương trình nào để đọc em dow về mà ko xem được anh ơi.
  18. daihoa New Member

    Số bài viết: 184
    Đã được thích: 1
    Điểm thành tích: 0
  19. fairlady New Member

    Số bài viết: 27
    Đã được thích: 0
    Điểm thành tích: 0
  20. hoangleanh87 New Member

    Số bài viết: 244
    Đã được thích: 5
    Điểm thành tích: 0
  21. caodungviet New Member

    Số bài viết: 13
    Đã được thích: 0
    Điểm thành tích: 0
  22. thanhtrungc1 Member

    Số bài viết: 37
    Đã được thích: 1
    Điểm thành tích: 8
  23. okitakimura New Member

    Số bài viết: 1
    Đã được thích: 0
    Điểm thành tích: 0
    cho mình hỏi 1 tý, trong code có đoạn này
    Mã:
    setup_timer_2 (T2_DIV_BY_1,255,1); //set the PWM frequency to [(20MHz/4)/1]/255=19.608KHz( chinh xac  51 us)
                                    //   max_pwm=1020 
    vì sao max_pwm = 1020 vậy mọi người ??
  24. dtth New Member

    Số bài viết: 1
    Đã được thích: 0
    Điểm thành tích: 0
    4 con diode trong mạch làm nhiệm vụ gì thế các bác và nó làm như thế nào? các bác chỉ giúp e với được ko?
    [IMG]
  25. hoantien Member

    Số bài viết: 359
    Đã được thích: 1
    Điểm thành tích: 18
    bảo vệ cho 4 con tip không bị chết bởi dòng ngược!!
  26. Sonny New Member

    Số bài viết: 5
    Đã được thích: 0
    Điểm thành tích: 0

Chia sẻ trang này