[an error occurred while processing this directive]
|
Допустим, есть у тебя 10-битный АЦП, который при входном напряжении, равном опорному (5 вольт) дает максимальный код, т.е. 1023. Тебе нужно представить это значение в виде 5.000 вольт. Десятичную точку поставишь потом там, где надо, а пока определи, что надо делать с отсчетом АЦП. Это просто - раз из 1023 нужно получить 5000, то надо решить уравнение 1023*x=5000, что дает x=5000/1023. Финт в том, что X НЕ НАДО приводить к виду X = 4.8875855, а использовать как есть - сначала отсчет АЦП умножить на 5000, затем полученное значение разделить на 1023. Так как команда деления в МК, как правило, либо отсутствует, либо выполняется долго, то гораздо эффективнее использовать команду сдвига - ведь 1023 = 1024-1, а 1024 = 2^10. Поэтому надо пересчитать коэффициент так, чтобы в знаменателе оказалось 1024 (а еще лучше - 256, чтобы вместо сдвига просто брать старшие байты). Вот и решаем пропорцию - 5000/1023=Y/1024, получая Y=(1024*5000)/1023~=5005. Теперь нужно умножить отсчет АЦП на Y - 1023*5005=5120115, и разделить это число на 1024 (то есть сдвинуть его на 10 бит вправо) - 5120115 >> 10 = 5000, что и требовалось.
В зависимости от типа и разрядности МК операции умножения и сдвига можно и нужно делать наиболее эффективным способом, например:
Отсчет АЦП = 1023 = 0x03FF
Множитель = 5005 = 0x138D
Произведение = 5120115 = 0x004E2073
Результат = 0x004E2073 >> 10 = 0x00001388, берем младшее слово 0x1388 = 5000.
Вместо >> 10 и взятия результата из младшего слова можно применить << 6 и взятие результата из старшего слова:
Результат = 0x004E2073 << 6 = 0x13881CC0, берем старшее слово 0x1388 = 5000.
Не забывай, что какие бы ты вычисления ни делал - с плавающей запятой или целочисленные - в результате всегда будет присутствовать дискретность входного квантования, умноженная на коэффициент масштабирования. Шаг твоего АЦП составляет порядка 5 милливольт (точнее 4.88769), соответственно, он и отразится в выходном результате - значению 5000 будет предшествовать не 4999, а 4995, а неизбежная ошибка округления/отсечения будет проявляться в том, что каждый К-тый шаг будет на единицу больше или меньше остальных. К можно посчитать как 1/(ШАГокругл-ШАГточн) = 1/(5-4.88769) ~= 8.9 ~ 9, т.е. каждый 8-й (иногда 9-й) шаг будет не в 5, а в 4 единицы