Открыта Формула Экспоненты В Управлении

Мне наконец удалось при помощи Д. Заточника, показавшего график в eclipse’овской доке, восстановить формулу экспоненты в управлении. В данном контексе - экспонента - это функция изменения выходного сигнала в зависимости от входного и установленных % (параметра экспоненты).
Все расчеты выполнены в Excel’е, который содержит макрос заполнения таблицы для графика. Знак “-” у экспоненты подразумевается и опущен (другие меня не интерисуют).
Лист 1 - таблица зависимости выхода от входа при разных % экспоненты,
Лист 2 - таблица отклонения от линейного закона зависимости выхода от входа,
Лист 3 - график для листа 1,
Лист 4 - график для листа 2.

Графики экспоненты (легенда - % экспоненты):
Графики отличия экспоненты от линейного закона (легенда - % экспоненты):
Excel исходник: Exponent1.rar

А теперь формула:
(вспомогательный коэффициент экспоненты, зависящий от %) A=10^( (2^(%/25))/4 )
(Вход Y от выхода X) Y=100*((A^(X/100))-1)/(A-1)
(X и Y меняются от 0 до 100)

  • 2980
Comments
ЮНИОР

Работа проделана большая 😃, осталось только понять для чего на практике нужна полученная формула. 😛

Prikupets
ЮНИОР

Работа проделана большая 😃, осталось только понять для чего на практике нужна полученная формула. 😛

У меня аппаратура без экспоненты. Вот добавлю ее к себе в передатчик. И все 😋

toxa

На мой взгляд, в вашей формуле есть ряд недостатков. Хотя, конечно, смотря для чего вы хотите ее использовать. Если исходить из практики, то:

  1. Х меняется только в положительную сторону. А как же отрицательный ход ручки относительно нейтрали?
  2. Х меняется 0 до 100. Если это 100 дискретных отсчетов, то точность позиционирования ручки маловата. Если Х может принимать дробные значения, то это не совсем удобно и долго вычислять.
  3. Использование floating-point арифметики. Может лучше применить целочисленную арифметику? А то все это не очень удобно и долго: возведение в дробную степень и все такое прочее.
Prikupets
toxa

На мой взгляд, в вашей формуле есть ряд недостатков. Хотя, конечно, смотря для чего вы хотите ее использовать. Если исходить из практики, то:

  1. Х меняется только в положительную сторону. А как же отрицательный ход ручки относительно нейтрали?
  2. Х меняется 0 до 100. Если это 100 дискретных отсчетов, то точность позиционирования ручки маловата. Если Х может принимать дробные значения, то это не совсем удобно и долго вычислять.
  3. Использование floating-point арифметики. Может лучше применить целочисленную арифметику? А то все это не очень удобно и долго: возведение в дробную степень и все такое прочее.

Все просто 😃 X в отрицательную сторону меняется тоже - функция управления (для моих нужд) симметричная относительно начала отсчета, так что Y тоже меняется в отрицательную сторону. Только я в формулу не стал вводить sign(x) * | F(X) |, чтобы не усложнять.

X меняется от 0 до 100 в процентах от максимального отклонения. Понятно, что надо будет это смаштабировать под разницу между макс. и средним сервоимпульсом в каких нибудь временных единицах (мс, отсчетах таймера контроллера и т.д.).

Арифметика используется только в Excel. В контроллер будет забиваться таблица для пары-тройки ходовых экспонент и выбираться одна из них. Значения между отсчетами добываются интерполяцией.

toxa
Prikupets

Только я в формулу не стал вводить sign(x) * | F(X) |, чтобы не усложнять.

Я понял, это некая приблизительная математическая модель.

Prikupets

X меняется от 0 до 100 в процентах от максимального отклонения. Понятно, что надо будет это смаштабировать под разницу между макс. и средним сервоимпульсом в каких нибудь временных единицах (мс, отсчетах таймера контроллера и т.д.).

Не очень хорошая идея.

Я советую полностью заменить существующий кодер новым, своим.

Prikupets

В контроллер будет забиваться таблица для пары-тройки ходовых экспонент и выбираться одна из них. Значения между отсчетами добываются интерполяцией.

Тоже не очень хорошая идея.

Расчет F(X) в контроллере лучше делать немного не так. Вы все правильно придумали про табличное вычисление. Только надо забивать не пару-тройку ходовых экспонент, а вычислять, скажем, 32 отсчета в каждую сторону непосредственно ПОСЛЕ ВВОДА значения экспоненты. Зашли в сетап, изменили экспоненту - новые отсчеты один раз пересчитались для введенного значения экспоненты. Дальше табличное вычисление. Интерполяцию, если ручка находится между отсчетами, можно делать линейную, но лучше по параболе по трем точкам. Могу покопаться, найти целочисленную формулу.

Prikupets
toxa

Я советую полностью заменить существующий кодер новым, своим.

Может так и проще в итоге будет. Пока мне не хотелось бы влезать в дебри с АЦП, обработкой реверса и т.д. Времени не хватает.

toxa

Расчет F(X) в контроллере лучше делать немного не так. Вы все правильно придумали про табличное вычисление. Только надо забивать не пару-тройку ходовых экспонент, а вычислять, скажем, 32 отсчета в каждую сторону непосредственно ПОСЛЕ ВВОДА значения экспоненты. Зашли в сетап, изменили экспоненту - новые отсчеты один раз пересчитались для введенного значения экспоненты. Дальше табличное вычисление. Интерполяцию, если ручка находится между отсчетами, можно делать линейную, но лучше по параболе по трем точкам. Могу покопаться, найти целочисленную формулу.

Памяти ОЗУ в контроллере PIC16F84 64 байта. Рассчитанную эксп туда не засунешь. Есть еще EPROM, но оно медленное. Ничего кроме PIC’ов я не знаю. Да и в других новых 18pin моделях может и чуть больше памяти - погоды это не сделает. Так что единственный способ - положить табулированные значения в ПЗУ.

toxa
Prikupets

Памяти ОЗУ в контроллере PIC16F84 64 байта. Рассчитанную эксп туда не засунешь.

С этого и надо было начинать. 😃

Prikupets

Есть еще EPROM, но оно медленное.

Медленное по записи, по чтению вроде то же самое. Если реализовать интерполяцию по параболе, то хватит даже по пять точек в каждую сторону.

Prikupets

Ничего кроме PIC’ов я не знаю.

Возьмите какой-нибудь простенький atmel и пишите на си. Все ассемблеры не выучишь. 😃

Prikupets

Так что единственный способ - положить табулированные значения в ПЗУ.

Боюсь что если так, то и формулу было выводить не надо, можно было просто от руки нужные линии начертить. 😁