Как обычно, повылазили новые нюансы 😃. Рассказываю.
Во-первых, вычисление скорости переписали через свертку за период. Старый способ оказался шумноват для тонких вещей. Во-вторых, мы забыли компенсировать нелинейную характеристику мотора (это добавило проблем ПИД-у). Я залил на гитхаб новые файлы с реальными данными и графиками.
К счастью, снять характеристику мотора не сложно - просто плавнo наращиваем фазу триака и меряем скорость в 20 точках. Ну а потом интерполятором накладываем коррекцию.
Теперь по ПИД-у. Стандартные методы (через отклик на прямоугольный импульс) выдавали фигню, видимо из-за отсутствия коррекции. Надо будет проверить после доработки калибратора. Но есть план Б - имитировать ручную настройку, когда коэффициенты ПИД-а крутятся до возникновения автоколебаний.
Правда, есть вопрос, как обнаруживать автоколебания без сложной математики. Пока в голову пришел такой способ. Подаем на мотор напряжение без ПИД-а и вычисляем дисперсию скорости (стандартная сигма), чтобы определить порог шума. Потом включаем ПИД, и если дисперсия больше - значит начались автоколебания.
Еще надо понять время таких измерений (фактически период автоколебаний, который зависит от времени торможения мотора). Наверное пока просто забьем секунды три - должно хватить для всех моторов подобного типа, чтобы понять, есть автоколебания или нет. Никто ж не будет маховик на мотор ставить.
Стандартные методы (через отклик на прямоугольный импульс)
Это метод Коэна-Куна? Там, где мы повышаем управляющее воздействие и ждём, пока процесс устаканится, потом отрезаем от этого 67, что ли, процентов, и что-то рассчитываем?
В этой связи есть вопрос. Если у нас процесс, такой как мотор, то мы подняли ток - поднялись обороты. Всё, вроде, логично. А если процесс вида “кран” - тогда что? Тут получается, мы дали, например, 10% увеличения управляющего воздействия - и объект поехал, и он не остановится, пока мы не уберём управляющее воздействие, или пока не упрётся в ограничение.
Ну, например, ездит тележка по рельсам. Если мы прикладываем усилие к тележке - она ведь так и будет катиться, пока не упрётся в край. Или пока мы не снимем усилие (допустим, что тележка оснащена тормозом, для простоты). И как в случае такого объекта автонастраивать ПИД? Есть ли какая-нибудь информация на этот счёт?
Не помню имен и явок, лучше погуглить “pid controller autotune”. Физическими процессами и отладкой занимается напарник. Он типа апсирант на кафедре разработки приводов.
Если совсем по простому - то подается прямоугольный импульс, и меряется и разгон и останов. Дальше все зависит от того, есть в системе реверс/тормоз или нет. Если нет - останов за счет трения. Методика настройки не меняется, просто без активного тормоза характеристики будут фиговые и с этим ничего не сделать. Дальше только ставить наблюдателя, который учтет что при нагрузке трение вырастет и торможение улучшится.
Сейчас не могу сказать, на чем именно остановимся для нашего конкретного случая, но все в итоге будет запротоколировано в папке документации.
Понято, буду посматривать.
Автотюн, конечно же, искал в разных вариантах (и пробовал тоже в разных). Всё равно в итоге всё сводится либо тупо к зиглер-никольсу и вводу в автоколебания (что моветон и фу-фу-фу), либо к каким-то покрытым мраком алгоритмам, изобретённым на коленке для конкретного случая.
Ну настраивается-то один раз, автоколебания можно пережить. Надо только понять как их детектить с достаточной точностью. Тут моторы уродские, если бы были с магнитами или асинхронники, было б проще характеристики обсчитывать.
Есть еще ADRC но не понял как выводится формула для наблюдателя.
{"assets_hash":"a8b26fa7f6e768b07a72c8c9aadb9422","page_data":{"users":{"39c21abc3df9550077797d18":{"_id":"39c21abc3df9550077797d18","hid":349,"name":"Vitaly","nick":"Vitaly","avatar_id":null,"css":""},"497ec4283df9550077772a70":{"_id":"497ec4283df9550077772a70","hid":43414,"name":"gorbln","nick":"gorbln","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":"5b8c41aa9970730077118226","hid":23524,"title":"Продолжаем изобретать калибровку ПИД-а","html":"<p>Как обычно, повылазили новые нюансы <span class=\"emoji emoji-smiley\" data-nd-emoji-src=\":smiley:\">😃</span>. Рассказываю.</p>\n<p>Во-первых, вычисление скорости переписали через свертку за период. Старый способ оказался шумноват для тонких вещей. Во-вторых, мы забыли компенсировать нелинейную характеристику мотора (это добавило проблем ПИД-у). Я залил на гитхаб новые файлы с реальными данными и графиками.</p>\n<p>К счастью, снять характеристику мотора не сложно - просто плавнo наращиваем фазу триака и меряем скорость в 20 точках. Ну а потом интерполятором накладываем коррекцию.</p>\n<p>Теперь по ПИД-у. Стандартные методы (через отклик на прямоугольный импульс) выдавали фигню, видимо из-за отсутствия коррекции. Надо будет проверить после доработки калибратора. Но есть план Б - имитировать ручную настройку, когда коэффициенты ПИД-а крутятся до возникновения автоколебаний.</p>\n<p>Правда, есть вопрос, как обнаруживать автоколебания без сложной математики. Пока в голову пришел такой способ. Подаем на мотор напряжение без ПИД-а и вычисляем дисперсию скорости (стандартная сигма), чтобы определить порог шума. Потом включаем ПИД, и если дисперсия больше - значит начались автоколебания.</p>\n<!--cut-->\n<p>Еще надо понять время таких измерений (фактически период автоколебаний, который зависит от времени торможения мотора). Наверное пока просто забьем секунды три - должно хватить для всех моторов подобного типа, чтобы понять, есть автоколебания или нет. Никто ж не будет маховик на мотор ставить.</p>\n<p>На неделе продолжим.</p>\n","user":"39c21abc3df9550077797d18","ts":"2018-09-02T20:01:46.000Z","st":1,"cache":{"comment_count":4,"last_comment":"5b9032bf997073007711c8fd","last_comment_hid":4,"last_ts":"2018-09-05T19:47:11.000Z","last_user":"39c21abc3df9550077797d18"},"views":981,"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"}