Bạn đừng quan tâm tới Q15 hay frac, trình dịch coi nó là số nguyên cả.
Ở code mẫu có thể coi như gần đúng là tất cả các hệ số Kp, Kd, Ki của nó được nhân với 2^15, khi đó thay vì làm việc với các số trong khoảng (-1, 0.9999) nó làm việc với các số từ -32768 đến 32767.
Giá trị tham khảo (ref), và giá trị lấy mẫu (e) của bạn ko nằm trong vùng (-1, 0.9999) nên bạn ko thể dùng Q15(ref) hoặc Q15(e).
Theo như cách tính của bạn, ADC 10bit
Giá trị ref maximum = 9bit = 511. Với thời gian lấy mẫu là 10ms điều này có nghĩa là bạn yêu cầu motor quay 511 hoặc 511/2 hoặc 511/4 xung encoder trong 10ms (tùy cấu hình bộ QEI, mình ko rành QEI của dsPIC) hay 511, 255.5, 127.75 vòng/giây nếu encoder 100 xung!
Thực hiện điều khiển vận tốc đc bằng PID khá đơn giản, hoàn toàn có thể dùng 16F877A để thực hiện với thời gian lấy mẫu 10ms. Bạn nên tự viết code, đọc/sửa code mẫu có khi còn lâu hơn tự viết.
Bạn nên tham khảo về PID ở đây
http://www.picvietnam.com/forum/showthread.php?t=485