Цитата:
Сообщение от wintechn
Вкратце в чем суть:
Есть физический процесс которым необходимо управлять, а для его контроля используется три измерительных датчика.
На основании показаний датчиков формируется два управляющих сигнала (которые определяются при помощи вычисления математических формул), а также необходимо производить индикацию определенных параметров.
Проблем с индикацией и формированием одного из двух управляющих сигналов нет.
А вот со вторым управляющим сигналом есть проблемы потому как диапазон управления лежит в диапазоне (0 . . . 10) В с дискретностью 10 мВ, да и зависимость нелинейная.
|
Так и проблем то особых я не вижу.
Изначально задаемся, что имеем дело с числами с фиксированной частотой (я думаю так будет проще).
Если максимальный результат вычислений в отношении к целы лежит в пределах от 0 до 10, то, понятно, что достаточно
одного байта для целых.
Например, его можно определить ячейкой памяти данных 30h
А судя из дискретности то, для отображения дробной части, также с головой хватит
одного байта.
К продолжения примера, его можно определить ячейкой памяти данных 31h
Выполнение операций суммирования и вычитания тогда следует производить как для двухбайтных чисел.
В случае умножения также проблем никаких не вижу, достаточно использовать процедуру MUL AB: к примеру есть два числа X,x и Y,y (в приведенном обозначении большие буквы соответствуют целым а маленькие дробным) то всего навсего достаточно определить сумму по частным производным:
X*Y + X*y + Y*x + x*y. Тогда, частные производные:
X*Y - дают целые части ;
X*y и
Y*x - дают старший байт целую часть, а младший байт дробную часть;
x*y - дает два байта дробной части, если достаточно точности до сотых, то младшую часть произведения можно просто откинуть.
В случае деления, его следует производить по всем правилам деления как и для целых чисел.
Касательно преобразования двоичного кода числа с фиксированной запятой в двоично-десятичное, то целые определяются путем двукратного деления байта целых на 10 (первое деление дает единицы, а второе сотни) (а в случае что итоговый результат как я понял не превышает 10 то второе деление и не нужно вообще). А дробная часть получается путем умножения байта дроби на 10, каждое такое умножение дает последующие значения десятые, сотые, тысячные и т. д..
А вообще можете изучить следующие книги по 51-м микроконтроллерам: Боборыкин А. В. Однокристальные микроЭВМ; Каспер Э. Программирование на языке Ассемблера для микроконтроллеров семейства i8051, в них найдете все необходимые примеры.