簡體   English   中英

將32位數字轉換為16位

[英]Convert a 32-bit number to 16-bit

我需要將數字轉換為DAC最大值(0x0FFF)的百分比,因此我的代碼將如下所示:

double percent;
short pct;

percent = (0x0FFF * pct)/100;

但是我需要一個16位的值才能發送到DAC,而不是32位的值。 將其轉換為16位數字的最快方法是什么? 我可以移進去嗎?

無需為此使用浮點數:

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

如果您的百分比只有0到100之間的101個值,那么使用查找表比進行乘法/除法要快得多,尤其是在沒有硬件mul / div指令的微控制器中。

大多數MCU具有大量可用的閃存/ EEPROM,但缺少RAM,因此該表只能保存在ROM中。 從ROM讀取表的速度可能比從RAM讀取的速度慢,但比進行除法仍然快得多。 但是,有些MCU的讀取周期很長,因此如果有足夠的話,您可能需要預取表或將表加載到RAM中,或者僅使用上面的乘除法。 您還可以打包表(因為只需要12位)或執行其他操作

#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];
uint16_t percent;
uint16_t pct;

percent = (0x0FFFU * pct)/100U; //Gives you in unsigned 16 number.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM