Мне наконец удалось при помощи Д. Заточника, показавшего график в 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)
Работа проделана большая 😃, осталось только понять для чего на практике нужна полученная формула. 😛
Работа проделана большая 😃, осталось только понять для чего на практике нужна полученная формула. 😛
У меня аппаратура без экспоненты. Вот добавлю ее к себе в передатчик. И все 😋
На мой взгляд, в вашей формуле есть ряд недостатков. Хотя, конечно, смотря для чего вы хотите ее использовать. Если исходить из практики, то:
Х меняется только в положительную сторону. А как же отрицательный ход ручки относительно нейтрали?
Х меняется 0 до 100. Если это 100 дискретных отсчетов, то точность позиционирования ручки маловата. Если Х может принимать дробные значения, то это не совсем удобно и долго вычислять.
Использование floating-point арифметики. Может лучше применить целочисленную арифметику? А то все это не очень удобно и долго: возведение в дробную степень и все такое прочее.
На мой взгляд, в вашей формуле есть ряд недостатков. Хотя, конечно, смотря для чего вы хотите ее использовать. Если исходить из практики, то:
Х меняется только в положительную сторону. А как же отрицательный ход ручки относительно нейтрали?
Х меняется 0 до 100. Если это 100 дискретных отсчетов, то точность позиционирования ручки маловата. Если Х может принимать дробные значения, то это не совсем удобно и долго вычислять.
Использование floating-point арифметики. Может лучше применить целочисленную арифметику? А то все это не очень удобно и долго: возведение в дробную степень и все такое прочее.
Все просто 😃 X в отрицательную сторону меняется тоже - функция управления (для моих нужд) симметричная относительно начала отсчета, так что Y тоже меняется в отрицательную сторону. Только я в формулу не стал вводить sign(x) * | F(X) |, чтобы не усложнять.
X меняется от 0 до 100 в процентах от максимального отклонения. Понятно, что надо будет это смаштабировать под разницу между макс. и средним сервоимпульсом в каких нибудь временных единицах (мс, отсчетах таймера контроллера и т.д.).
Арифметика используется только в Excel. В контроллер будет забиваться таблица для пары-тройки ходовых экспонент и выбираться одна из них. Значения между отсчетами добываются интерполяцией.
Только я в формулу не стал вводить sign(x) * | F(X) |, чтобы не усложнять.
Я понял, это некая приблизительная математическая модель.
X меняется от 0 до 100 в процентах от максимального отклонения. Понятно, что надо будет это смаштабировать под разницу между макс. и средним сервоимпульсом в каких нибудь временных единицах (мс, отсчетах таймера контроллера и т.д.).
Не очень хорошая идея.
Я советую полностью заменить существующий кодер новым, своим.
В контроллер будет забиваться таблица для пары-тройки ходовых экспонент и выбираться одна из них. Значения между отсчетами добываются интерполяцией.
Тоже не очень хорошая идея.
Расчет F(X) в контроллере лучше делать немного не так. Вы все правильно придумали про табличное вычисление. Только надо забивать не пару-тройку ходовых экспонент, а вычислять, скажем, 32 отсчета в каждую сторону непосредственно ПОСЛЕ ВВОДА значения экспоненты. Зашли в сетап, изменили экспоненту - новые отсчеты один раз пересчитались для введенного значения экспоненты. Дальше табличное вычисление. Интерполяцию, если ручка находится между отсчетами, можно делать линейную, но лучше по параболе по трем точкам. Могу покопаться, найти целочисленную формулу.
Я советую полностью заменить существующий кодер новым, своим.
Может так и проще в итоге будет. Пока мне не хотелось бы влезать в дебри с АЦП, обработкой реверса и т.д. Времени не хватает.
Расчет F(X) в контроллере лучше делать немного не так. Вы все правильно придумали про табличное вычисление. Только надо забивать не пару-тройку ходовых экспонент, а вычислять, скажем, 32 отсчета в каждую сторону непосредственно ПОСЛЕ ВВОДА значения экспоненты. Зашли в сетап, изменили экспоненту - новые отсчеты один раз пересчитались для введенного значения экспоненты. Дальше табличное вычисление. Интерполяцию, если ручка находится между отсчетами, можно делать линейную, но лучше по параболе по трем точкам. Могу покопаться, найти целочисленную формулу.
Памяти ОЗУ в контроллере PIC16F84 64 байта. Рассчитанную эксп туда не засунешь. Есть еще EPROM, но оно медленное. Ничего кроме PIC’ов я не знаю. Да и в других новых 18pin моделях может и чуть больше памяти - погоды это не сделает. Так что единственный способ - положить табулированные значения в ПЗУ.
Памяти ОЗУ в контроллере PIC16F84 64 байта. Рассчитанную эксп туда не засунешь.
С этого и надо было начинать. 😃
Есть еще EPROM, но оно медленное.
Медленное по записи, по чтению вроде то же самое. Если реализовать интерполяцию по параболе, то хватит даже по пять точек в каждую сторону.
Ничего кроме PIC’ов я не знаю.
Возьмите какой-нибудь простенький atmel и пишите на си. Все ассемблеры не выучишь. 😃
Так что единственный способ - положить табулированные значения в ПЗУ.
Боюсь что если так, то и формулу было выводить не надо, можно было просто от руки нужные линии начертить. 😁
{"assets_hash":"a8b26fa7f6e768b07a72c8c9aadb9422","page_data":{"users":{"3d4a30483df95500777977e0":{"_id":"3d4a30483df95500777977e0","hid":624,"name":"toxa","nick":"toxa","avatar_id":null,"css":""},"41b8a4ac3df9550077792e83":{"_id":"41b8a4ac3df9550077792e83","hid":5271,"name":"Prikupets","nick":"Prikupets","avatar_id":null,"css":""},"42bbbad43df955007779056c":{"_id":"42bbbad43df955007779056c","hid":7885,"name":"ЮНИОР","nick":"ЮНИОР","avatar_id":null,"css":""}},"settings":{"blogs_can_create":false,"blogs_mod_can_delete":false,"blogs_mod_can_hard_delete":false,"blogs_mod_can_add_infractions":false,"can_report_abuse":false,"can_vote":false,"can_see_ip":false,"blogs_edit_comments_max_time":30,"blogs_show_ignored":false,"blogs_reply_old_comment_threshold":30,"votes_add_max_time":168},"entry":{"_id":"437c850599707300770f058b","hid":694,"title":"Открыта Формула Экспоненты В Управлении","html":"<p>Мне наконец удалось при помощи Д. Заточника, показавшего график в eclipse’овской доке, восстановить формулу экспоненты в управлении. В данном контексе - экспонента - это функция изменения выходного сигнала в зависимости от входного и установленных % (параметра экспоненты).<br>\nВсе расчеты выполнены в Excel’е, который содержит макрос заполнения таблицы для графика. Знак “-” у экспоненты подразумевается и опущен (другие меня не интерисуют).<br>\nЛист 1 - таблица зависимости выхода от входа при разных % экспоненты,<br>\nЛист 2 - таблица отклонения от линейного закона зависимости выхода от входа,<br>\nЛист 3 - график для листа 1,<br>\nЛист 4 - график для листа 2.</p>\n<!--cut-->\n<p>Графики экспоненты (легенда - % экспоненты): <a class=\"attach attach-img attach__m-sm\" href=\"https://rcopen.com/member5271/media/437c847699707300771837cd\" target=\"_blank\" data-nd-media-id=\"437c847699707300771837cd\" data-nd-image-orig=\"https://rcopen.com/member5271/media/437c847699707300771837cd\" data-nd-image-size=\"sm\"><img class=\"attach__image\" src=\"https://rcopen.com/files/437c847699707300771837cd_sm\" alt width=\"170\" height=\"150\"></a><br>\nГрафики отличия экспоненты от линейного закона (легенда - % экспоненты): <a class=\"attach attach-img attach__m-sm\" href=\"https://rcopen.com/member5271/media/437c854d99707300771842a8\" target=\"_blank\" data-nd-media-id=\"437c854d99707300771842a8\" data-nd-image-orig=\"https://rcopen.com/member5271/media/437c854d99707300771842a8\" data-nd-image-size=\"sm\"><img class=\"attach__image\" src=\"https://rcopen.com/files/437c854d99707300771842a8_sm\" alt width=\"170\" height=\"150\"></a><br>\nExcel исходник: <a class=\"attach attach-bin attach__m-sm\" href=\"https://rcopen.com/member5271/media/437c84b899707300771838e5\" target=\"_blank\" data-nd-media-id=\"437c84b899707300771838e5\" data-nd-image-orig=\"https://rcopen.com/member5271/media/437c84b899707300771838e5\"><span class=\"attach__icon icon icon-binary\"></span><span class=\"attach__content\">Exponent1.rar</span></a></p>\n<p>А теперь формула:<br>\n(вспомогательный коэффициент экспоненты, зависящий от %) <strong data-nd-pair-src=\"**\">A=10^( (2^(%/25))/4 )</strong><br>\n(Вход Y от выхода X) <strong data-nd-pair-src=\"**\">Y=100*((A^(X/100))-1)/(A-1)</strong><br>\n(X и Y меняются от 0 до 100)</p>\n","user":"41b8a4ac3df9550077792e83","ts":"2005-11-17T13:26:29.000Z","st":1,"cache":{"comment_count":7,"last_comment":"437f843299707300771911ed","last_comment_hid":7,"last_ts":"2005-11-19T19:59:46.000Z","last_user":"3d4a30483df95500777977e0"},"views":2980,"bookmarks":0,"votes":0},"subscription":null},"locale":"en-US","user_id":"000000000000000000000000","user_hid":0,"user_name":"","user_nick":"","user_avatar":null,"is_member":false,"settings":{"can_access_acp":false,"can_use_dialogs":false,"hide_heavy_content":false},"unread_dialogs":false,"footer":{"rules":{"to":"common.rules"},"contacts":{"to":"rco-nodeca.contacts"}},"navbar":{"tracker":{"to":"users.tracker","autoselect":false,"priority":10},"forum":{"to":"forum.index"},"blogs":{"to":"blogs.index"},"clubs":{"to":"clubs.index"},"market":{"to":"market.index.buy"}},"recaptcha":{"public_key":"6LcyTs0dAAAAADW_1wxPfl0IHuXxBG7vMSSX26Z4"},"layout":"common.layout"}