|
Tài trợ cho PIC Vietnam |
dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC |
|
Ðiều Chỉnh | Xếp Bài |
12-11-2008, 10:27 AM | #1 |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Một câu hỏi về tính toán với kiểu dữ liệu fractional trong dspic.
Hi,
Giả sử em khai báo 3 biến a1, b1, c1 kiểu fractional 3 biến a2, b2, c2 kiểu float. Lưu giá trị thu được từ ADC (định dạng fractional) vào 2 biến a1 và b1 Thực hiện câu lệnh : Code:
a2=Fract2Float(a1); b2=Fract2Float(b1); Tiếp theo em thực hiện : Code:
c1=a1*b1; c2=a2*b2; Mong sự giúp đỡ của mọi người. Cảm ơn rất nhiều. |
12-11-2008, 04:13 PM | #2 | |
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
12-11-2008, 10:25 PM | #3 |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Cảm ơn anh Nam,
Em đã thử và kết quả là không đúng. Chắc có lẽ vì khi thực hiện 2 phép nhân kiểu Float thì giá trị phải lưu ở dạng 32bits trong khi đó kiểu Float chỉ lưu 16 bits. Như vậy muốn thực hiện phép nhân 2 số hạng kiểu Fractional, trước tiên phải đổi sang Float trước sau đó mới nhân 2 số Float đó rồi đổi kết quả từ Float sang Fractional lại mới chính xác được. |
13-11-2008, 04:40 PM | #4 |
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
: |
Mình đã tìm trên mạng 1 tài liệu và nó đã chỉ cho cách thức giải quyết vấn đề trên như sau:
- Lấy 2 số fractional a1*a2 được kết quả là 1 số 32 bits. - Nhân kết quả trên với 0x2 - Kết quả chính xác dạng fractional của phép nhân trên sẽ là 16 bits cao nhất của kết quả sau khi nhân với 0x2. Ví dụ : Code:
Ta có : a1=0.5 lưu theo dạng fractional là 0x4000 b1=0.75 lưu theo dạng fractional là 0x6000 thực hiện a1 * b1 được kết quả 32bits =0x18000000 ta tiếp tục nhân kết quả đó với 0x2 được 0x30000000 và kết quả fractional của biểu thức a1*b1 là 3000 (chính là 0.375). |
13-11-2008, 04:54 PM | #5 |
Trưởng lão PIC bang
|
Nhân hai số ở format 1.15 sẽ được một số ở format 2.30. Nhân 0x2 tức là dịch trái 1 bit sẽ cho kết quả ở format 1.31. Chỉ lấy 16 bit cao nhất sẽ cho kết quả ở format 1.15.
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|