Конвертировать 32-битное число в 16-битное

Мне нужно преобразовать число в процент от моего максимального диапазона значений ЦАП (0x0FFF), поэтому мой код для этого будет следующим:

double percent;
short pct;

percent = (0x0FFF * pct)/100;

но мне нужно 16-битное значение для отправки в ЦАП, а не 32-битное. Какой самый быстрый способ преобразовать его в 16-битное число? Могу ли я сдвинуть его?

1

Решение

Для этого нет необходимости использовать плавающую точку:

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

Другие решения

Если ваш процент имеет только 101 значение от 0 до 100, тогда гораздо быстрее использовать таблицу поиска, чем выполнять умножение / деление, особенно в микроконтроллерах, где нет аппаратных инструкций mul / div.

В большинстве микроконтроллеров имеется множество флэш-памяти / EEPROM, но не хватает оперативной памяти, поэтому таблицу можно просто сохранить в ПЗУ. Чтение таблицы из ПЗУ, вероятно, медленнее, чем из ОЗУ, но все же намного быстрее, чем деление. Однако некоторые микроконтроллеры имеют длинные циклы чтения, поэтому вам может потребоваться предварительно выбрать или загрузить таблицу в ОЗУ, если этого достаточно, или просто использовать метод умножения и деления, описанный выше. Вы также можете упаковать стол (потому что вам нужно только 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];
2

uint16_t percent;
uint16_t pct;

percent = (0x0FFFU * pct)/100U; //Gives you in unsigned 16 number.
1
По вопросам рекламы [email protected]