PDA

View Full Version : xin chỉ em cách dùng MPLAB SIM


ham_hoc_hoi
30-12-2008, 10:36 PM
Bác nào cho em hỏi, cách dùng MPLAB SIM để xem kết quả của 1 phép tính trong dspic như nào ah, vi dụ
int a,b,c;
a = 0x00FC;
b = 0x012A;
c = a*b;

mình muốn xem kết quả của C bằng bao nhiêu thì vào đâu ah, nếu khai báo số a,b,c là các số fractional thì cách mô phỏng có khác ko ah

namqn
30-12-2008, 10:55 PM
Bác nào cho em hỏi, cách dùng MPLAB SIM để xem kết quả của 1 phép tính trong dspic như nào ah, vi dụ
int a,b,c;
a = 0x00FC;
b = 0x012A;
c = a*b;

mình muốn xem kết quả của C bằng bao nhiêu thì vào đâu ah, nếu khai báo số a,b,c là các số fractional thì cách mô phỏng có khác ko ah
Bạn xem presentation sau về cách sử dụng MPLAB SIM:
http://techtrain.microchip.com/webseminars/documents/MPLABSIM_111908.pdf

Phần bạn vừa hỏi được trả lời ở mục Watchpoints. Việc mô phỏng không phụ thuộc vào việc biến được khai báo ra sao, và bạn có thể xem một biến ở format bất kỳ do bạn chọn.

Thân,

ham_hoc_hoi
31-12-2008, 04:25 PM
bác namqn cho em hỏi với nhé, em làm theo cái vi dụ PID của C30 các hế số Ki, Kp, Kd của nó là các số Q15 nhỏ hơn 1, vậy bây h em muốn khai báo là các số lơn hơn 1 thì phải làm thế nào hả bác, ví dụ như 1,5 ; 3,4 ; 5,2 ...
Mong bác trả lời giúp em

namqn
31-12-2008, 05:52 PM
bác namqn cho em hỏi với nhé, em làm theo cái vi dụ PID của C30 các hế số Ki, Kp, Kd của nó là các số Q15 nhỏ hơn 1, vậy bây h em muốn khai báo là các số lơn hơn 1 thì phải làm thế nào hả bác, ví dụ như 1,5 ; 3,4 ; 5,2 ...
Mong bác trả lời giúp em
Bạn đang muốn làm điều không thể. Theo bảng 2.2 của tài liệu "dsPIC30F Family Reference Manual", hay mục 4.11.1 của tài liệu "dsPIC30F/33F Programmer's Reference Manual", phạm vi biểu diễn dữ liệu của số Q15 là từ -1.0 đến 0.999969482.

Các số Q15 thường được dùng khi bạn tính toán trong hệ đơn vị tương đối (per unit). Để sử dụng hệ đơn vị tương đối, trước hết bạn sẽ chuyển đổi các đại lượng tuyệt đối thành các giá trị trong hệ đơn vị tương đối. Sau khi tính toán xong, bạn có thể chuyển đổi các kết quả trong hệ đơn vị tương đối thành các giá trị tuyệt đối. Bạn nên đọc thêm về vấn đề này.

Thân,

ham_hoc_hoi
02-01-2009, 10:11 PM
nếu em khai báo các số lớn hơn 1 là số float , sau đó dùng hàm chuyển từ float sang frac, rồi tính toán với các số frac đo, sau đó dc kết quả lại chuyển ngc lại từ frac sang float như thế có dc ko bác, em thấy 2 hàm này tốn nhiều chu kì máy quá, vậy có cách nào tuong tự mà tối ưu hơn bác, mình có thẻ dùng MPLAB SIM để xem 1 lệnh tốn bao nhiêu chu kì máy dc ko bác, và dùng như nào ah.
Thanks bác

namqn
02-01-2009, 11:40 PM
nếu em khai báo các số lớn hơn 1 là số float , sau đó dùng hàm chuyển từ float sang frac, rồi tính toán với các số frac đo, sau đó dc kết quả lại chuyển ngc lại từ frac sang float như thế có dc ko bác, em thấy 2 hàm này tốn nhiều chu kì máy quá, vậy có cách nào tuong tự mà tối ưu hơn bác, mình có thẻ dùng MPLAB SIM để xem 1 lệnh tốn bao nhiêu chu kì máy dc ko bác, và dùng như nào ah.
Thanks bác
Chuyển một số float có trị tuyệt đối > 1 sang số fractional không làm được điều kỳ diệu là nhét một số có trị tuyệt đối > 1 vào một biến fractional dùng format Q15. Nói cách khác, dù bạn dùng format nào thì con số được biểu diễn vẫn phải mang giá trị đó.

Bạn xem mục "Measuring routine execution time with the stopwatch" trong presentation trên để biết cách xác định thời gian thực thi của một lệnh. Nên dùng breakpoint ngay trước lệnh cần đo, rồi dùng Stopwatch.

Thân,

ham_hoc_hoi
03-01-2009, 09:06 AM
Chuyển một số float có trị tuyệt đối > 1 sang số fractional không làm được điều kỳ diệu là nhét một số có trị tuyệt đối > 1 vào một biến fractional dùng format Q15. Nói cách khác, dù bạn dùng format nào thì con số được biểu diễn vẫn phải mang giá trị đó.

Bạn xem mục "Measuring routine execution time with the stopwatch" trong presentation trên để biết cách xác định thời gian thực thi của một lệnh. Nên dùng breakpoint ngay trước lệnh cần đo, rồi dùng Stopwatch.

Thân,
Nói như bác thì cái hàm PID của C30 viết ra chỉ ứng với các hệ số nhỏ hon 1 hả bác, các đại luọng khác còn quy đổi về dạng tuong đối dduowcj, còn các hệ số bản thân nó cũng ko có đơn vị thì làm sao quy đổi dc.
Vậy để có dc các hệ số lơn hơn 1 thì em phải khai báo là float hả bác

namqn
03-01-2009, 07:06 PM
Nói như bác thì cái hàm PID của C30 viết ra chỉ ứng với các hệ số nhỏ hon 1 hả bác, các đại luọng khác còn quy đổi về dạng tuong đối dduowcj, còn các hệ số bản thân nó cũng ko có đơn vị thì làm sao quy đổi dc.
Vậy để có dc các hệ số lơn hơn 1 thì em phải khai báo là float hả bác
Nếu bạn tính toán trong hệ đơn vị tương đối (đặc biệt theo cách mà code mẫu của Microchip đã dùng) thì các biến điều khiển cũng thường có tầm trị giữa -1 và 1, do đó các hệ số của bộ điều khiển PID cũng thường có thể biểu diễn bằng Q15. Sao bạn không thử tính toán cho một ví dụ cụ thể mà cứ giả thiết rằng cần dùng các hệ số có tầm trị vượt khả năng của Q15?

Trong trường hợp cần dùng các hệ số vượt khả năng của Q15, bạn có thể tự viết giải thuật điều khiển PID với các tính toán được hiện thực trong hệ đơn vị tuyệt đối, và dùng các biến float.

Thân,

ham_hoc_hoi
03-01-2009, 10:30 PM
em viết đoặn mã cho PID như thế này, bác góp ý cho em có được ko nhé, em dùng công thức sai phân lùi để chuyển sang pt số

/Khai bao cac bien toan cuc cho xu lý PID
float u[2]; //u[1] là gia tri dau ra bo PID thoi diem hien tai, dc dua vao gia tri PDC1 de thay doi gia tri % duty cycle
//u[0] là gia tri dau ra bo PID thoi diem truoc do

int e[3]; //e[2] gia tri sai lech toc do tai thoi diem dang xet ( e[2] = toc do dat - toc do do dc tu encoder)

float A0,A1,A2;
float PID_P = 7, PID_I =1.3, PID_D =2.7; //cac he so Kp, Ki, Kd
//Chuong trinh khoi tao thong so PID
//------------------------------------------------------------------------------
void PID_init(void)
{
u[0] =0;
u[1] =0;
e[0] =0;
e[1] =0;
e[2] =0;

A0 = PID_P + PID_I + PID_D;
A1 = -PID_P - 2*PID_D;
A2 = PID_D;
}

//Chuong trinh xu ly ngat Timer 2 sau 10ms
//chu ki trich mau 10ms de tinh toan PID
//------------------------------------------------------------------------------
void __attribute__((__interrupt__)) _T2Interrupt(void)
{

e[2] = (ADCBUF0 >> 1) - (POSCNT*3 ); //e[2] gia tri sai lech toc do tai thoi diem dang xet
//e[2] = toc do dat - toc do do dc tu encoder
// toc do dat = ADCBUF0 >>1 (giá tri chuyen doi ADC bien tro dieu chinh toc do, lay 9 bit)
// toc do do dc tu encoder = POSCNT * 3

POSCNT = 0;

//u[n] = u[n-1] + A0*e[n] +A1*e[n-1] +A2*e[n-2]

u[1] = u[0] + e[2]*A0 + e[1]*A1 + e[0]*A2;

if (u[1] > 511) //Gioi han tren
{ u[1] = 511;}
if (u[1]<0) //Gioi han duoi
{ u[1] = 0;}

u[0] = u[1];
e[0] = e[1];
e[1] = e[2];

PDC1 = u[1];
}

conglong
21-02-2009, 09:36 AM
Bạn xem presentation sau về cách sử dụng MPLAB SIM:
http://techtrain.microchip.com/webseminars/documents/MPLABSIM_111908.pdf

Phần bạn vừa hỏi được trả lời ở mục Watchpoints. Việc mô phỏng không phụ thuộc vào việc biến được khai báo ra sao, và bạn có thể xem một biến ở format bất kỳ do bạn chọn.

Thân,
bac namqn pót lai tai liêu này cho em với được ko? em tải kô được?
cảm ơn bác nhiều lắm!

namqn
21-02-2009, 09:27 PM
bac namqn pót lai tai liêu này cho em với được ko? em tải kô được?
cảm ơn bác nhiều lắm!
Tôi gặp trục trặc trong việc upload tập tin này lên diễn đàn, bạn thử download từ đây xem có khá hơn so với từ trang web của Microchip hay không:
http://www.4shared.com/file/88780857/71859c80/MPLABSIM_111908.html

Thân,