[help] chương trình con nhận thông số PID từ máy tính bằng uart

tuandanh.bk10

Trứng gà
mọi người cho em hỏi, em muốn viết 1 chương trình con để nhận dữ liệu uart, cụ thể là các hệ số Kp. Ki, Kd từ GUI ( nhập 1 lần rồi enter xuống) thì em phải code như thế nào vậy ạ. cả trên CCS và Visual Studio luôn nhé. em đang rối rắm lẩn quẩn với uart mà chưa hiểu lắm(mặc dù đã đọc TUT rất nhiều :gach) . mọi người giúp em với ạ :2cool_burn_joss_stick:
 

MMKC

Thành Viên PIF
Trước giờ thì mình làm như sau:
-Bạn sẽ chuyển đổi dữ liệu trước đã. Gom lại tất cả giá trị KP KI KD thành chuỗi dữ liệu và gửi chuỗi dữ liệu đó lên VĐK
-Còn VĐK sẽ có ngắt Uart Receiver để chuyển ngược lại chuỗi dữ liệu đó.
- Còn về Enter xuống dòng thì hình như kí tự trong ASCII là 10
http://en.wikipedia.org/wiki/ASCII
Không biết bạn đọc TUT này chưa. Mình không rành C# lắm nhưng vừa coi vừa thực tập cũng biết sơ sơ :D
http://www.payitforward.edu.vn/forum/threads/42/
P/s: nếu đang quẩn quẩn thì tốt nhất làm trận Dota hay LOL rồi làm tiếp. Chứ cứ ngồi xoắn lên không ra đâu
 

doancongthang

Thành Viên PIF
í tưởng có phải là gởi thông số PID xuống vi điều khiển để nó nhận rồi nó điều khiển động cơ:(. Đồ án mình cũng làm cái đó, có gì bắt tay hợp tác.
 

40701002

Thành Viên PIF
Cách của MMCK rất chi là chính xác, mình cũng đã làm rồi, sẵn tiện nói chi tiết cho bạn luôn
Cách mình đã làm nhé:
Trên C#, gửi chuỗi kp@Ki@Kd@Tin_hieu_dat@ xuống vi điều khiển. Bạn dùng ngắt uart nhận chuỗi này vào một cái mảng kiểu char. Bạn thấy mình có chèn kí tự @ trong chuỗi đấy, mục đích là để mình biết đâu là kp, ki, kd và tín hiệu đặt. Sau đó ở dưới VDK, bạn cứ tách ra và chuyển string thành float là đem đi sài cho hàm pid được rồi.
Đây là code dùng để tách kp,ki,kd, tín hiệu đặt (trong code mình dùng kí tự "e" thay cho "@")
Code:
void ReadUart(void)
{
    unsigned int dem = 0, count_e = 0;
    char temp_uart[6];
    for(int i=0;ReceiveData[i] != '/';i++)
    {
        if(ReceiveData[i]=='e')
            {
                count_e++;
                switch(count_e)
                {
                    case 1:
                    {
                        for(int j = 0;j<=i;j++)    temp_uart[j] = ReceiveData[j];
                        Tset = String2Num(temp_uart);
                        dem = i+1;// chi so cua ky tu sau e
                        break;
                    }
                    case 2:
                    {
                        for(int j = dem;j<=i;j++)temp_uart[j-dem] = ReceiveData[j];
                        Kp = String2Num(temp_uart);
                        dem = i+1;
                        break;
                    }
                    case 3:
                    {
                        for(int j = dem;j<=i;j++)temp_uart[j-dem] = ReceiveData[j];
                        Ki = String2Num(temp_uart);
                        dem = i+1;
                        break;
                    }
                    case 4:
                    {
                        for(int j = dem;j<=i;j++)temp_uart[j-dem] = ReceiveData[j];
                        Kd = String2Num(temp_uart);
                        count_e = 0;
                        break;
                    }
                }
            }
    }
   
}
Đây là code chuyển từ string sang số thực
Code:
double String2Num(char *str)
{
    double x = 0;
    double powel;
    unsigned char count = 0 , dot_position = 0;
    unsigned char i;
    unsigned char buf[20];
    unsigned char *ptemp;
    ptemp = buf;            //con tro den buffer
    while( *str != 'e')
    {
        *ptemp = *str - 0x30;
        if( *str == '.')  dot_position = count;
        ptemp++;
        str++;
        count++;   
    }       
 
    if( dot_position == 0)        dot_position = count;            //so nguyen hoan toan
   
    //tinh tong phan nguyen
    powel = 1;
    for(i = 1 ; i <= dot_position ; i++)
    {
        x += buf[dot_position-i]*powel;
        powel *= 10;
    }
   
    //tinh tong phan thap phan
    powel = 0.1;
    for( i = dot_position + 1 ; i < count ; i++)   
    {
        x += buf[i]*powel;   
        powel *= 0.1;
    }   
    return x;
}
 
Top