MAL4X Научно-технический форум разработчиков симуляторов и автоматики


Симуляторы перегрузок. DIY электроника. ЭВМ. Компьютерные сети.
Up

Новейшая прошивка для Arduino.

Строим реалистичный симулятор перегрузок своими руками. Рекомендации. Советы.

Модераторы: Death_Morozz, null, Ale

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 14 ноя 2015, 02:01

Ale. В прошивке стабильно вылазит баг во время игры, причем вызывается очень просто - достаточно на большой скорости влететь в препятствие так, чтоб двигатели отработали максимальную амплитуду по нескольким силам... проявляется это в том, что двигатели начинают истерически дергаться - сильно дрожать при движении. Лечиться только повторной отправкой коэффициентов. Очень похоже на то, что коэффициенты устанавливаются в произвольное значение.
Аватара пользователя
Spirit
SIMER
 
Сообщения: 300
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 85 раз.
Поблагодарили: 95 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение Ale » 14 ноя 2015, 21:48

Spirit писал(а):Ale. В прошивке стабильно вылазит баг во время игры, причем вызывается очень просто - достаточно на большой скорости влететь в препятствие так, чтоб двигатели отработали максимальную амплитуду по нескольким силам... проявляется это в том, что двигатели начинают истерически дергаться - сильно дрожать при движении. Лечиться только повторной отправкой коэффициентов. Очень похоже на то, что коэффициенты устанавливаются в произвольное значение.

Очень странный баг. Скорее связан не с прошивкой, а с рестартом ардуины при перенапряжениях по питанию. Я, конечно, буду посмотреть. Но когда - не знаю. Уезжаю на две недели с хором в турне.
Если завтра выкрою время, попробую разнести настройки для разных моторов.

Кстати- приветствуется совместное допиливание прошивки. 8-) Пробуйте себя в прграммировании.
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 16 ноя 2015, 02:16

Ale писал(а):Очень странный баг. Скорее связан не с прошивкой, а с рестартом ардуины при перенапряжениях по питанию. Я, конечно, буду посмотреть. Но когда - не знаю. Уезжаю на две недели с хором в турне.

Кстати да. Я припоминаю, что еще во время запуска макетика с RC, ардуинку иногда начинало "колбасить" без отдельного питания. С твоей прошивкой такого не наблюдалось и питание я отрубил. Попробую не отключать питание от ардуины, по результатам отпишу.
Вспомнил... Если после бага отключить ЮСБ (питания отдельного не было), а потом снова включить, то дергатня продолжается, тобиш просто сброс ардуины не помогает, только повторная отсылка коэффициентов. Похожую реакцию наблюдал если установить очень большие значения Kd.
И еще одно наблюдение... я конечно не уверен, но помоему руль тоже от ЮСБ отвалился в тот момент. Игра перестала реагировать на управление - все это относится к LFS. Другие игры попробую.
Ale писал(а):Кстати- приветствуется совместное допиливание прошивки. Пробуйте себя в прграммировании.
Я б с удовольствием, но знаний не хватает. Пока могу только тестировать.
PS. Хорошей поездки
Аватара пользователя
Spirit
SIMER
 
Сообщения: 300
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 85 раз.
Поблагодарили: 95 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 19 ноя 2015, 23:51

Spirit писал(а):Кстати да. Я припоминаю, что еще во время запуска макетика с RC, ардуинку иногда начинало "колбасить" без отдельного питания. С твоей прошивкой такого не наблюдалось и питание я отрубил. Попробую не отключать питание от ардуины, по результатам отпишу.
Подключение отдельного питания не помогло.
Spirit писал(а):И еще одно наблюдение... я конечно не уверен, но помоему руль тоже от ЮСБ отвалился в тот момент. Игра перестала реагировать на управление - все это относится к LFS. Другие игры попробую.
Игра была в окне, если выбрать другое активное окно - игра перестает реагировать на управление - скорее всего я переключился в то время на другое окно.

Сегодня решил после глюка доехать трассу, через минуту в таком режиме умер один из мостов :? Завтра посмотрю что именно сдохло.
Думал, что возможно глючит СимТулз, но если после глюка запустить xSimCtrl, то пока не отправишь заново коэффициенты двигатель продолжает "колбасить". Скоро появится доступ к осцилографу, попробую посмотреть что на входе и выходе в нормальном режиме и во время глюка.
Аватара пользователя
Spirit
SIMER
 
Сообщения: 300
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 85 раз.
Поблагодарили: 95 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение Ale » 30 ноя 2015, 10:08

Spirit писал(а):
Nur писал(а):Установил Р 08 D 05 мотор по спокойней стал но шим мне не понятен. https://youtu.be/9WvT-mlVApw
Странно, у меня ШИМ вот так выглядел без нагрузки, Ale скажи, правильно контроллер ШИМ генерирует?
Изображение

Изображение


Отвечаю на вопрос в "профильной" ветке ;)

Прежде всего небольшое вступление - для чего нужен PID (в нашем случае - PD) регулятор? Для того, что бы двигатель как можно более точно отрабатывал задание. Так же напомню, что в одном из своих постов о новой прошивке я писал:
Ale писал(а):Собственно теперь формула регулирования следующая

pwm = (error*Kp - speed*Kd);

Причем если скорость слагаемое speed*Kd по модулю больше чем error*Kp , то еще до достижения конечной точки мотор врубается в ОБРАТНОМ направлении - активно тормозится.


Собственно имея ДВА слагаемых при расчете ШИМ можно задачу точной отработки мотором задания решить двояко.
1 - можно уменьшать (или совсем выключить) дифференциальный коэффициент, тогда останется только пропорциональная составляющая формулы. Но при этом возникают сложности с настройкой отклика на одновременно слабые амплитуды (типа езды по поребрикам) и на большие (типа прыжков с трамплина) . Собственно, уже неоднократно такой метод регулирования был опробован, и всегда он вызывал нарекания.
2 - для хорошего (динамичного) отклика на слабые отклонения необходимо увеличивать пропорциональный коэффициент. Но это почти неизбежно приводит к "перелетам" на больших амплитудах. Что бы как-то найти выход из этого противоречия в формулу регулирования добавлен дифференциальный коэффициент, с помощью которого есть возможность "притормаживать" мотор при превышении им заданной скорости.

Отсюда вывод - если сильно задран коэффициент P, то увеличив коэффициент D можно уложить движение мотора в норму, но оно будет "дерганным" - с постоянными разгонами и торможениями. Что вы и наблюдаете на графиках ШИМ, когда он вдруг меняет знак (переходить через нулевую линию графика)

В принципе если бы не нагрев мотора и не доп нагрузка на мост - и фиг бы с ним, ведь задача решена. Но, ИМХО, все таки нужно поиграть с коэффициентами и постараться убрать излишние переключения. Но совсем избавиться от них не получится - это принцип PD регулирования, когда "пропорциональный" коэффициент работает на разгон мотора, а "дифференциальный" - на его торможение. Так получается быстрое и четкое перемещение мотора на большие дистанции.

ЗЫ: Воможно надо мне в прошивке попробовать интегрировать скорость на бОльшем временном отрезке. Что должно привести к уменьшению шума при диф составляющей. но и к задержке регулирования. Посмотрим.
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Новейшая прошивка для Arduino.

Сообщение Nur » 30 ноя 2015, 12:28

Spirit писал(а):В прошивке стабильно вылазит баг во время игры, причем вызывается очень просто - достаточно на большой скорости влететь в препятствие так, чтоб двигатели отработали максимальную амплитуду по нескольким силам... проявляется это в том, что двигатели начинают истерически дергаться - сильно дрожать при движении. Лечиться только повторной отправкой коэффициентов.

Сегодня у меня случилось тоже самое. Spirit ты не нашел еще причину?
Аватара пользователя
Nur
SIMER
 
Сообщения: 176
Зарегистрирован: 24 сен 2014, 16:52
Благодарил (а): 67 раз.
Поблагодарили: 20 раз.
Баллы репутации: 2

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 30 ноя 2015, 13:00

Ale писал(а):1 - можно уменьшать (или совсем выключить) дифференциальный коэффициент, тогда останется только пропорциональная составляющая формулы. Но при этом возникают сложности с настройкой отклика на одновременно слабые амплитуды (типа езды по поребрикам) и на большие (типа прыжков с трамплина) . Собственно, уже неоднократно такой метод регулирования был опробован, и всегда он вызывал нарекания.
2 - для хорошего (динамичного) отклика на слабые отклонения необходимо увеличивать пропорциональный коэффициент. Но это почти неизбежно приводит к "перелетам" на больших амплитудах. Что бы как-то найти выход из этого противоречия в формулу регулирования добавлен дифференциальный коэффициент, с помощью которого есть возможность "притормаживать" мотор при превышении им заданной скорости.


В принципе я методом подбора к такому выводу и пришел. Дифференциальная составляющая мешает только при движении рычага вниз. Если можно разделить Kd на два коэффициента, для двух диапазонов положения потенциометра (0-127) и (128-255) то думаю настроить можно более точно.
Добиться рекации на мелкие неровности у меня не получилось - выезжая на траву ничего не происходит, в сим тулз бегунок пляшет, а моторы мелкую тряску фильтруют. Удары, перескакивание через поребрики и остальные эффекты отрабатываются нормально.
Аватара пользователя
Spirit
SIMER
 
Сообщения: 300
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 85 раз.
Поблагодарили: 95 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 30 ноя 2015, 13:05

Nur писал(а):
Spirit писал(а):В прошивке стабильно вылазит баг во время игры, причем вызывается очень просто - достаточно на большой скорости влететь в препятствие так, чтоб двигатели отработали максимальную амплитуду по нескольким силам... проявляется это в том, что двигатели начинают истерически дергаться - сильно дрожать при движении. Лечиться только повторной отправкой коэффициентов.

Сегодня у меня случилось тоже самое. Spirit ты не нашел еще причину?

Этот баг очень напрягает. Я так понимаю, для начала надо выловить причину и момент его возникновения. Я еще не достаточно поэксперементировал. Так же он вроде проявляется и без аварий, просто после прошествия некоторого времени. Тут надо участие Ale.
Ale, может через какое-то время сбивается таймер, который задает частоту ШИМа? Я прописывал коэффициенты в прошивке как константу - баг все равно проявляется.
Аватара пользователя
Spirit
SIMER
 
Сообщения: 300
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 85 раз.
Поблагодарили: 95 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение Ale » 30 ноя 2015, 13:47

Spirit писал(а):
Nur писал(а):
Spirit писал(а):В прошивке стабильно вылазит баг во время игры, причем вызывается очень просто - достаточно на большой скорости влететь в препятствие так, чтоб двигатели отработали максимальную амплитуду по нескольким силам... проявляется это в том, что двигатели начинают истерически дергаться - сильно дрожать при движении. Лечиться только повторной отправкой коэффициентов.

Сегодня у меня случилось тоже самое. Spirit ты не нашел еще причину?

Этот баг очень напрягает. Я так понимаю, для этого надо выловить причину его возникновения.
Ale, может через какое-то время сбивается таймер, который задает частоту ШИМа? Я прописывал коэффициенты в прошивке как константу - баг все равно проявляется.


Я пока не представляю, в чем там дело. Варианта два - каким-то образом именно коэффициенты затираются в памяти (что вряд ли, странно иначе), или алгоритм вычисления ШИМ дурит. Ну или сбивается синхронизация потока данных (что тоже вряд ли).
Допускаю, что может ресетиться микроконтроллер (при перегрузках по силовому пританию) и не восстанавливать коэффициенты при этом.
Короче - для начала задайте в программе подобранные заранее коэффициенты в виде констант.

Вот в этой версии прошивки можно задать ключ
#define CONST_COEFF

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

#ifdef CONST_COEFF
#define Kp 0x10L
#define Kd 0x08L
#else


Ale_2DOF_Ard_PD_30_11_15.rar
(5.59 КБ) Скачиваний: 122


Попробуйте на предмет устойчивости к сбоям.
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 30 ноя 2015, 14:39

Ale писал(а):#ifdef CONST_COEFF
#define Kp 0x10L
#define Kd 0x08L
#else


А как правильно менять коэффициенты: допустим Kp=3A?
#define Kp 0x3AL так?
Что значит буква L после значения?

Делитель PD_DIV будет как-то влиять на коэффициент в данном случае?
Аватара пользователя
Spirit
SIMER
 
Сообщения: 300
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 85 раз.
Поблагодарили: 95 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение Ale » 30 ноя 2015, 15:43

Spirit писал(а):
Ale писал(а):#ifdef CONST_COEFF
#define Kp 0x10L
#define Kd 0x08L
#else


А как правильно менять коэффициенты: допустим Kp=3A?
#define Kp 0x3AL так?
Что значит буква L после значения?

Делитель PD_DIV будет как-то влиять на коэффициент в данном случае?


Да.

Я на всякий случай ставлю суффикс "L". Насколько я помню, это надо для определения "длинных" чисел (Long), важно, что бы компилятор не воспринял константу как один байт.

PD_Div включается в работу уже после вычислений, так что его это не заденет.
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 30 ноя 2015, 15:54

Чего то прошивка не компилируется...

//========== PD регулятор ===================

#ifdef CONST_COEFF
#define Kp 0x10L
#define Kd 0x08L

#else
int Kp ; // будет делиться на PD_DIV
int Kd ; // будет делиться на PD_DIV
int KCS; // чексумма для проверки целостности
#endif
Коеффициенты надо два раза прописывать?
#ifdef CONST_COEFF

#else // если не испольшзуем константные коэффициенты ПИД
Kp = EEPROM.read(0); // читаем из EEPROM коэффициенты
Kd = EEPROM.read(1);
KCS= EEPROM.read(2);
cs = (Kp+Kd) & 0x00FF ; // вычисляем сумму и берем от нее только младший байт

if (KCS != cs) // если чексумма не совпадает
{
Kp = 0x10; // иициализируем константами (тут можно на всякий случай уже настроенные коэффициенты вписать
Kd = 0x08;
EEPROM.write(0,Kp);
EEPROM.write(1,Kd);
KCS = (Kp+Kd) & 0x00FF ; // вычисляем сумму и берем от нее только младший байт
EEPROM.write(2,KCS);
}
#endif

ИзображениеИзображение
Аватара пользователя
Spirit
SIMER
 
Сообщения: 300
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 85 раз.
Поблагодарили: 95 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение Ale » 30 ноя 2015, 16:32

Spirit писал(а):Чего то прошивка не компилируется...


Буду проверять, у меня под 1.5.3 компилируется

Spirit писал(а):Коеффициенты надо два раза прописывать?


Зачем? Там же оператор условной компиляции. Текст

#ifdef CONST_COEFF
#define Kp 0x10L
#define Kd 0x08L
#else
int Kp ; // будет делиться на PD_DIV
int Kd ; // будет делиться на PD_DIV
int KCS; // чексумма для проверки целостности
#endif

надо понимать так - если определен ключ CONST_COEFF, тогда коэффициенты берем как константы (#define), Если нет, то как переменные типа int, которые потом в порограмме будут считываться из EEPROM
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Новейшая прошивка для Arduino.

Сообщение Spirit » 30 ноя 2015, 18:03

Зачем эти строки в коде? Здесь задается начальное значение для переменных из EEPROM, которые будут браться при первичной инициализации?
Kp = 0x10; // иициализируем константами (тут можно на всякий случай уже настроенные коэффициенты вписать
Kd = 0x08;
UPD
Буду проверять, у меня под 1.5.3 компилируется

Поставил 1.5.3 - скомпилировалось
Аватара пользователя
Spirit
SIMER
 
Сообщения: 300
Зарегистрирован: 18 ноя 2014, 14:40
Откуда: Киев
Благодарил (а): 85 раз.
Поблагодарили: 95 раз.
Баллы репутации: 58
Технарь

Re: Новейшая прошивка для Arduino.

Сообщение Ale » 30 ноя 2015, 21:59

Spirit писал(а):Зачем эти строки в коде?

Пытаюсь проверить идею, что портятся ЗНАЧЕНИЯ коэффициентов. Поскольку Kp и Kd - переменные, то есть ячейки памяти, теоретически есть возможность их испортить. Вот я и пытаюсь проверить это заменив "переменные" константами (#define).

Еще раз - расколбас регулирования может возникать либо при НЕПРАВИЛЬНЫХ (ИСПОРЧЕННЫХ) коэффициентах регулирования ПД, либо при ошибках в алгоритме расчета. Так вот, заменив "переменные" коэффициенты константами (#defnie) мы можем проверить первое предположение.

PS: Достаточно закомментировать строку
#define CONST_COEFF
и прошивка опять будет считывать коэффициенты из EEPROM и будет возможность их редактировать из xSimCtrl
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Пред.След.

Вернуться в X-SIMULATOR и RU-SIMULATOR & SimTools

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 204

cron
x

#{title}

#{text}