Code:
fooPID.controlReference = Q15(ADCBUF0 >> 1) ; // controlReference la dai luong dat
// O day la toc do dc dat tu bien tro dieu chinh toc do thong qua bo ADC
fooPID.measuredOutput = Q15(POSCNT * 0x0003) ; // measuredOutput dai luong do ve
Đây là khai báo của macro Q15 trong dsp.h
Code:
#define Q15(X) \
((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))
Q15 thực chất là biểu diễn
số thực dấu chấm tĩnh ở dạng số nguyên với 1 bit dấu và 15 bit sau dấu phẩy. Thực chất công việc này quy ước với nhau rằng dấu chấm nằm ở bên trái 15 bit, còn lại dạng biểu diễn y như số nguyên.
Macro này dùng chuyển từ số thực dấu chấm động (float, double), hoặc hằng số
trong khoảng từ -1 đến 1 - 2^(-15) sang Q15.
Mình ko hiểu tại sao bạn lại gọi
Code:
fooPID.controlReference = Q15(ADCBUF0 >> 1) ; // controlReference la dai luong dat
// O day la toc do dc dat tu bien tro dieu chinh toc do thong qua bo ADC
fooPID.measuredOutput = Q15(POSCNT * 0x0003) ; // measuredOutput dai luong do ve
Theo như công thức kết quả của phép chuyển đổi sẽ bị tràn
Bạn nên bỏ cái Q15 đi.