Показать сообщение отдельно
Старый 07.02.2017, 16:44   #8 (permalink)
ingkulibin
Member
 
Аватар для ingkulibin
 
Регистрация: 07.02.2017
Адрес: СССР
Сообщений: 65
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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, в них найдете все необходимые примеры.
ingkulibin вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070