2013-05-13 166 views
1

我需要將數字轉換到我的DAC最大值範圍變點(0x0FFF)的百分比,所以我的代碼,這樣做會是這樣:轉換一個32位的數字爲16位,

double percent; 
short pct; 

percent = (0x0FFF * pct)/100; 

但我需要一個發送給DAC的16位值不是32位。什麼是將其轉換爲16位數的最快方法?我可以將它移入嗎?

+0

只要將'percent'聲明爲'uint16_t'?計算是在'int'類型完成的,所以除非你的int小於20位,否則它不會溢出。對於16位'int',可以使用'0x0FFFul'來避免溢出。 – 2013-05-13 14:20:21

+0

@DanielFischer,它們可能非常寬16位(實際上,在談論DAC的大多數平臺上它們都是有意義的)。 – avakar 2013-05-13 14:22:30

回答

10

沒有必要使用浮點此:

uint16_t val = 0x0fffU * pct/100U; // convert 0..100 value to 0..4095 
+0

謝謝!這是蜱! – 2013-05-13 14:30:14

2

如果您的比例從0-100只是101值,那麼它的速度更快使用查找表不僅僅是一個乘法/除法。大多數微控制器都有大量的閃存/ EEPROM,但缺少RAM,因此表格只能保存在ROM中。大多數時間從ROM中讀取表格仍然比乘法/除法更快。然而,一些微控制器具有較長的讀取週期,所以如果有足夠的或者簡單地使用上述乘法和除法方法,您可能需要預先計算或將表格加載到RAM中。

#define PCT(n) (0x0fffU * (n)/100U) 

#define PCTROW(n) (PCT(10*n), PCT(10*n+1), PCT(10*n+2), PCT(10*n+3), PCT(10*n+4),\ 
        PCT(10*n+5), PCT(10*n+6), PCT(10*n+7), PCT(10*n+8), PCT(10*n+9)) 

const uint16_t percent_tbl[] = {PCTROW(0), PCTROW(1), PCTROW(2), PCTROW(3), PCTROW(4), 
           PCTROW(5), PCTROW(6), PCTROW(7), PCTROW(8), PCTROW(9), 0x0fffU} 

return percent_tbl[pct]; 
相關問題