作者yan760422 (橘子布丁)
看板Electronics
標題[問題] DSP2812積分運算問題
時間Wed Nov 10 22:59:42 2010
我寫入兩行運算積分式子如下:
ts=200e-6;
oIo=5;
int_ic=oint_ic+oIo*ts;
oint_ic=int_ic;
大約經過56分鐘過後
oint_ic的值=32768
無法再繼續積分下去
不管是將電流或者是中斷時間ts以倍數的方式除掉
比如將中斷時間減少一倍,會電流縮小一倍
積分的值也會縮小一倍變成16384
或者寫入延遲時間讀入計算
比如中斷時間本來是200us取一個電流值
改成兩次在讀入回圈中
電流積分值也會縮小1倍
因此電流積分值oint_ic都會積分至一固定值就會停止
無法在運算下去
不知道有沒有大大有遇過這問題
衷心有人可以解答
這問題已經困擾我兩個月嚕~
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.138.180.32
1F:推 joy830:int 32768是他的範圍阿 11/11 00:02
2F:→ joy830:int是4 bytes = 16bits 11/11 00:04
3F:→ joy830:2^16 = 32768*2 因為正數分一半空間 負數分一半 11/11 00:05
4F:→ joy830:講這麼多廢話 把int oint_ic; 改成long oint_ic; 即可 11/11 00:06
5F:→ yan760422:我想大大可能誤解我的意思嚕 11/11 14:11
6F:→ yan760422:int_ic是我的變數~並不是我的宣告指令~我的宣告指令是 11/11 14:12
7F:→ yan760422:float~並不是int~並且此積分並不是值的問題~因為 11/11 14:12
8F:→ yan760422:不管事X2或者是/2~值會變成是32768X2或32768/2~ 11/11 14:13
9F:→ yan760422:會成比例的減少或者增加~所以並不是因為值的問題 11/11 14:14
10F:→ yan760422:布過還是感謝大大的說明~小弟由衷感謝 11/11 14:14
11F:→ joy830:float也是4 bytes 11/11 22:03
12F:→ joy830:你把float改成double試試看吧~~ 11/11 22:04
13F:推 utility:你好好的研究浮點格式..你就會發現這是必然的現象 11/12 20:50
14F:→ yan760422:把宣告float改成double~一樣無法解決此問題 11/17 14:48
15F:→ yan760422:我查過浮點運算格式~2812只有兩個變數宣告float與double 11/17 14:49
16F:→ yan760422:所以問題應該不是宣告格式錯誤~是其他問題~ 11/17 14:50
17F:→ yan760422:因此不知道問題為何?希望大大給點方向~ 11/17 14:50
18F:推 joy830:2812的數值 都是16bits 你可以再給他一個進位值 11/18 00:19
19F:推 joy830:int a,b; if(a>=32768){a=0; b++;} 類似這樣 11/18 00:23
20F:→ yan760422:這方法我已經測試過了~我把oint_ic積分值至15000時轉換 11/18 15:59
21F:→ yan760422:另一變數oint_ic2並且將原本的積分值oint_ic歸零~ 11/18 15:59
22F:→ yan760422:重新計算~不過他會等於oint_ic2+oint_ic=15000+1384 11/18 16:01
23F:→ yan760422:就停止運算~結果的積分計算值還是一樣~無法持續積分 11/18 16:01
24F:→ yan760422:並且我在中斷副程式timer1裡加入一變數kk當我程式執行過 11/18 16:02
25F:→ yan760422:一次中斷副程式KK則++~來計算進入中斷副程式有幾次~結果 11/18 16:02
26F:→ yan760422:他會停止在1677220~不過ts中斷時間改變多少~kk值都相同 11/18 16:03
27F:→ yan760422:因此我無法理解為何進入中斷副程式中會停止在1677220 11/18 16:04
28F:→ yan760422:就不再繼續執行了~不知道大大有沒有其他方法可以解決~ 11/18 16:05
29F:→ yan760422:由衷感謝 11/18 16:05
30F:推 joy830:15000+1384=0X4000 沒這麼巧合的值吧 11/18 19:30
31F:→ joy830:我依然覺得是數值的問題 至於1677220只是address 11/18 19:31
32F:→ joy830:我認為不具意義 加油 我想我幫不上忙了 11/18 19:31
33F:推 utility:oint_ic2+oint_ic=15000+1384.你是把這兩個float又加起來? 11/22 13:23
34F:→ utility:你的ts是固定值.其實不用每次都做乘又加的動作.只要加就好 11/22 13:25
35F:→ yan760422:我要把oint_ic積分後再做處理 11/22 14:44
36F:→ yan760422:ts我曾經有x一個倍數~後面在除回來~但一樣有問題~ 11/22 14:45
37F:→ yan760422:接著我有想過用大大的方法~我寫了一個迴圈~讓counter 11/22 14:46
38F:→ yan760422:數了1萬次再將進入積分式子內~也就是延遲一秒~再將回授 11/22 14:47
39F:→ yan760422:物理量讀回來做處理~但是相同的問題還是存在著~無法解決 11/22 14:47
40F:→ yan760422:如果是數值的問題~那麼我將除以一倍數~就應該不會有問題 11/22 14:49
41F:→ yan760422:但是他會數值會隨倍數成長 11/22 14:49
42F:→ yan760422:後來又測試一下次數的問題~發現執行會停止在16777220次 11/22 14:50
43F:→ yan760422:不管隨倍數改變或者是利用變數取代 11/22 14:50
44F:→ yan760422:依舊存在此問題~積分無法繼續累加~所以這兩個月我測試 11/22 14:51
45F:→ yan760422:很多方法~還是找不到問題的所在~ 11/22 14:52
46F:→ yan760422:不過很感謝兩位大大~提供的方法~在下感激不盡 11/22 14:52
47F:推 utility:好像有一個long double的可以用..64-bit 11/22 17:23
48F:推 utility:其實你只要是用浮點就會有你的問題..用long double的話. 11/22 21:29
49F:→ utility:只是延後這個問題的產生..不過因為可以增加很多累加次數.. 11/22 21:31
50F:→ utility:所以可以當作沒這個問題存在.long double是你的救命神丹. 11/22 21:32
51F:→ yan760422:這個我試過嚕~其實一開始我的變數宣告都是short~ 11/23 11:12
52F:→ yan760422:如果是浮點運算的話有兩個宣告指令是float&double 11/23 11:12
53F:→ yan760422:我將short改成int~然後float改成double~運算結果 11/23 11:14
54F:→ yan760422:還是一樣~並沒有什麼改變~看樣子好像跟變數宣告長度無關 11/23 11:14