會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





8bit PIC 數值乘除換算問題
新會員
註冊日期:
2016/05/03 21:00
所屬群組:
註冊會員
文章: 18
等級: 2; EXP: 97
HP : 0 / 49
MP : 6 / 187
離線
各位先進大家好,真不好意思又來提問了,數值換算與執行速度的關係還不太清楚

我用的8位元的PIC16F687

我有個計數值是0~1024,我需要把比率轉換成0~450在顯示在七段顯示器上
但1024/450=2.275555....除不盡
或450/1024=0.439453125

unsigned int Value; //0~1024
unsigned int show_Value // 0~450

第一個問題:
如果我用 show_Value=Value/(1024/450); 這樣除不進的對程式會有什麼影響嗎?

第二個問題:
show_Value=Value/2.7555; 小數可以用到幾位數 有沒有什麼限制呢?

第三個問題:
我有聽別人講過用左移右移的方式去處理程式可以運行的比較順,但是原因不是很清楚
但我的Value最大值不一定都是1024 有時因每台機械結構的誤差會是1030或1020
所以無法用左移右移的方式去乘除,那有沒有更好的方式呢?

因為我程式有做一些彈跳處理去濾波,我用正常PLUS數直接顯示 0~1024都很穩定
但我僅加入倍率換算後,又出現漏Plus的問題,但只要倍率換算這行拿掉又正常xd
(測試時用的是:show_Value=Value/2.755;)

1月19日 20:01:34
轉換PDF檔 列印


Re: 8bit PIC 數值乘除換算問題
中級會員
註冊日期:
2014/06/15 23:13
所屬群組:
註冊會員
文章: 59
等級: 6; EXP: 55
HP : 0 / 138
MP : 19 / 1289
離線
引用:

a780917a 寫道:
各位先進大家好,真不好意思又來提問了,數值換算與執行速度的關係還不太清楚

我用的8位元的PIC16F687

我有個計數值是0~1024,我需要把比率轉換成0~450在顯示在七段顯示器上
但1024/450=2.275555....除不盡
或450/1024=0.439453125

unsigned int Value; //0~1024
unsigned int show_Value // 0~450

第一個問題:
如果我用 show_Value=Value/(1024/450); 這樣除不進的對程式會有什麼影響嗎?
因為是整數, 所以小數點的值就會被捨棄, 比如算出來的值是100.5,
那show_Value只會是100


第二個問題:
show_Value=Value/2.7555; 小數可以用到幾位數 有沒有什麼限制呢?
這個我不是很清楚...基本上很少用到除法

第三個問題:
我有聽別人講過用左移右移的方式去處理程式可以運行的比較順,但是原因不是很清楚
但我的Value最大值不一定都是1024 有時因每台機械結構的誤差會是1030或1020
所以無法用左移右移的方式去乘除,那有沒有更好的方式呢?
有另一種做法是, 先將要除的值除完再*2的倍數, 最後位移..
ex. Show_Value = Value/2.7555 = Value * 0.3629
0.3629 * 2^7 = 46(小數捨去)
所以寫法就是 Show_Value = (Value * 46) >> 7;
還是會有誤差, 不過速度快多了...
移7次是可以調的, 也可以移8.9.10...愈大誤差愈小, 但愈慢


因為我程式有做一些彈跳處理去濾波,我用正常PLUS數直接顯示 0~1024都很穩定
但我僅加入倍率換算後,又出現漏Plus的問題,但只要倍率換算這行拿掉又正常xd

因為除法太慢了

(測試時用的是:show_Value=Value/2.755;)

1月20日 09:29:53
轉換PDF檔 列印


Re: 8bit PIC 數值乘除換算問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14049
等級: 72; EXP: 35
HP : 1070 / 1783
MP : 4683 / 69353
離線
感謝 mggpys 網大的回覆。

綜合來看你的問題,數學算法是沒有錯的,怪只怪在 8-bit MCU 心有餘而力不足。

舉例來說 : show_Value=Value/2.755;) 這是個浮點運算方式,MCU 會因做浮點運算而跑得氣喘吁吁。我的做法是如過要算到小數第三位,我就會將 Value x 1000 同時 2.755 也乘上 1000。注意一下數值的 promotion 需使用 long 的格式來接資料。也就是使用整數方式來取代浮點數的運算。最後算出來的整數結果看需要取值到哪裡再用除法或移位或用捨棄法取得你要的值。

1月20日 10:45:57
轉換PDF檔 列印


Re: 8bit PIC 數值乘除換算問題
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 935
等級: 27; EXP: 21
HP : 0 / 655
MP : 311 / 19549
離線
一般通用的加速方法
把浮點數算運,換成整數(移位)算運...

以 1024 => 450 為例

基本上 就 1024 * N = 450

1. 標準方式 N=0.439453 (浮點數)
標準方式也是大家第一個會想到的方式...
N = 450/1024 = 0.439453

2. 整數運算加速方法
N = K / 2^M
N = K ,再右移M位
剛好本例的除法本身就是 2^M
N = 450 /1024 (1024本身就2^10)
N = 225 /512 (512 = 2^9)

最後變成

show_value = value *225 / 512;
show_value = (value *225) >> 9;
需要四捨五入的話
show_value = (value *225 + 256) >> 9;

1月20日 14:23:57
_________________
程式是
依照寫出來(的code),跑出結果
不是依照你想出來的,得到結果

先有需求規格 後有解決方案
轉換PDF檔 列印


Re: 8bit PIC 數值乘除換算問題
中級會員
註冊日期:
2014/06/15 23:13
所屬群組:
註冊會員
文章: 59
等級: 6; EXP: 55
HP : 0 / 138
MP : 19 / 1289
離線
引用:

Ryang 寫道:
感謝 mggpys 網大的回覆。

綜合來看你的問題,數學算法是沒有錯的,怪只怪在 8-bit MCU 心有餘而力不足。

舉例來說 : show_Value=Value/2.755;) 這是個浮點運算方式,MCU 會因做浮點運算而跑得氣喘吁吁。我的做法是如過要算到小數第三位,我就會將 Value x 1000 同時 2.755 也乘上 1000。注意一下數值的 promotion 需使用 long 的格式來接資料。也就是使用整數方式來取代浮點數的運算。最後算出來的整數結果看需要取值到哪裡再用除法或移位或用捨棄法取得你要的值。



Ryang大,
如果*1000, 要再除回來, 不也是需要用到除法嗎???
這樣比起位移是否較慢?

1月20日 16:47:27
轉換PDF檔 列印


Re: 8bit PIC 數值乘除換算問題
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1155
等級: 29; EXP: 72
HP : 0 / 718
MP : 385 / 27438
離線
這麼好算居然寫成這樣,這樣的條件 8bit mcu 游刃有餘



a/1024 *450 =

a*450*64/1024/64

=a*28800/65536

=a* 0x7080 /0x10000

=a*0x7080 >>16 (最後兩byte 不取)

只要2byte *2byte 取前兩byte 即可

1月20日 17:33:32
轉換PDF檔 列印


Re: 8bit PIC 數值乘除換算問題
資深會員
註冊日期:
2009/10/13 22:29
來自 Taiwan
所屬群組:
註冊會員
文章: 163
等級: 11; EXP: 82
HP : 0 / 270
MP : 54 / 6207
離線
記憶體如果夠的話,直接用查表的方式。

1月20日 17:36:27
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
2017 Summer Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project