[問題] DSP2812積分運算問題

看板Electronics作者 (橘子布丁)時間15年前 (2010/11/10 22:59), 編輯推噓8(8050)
留言58則, 4人參與, 7年前最新討論串1/1
我寫入兩行運算積分式子如下: 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

11/11 00:02, , 1F
int 32768是他的範圍阿
11/11 00:02, 1F

11/11 00:04, , 2F
int是4 bytes = 16bits
11/11 00:04, 2F

11/11 00:05, , 3F
2^16 = 32768*2 因為正數分一半空間 負數分一半
11/11 00:05, 3F

11/11 00:06, , 4F
講這麼多廢話 把int oint_ic; 改成long oint_ic; 即可
11/11 00:06, 4F

11/11 14:11, , 5F
我想大大可能誤解我的意思嚕
11/11 14:11, 5F

11/11 14:12, , 6F
int_ic是我的變數~並不是我的宣告指令~我的宣告指令是
11/11 14:12, 6F

11/11 14:12, , 7F
float~並不是int~並且此積分並不是值的問題~因為
11/11 14:12, 7F

11/11 14:13, , 8F
不管事X2或者是/2~值會變成是32768X2或32768/2~
11/11 14:13, 8F

11/11 14:14, , 9F
會成比例的減少或者增加~所以並不是因為值的問題
11/11 14:14, 9F

11/11 14:14, , 10F
布過還是感謝大大的說明~小弟由衷感謝
11/11 14:14, 10F

11/11 22:03, , 11F
float也是4 bytes
11/11 22:03, 11F

11/11 22:04, , 12F
你把float改成double試試看吧~~
11/11 22:04, 12F

11/12 20:50, , 13F
你好好的研究浮點格式..你就會發現這是必然的現象
11/12 20:50, 13F

11/17 14:48, , 14F
把宣告float改成double~一樣無法解決此問題
11/17 14:48, 14F

11/17 14:49, , 15F
我查過浮點運算格式~2812只有兩個變數宣告float與double
11/17 14:49, 15F

11/17 14:50, , 16F
所以問題應該不是宣告格式錯誤~是其他問題~
11/17 14:50, 16F

11/17 14:50, , 17F
因此不知道問題為何?希望大大給點方向~
11/17 14:50, 17F

11/18 00:19, , 18F
2812的數值 都是16bits 你可以再給他一個進位值
11/18 00:19, 18F

11/18 00:23, , 19F
int a,b; if(a>=32768){a=0; b++;} 類似這樣
11/18 00:23, 19F

11/18 15:59, , 20F
這方法我已經測試過了~我把oint_ic積分值至15000時轉換
11/18 15:59, 20F

11/18 15:59, , 21F
另一變數oint_ic2並且將原本的積分值oint_ic歸零~
11/18 15:59, 21F

11/18 16:01, , 22F
重新計算~不過他會等於oint_ic2+oint_ic=15000+1384
11/18 16:01, 22F

11/18 16:01, , 23F
就停止運算~結果的積分計算值還是一樣~無法持續積分
11/18 16:01, 23F

11/18 16:02, , 24F
並且我在中斷副程式timer1裡加入一變數kk當我程式執行過
11/18 16:02, 24F

11/18 16:02, , 25F
一次中斷副程式KK則++~來計算進入中斷副程式有幾次~結果
11/18 16:02, 25F

11/18 16:03, , 26F
他會停止在1677220~不過ts中斷時間改變多少~kk值都相同
11/18 16:03, 26F

11/18 16:04, , 27F
因此我無法理解為何進入中斷副程式中會停止在1677220
11/18 16:04, 27F

11/18 16:05, , 28F
就不再繼續執行了~不知道大大有沒有其他方法可以解決~
11/18 16:05, 28F

11/18 16:05, , 29F
由衷感謝
11/18 16:05, 29F

11/18 19:30, , 30F
15000+1384=0X4000 沒這麼巧合的值吧
11/18 19:30, 30F

11/18 19:31, , 31F
我依然覺得是數值的問題 至於1677220只是address
11/18 19:31, 31F

11/18 19:31, , 32F
我認為不具意義 加油 我想我幫不上忙了
11/18 19:31, 32F

11/22 13:23, , 33F
oint_ic2+oint_ic=15000+1384.你是把這兩個float又加起來?
11/22 13:23, 33F

11/22 13:25, , 34F
你的ts是固定值.其實不用每次都做乘又加的動作.只要加就好
11/22 13:25, 34F

11/22 14:44, , 35F
我要把oint_ic積分後再做處理
11/22 14:44, 35F

11/22 14:45, , 36F
ts我曾經有x一個倍數~後面在除回來~但一樣有問題~
11/22 14:45, 36F

11/22 14:46, , 37F
接著我有想過用大大的方法~我寫了一個迴圈~讓counter
11/22 14:46, 37F

11/22 14:47, , 38F
數了1萬次再將進入積分式子內~也就是延遲一秒~再將回授
11/22 14:47, 38F

11/22 14:47, , 39F
物理量讀回來做處理~但是相同的問題還是存在著~無法解決
11/22 14:47, 39F

11/22 14:49, , 40F
如果是數值的問題~那麼我將除以一倍數~就應該不會有問題
11/22 14:49, 40F

11/22 14:49, , 41F
但是他會數值會隨倍數成長
11/22 14:49, 41F

11/22 14:50, , 42F
後來又測試一下次數的問題~發現執行會停止在16777220次
11/22 14:50, 42F

11/22 14:50, , 43F
不管隨倍數改變或者是利用變數取代
11/22 14:50, 43F

11/22 14:51, , 44F
依舊存在此問題~積分無法繼續累加~所以這兩個月我測試
11/22 14:51, 44F

11/22 14:52, , 45F
很多方法~還是找不到問題的所在~
11/22 14:52, 45F

11/22 14:52, , 46F
不過很感謝兩位大大~提供的方法~在下感激不盡
11/22 14:52, 46F

11/22 17:23, , 47F
好像有一個long double的可以用..64-bit
11/22 17:23, 47F

11/22 21:29, , 48F
其實你只要是用浮點就會有你的問題..用long double的話.
11/22 21:29, 48F

11/22 21:31, , 49F
只是延後這個問題的產生..不過因為可以增加很多累加次數..
11/22 21:31, 49F

11/22 21:32, , 50F
所以可以當作沒這個問題存在.long double是你的救命神丹.
11/22 21:32, 50F

11/23 11:12, , 51F
這個我試過嚕~其實一開始我的變數宣告都是short~
11/23 11:12, 51F

11/23 11:12, , 52F
如果是浮點運算的話有兩個宣告指令是float&double
11/23 11:12, 52F

11/23 11:14, , 53F
我將short改成int~然後float改成double~運算結果
11/23 11:14, 53F

11/23 11:14, , 54F
還是一樣~並沒有什麼改變~看樣子好像跟變數宣告長度無關
11/23 11:14, 54F

08/13 19:05, , 55F
oint_ic2+oi https://muxiv.com
08/13 19:05, 55F

09/17 23:00, , 56F
如果是數值的問題~那麼 https://daxiv.com
09/17 23:00, 56F

11/11 16:01, , 57F
但是他會數值會隨倍數成 https://daxiv.com
11/11 16:01, 57F

01/04 22:14, 7年前 , 58F
不管事X2或者是/2~ https://daxiv.com
01/04 22:14, 58F
文章代碼(AID): #1CshDXrD (Electronics)