我需要将一个数字转换为我的 DAC 最大值 (0x0FFF) 的百分比,所以我的代码是这样的:
double percent;
short pct;
percent = (0x0FFF * pct)/100;
但我需要一个 16 位的值来发送到 DAC 而不是 32 位的值。将其转换为 16 位数字的最快方法是什么?我可以转移它吗?
我需要将一个数字转换为我的 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.