ИК паяльная станция на Arduino Mega 2560. Доработка скетча "ARS_v2_Lilium_JSN"

Тема в разделе "Arduino & Shields", создана пользователем vector99, 7 дек 2016.

  1. SOLOway

    SOLOway Гик

    Да.
    Сейчас, непонятно почему, не могу прошить в свежую плату ProMini Optiboot. Ни 6.2 ни новый 8.0. Ни через IDE, ни через USBASP. Мистика :(.
     
  2. SOLOway

    SOLOway Гик

    Пока ничем. Слишком узкая. Тут фрезеровать надо канавку и герметиком (только белым, но не черным) для печных труб и дымоходов (до 1200*С) промазывать, а затем сушить в 2 этапа, сначала на ~150*С, ~30 минут, а затем на ~200*C 1-2 часа. А пока, если сразу на 100% гонять не будете, дайте погреться ему на 150-200*С часик, возможно дальше трещина и не станет развиваться. Это только мой личный опыт.
     
  3. Watashi

    Watashi Гик

    Предлагаю посмотреть такой вариант борьбы с простынями кода ). В Ардуино IDE в настройках есть пунктик "включить сворачивание кода" который позволяет скрыть все что находится в фигурных скобках. В прилагаемых картинках пример как может выглядеть код программы.
     

    Вложения:

    • pt1.jpg
      pt1.jpg
      Размер файла:
      179,1 КБ
      Просмотров:
      78
    • pt2.jpg
      pt2.jpg
      Размер файла:
      175,6 КБ
      Просмотров:
      82
    Dmitrysh нравится это.
  4. SOLOway

    SOLOway Гик

    Провозился всю ночь. Перепробовал кучу вариантов...
    А китайцы просто залили в мою ProMini загрузчик от NANO! Стоило выбрать NANO в IDE, как всё стало компилиться и заливаться. Соответственно, прошил загрузчик от UNO, а затем и Optiboot 8.0. Вот откуда ж мне было знать о таких китайских причудах?!.
     
  5. Dmitrysh

    Dmitrysh Гик

    Это рампа для нижнего нагревателя. Точно такая-же сделана для верхнего во всех наших скетчах. snmar4enko решил так ограничить скорость роста температуры низа. В принципе разумно, но можно и лучше сделать. Значения "счётчика" должны совпадать с реальной температурой по задумке автора.
    Вот это шедевральное решение. Не знаю насколько оно оправдано и эффективно, но решение интересное и заслуживает внимания. Если честно, то такого я ни у кого ещё не встречал.
    Там так просто и не сложится. Есть "косяки" и "непонятки".
    Давайте по порядку.
    Жестокий косяк о котором я раньше предупреждал. Он есть практически у всех. А заключается он в конструкции такого вида
    Код (C++):
    if (millis() > nextRead3)
        {
         
          nextRead3 += PID_SAMPLING_TIME;
    ...
    Дело вот в чём. Мы включаем станцию, делаем настройки, ставим плату, датчики и т.д. Всё это время значение millis() возрастает на 1000 каждую секунду. А вот переменная nextRead3 остаётся равной нулю. Затем мы запускаем пайку и что в итоге имеем? А мы имеем выполнение кода после условия не через PID_SAMPLING_TIME а сразу как попадаем на это условие, пока переменная nextRead3 не "догонит" millis(). И чем дальше убежало millis() тем дольше догонять. А в итоге ПИД молотит по полной через неравные промежутки времени, а даже если и через равные, но не равные установленные переменной PID_SAMPLING_TIME. Изменение времени пересчёта ПИД эквивалентно пропорциональному изменению всех коэффициентов со всеми вытекающими последствиями.
    Следует отметить, что там где работает стандартная библиотека ПИД сбоя в работе ПИД из-за вышеуказанного косяка не будет. Ибо библиотека сама решает когда ей пересчитывать ПИД. Но остальной код будет молотить по полной.
    А вот из-за такой самостоятельности стандартной библиотеки возникает "непонятка". А именно. Автор решил разогнать ПИД и установил PID_SAMPLING_TIME = 50. И в уверенности что ПИД считается каждые 50мс накрутил соответственно коэффициенты. Всё бы хорошо, но стандартная библиотека сама знает, сколько ей пересчитывать ПИД и ей PID_SAMPLING_TIME побоку.
    Такая проблема возникла из-за того, что "мы" не смотрим чужие библиотеки и не читаем описание. А в описании написано, что стандартное время пересчёта 100мс. Это время можно изменить если дать команду SetSampleTime(int NewSampleTime). При этом происходит автоматический пересчёт коэффициентов ПИД.
    Отсюда возникает вопрос - как будем сохранять коэффициенты ПИД? По задумке автора или по тому как они идут в скетче?
     
    SOLOway и Probe2005klm нравится это.
  6. Dmitrysh

    Dmitrysh Гик

    Вот подправленная версия 2.0.9 UNO(nano)+LCD1602+2*MAX6675+ZCC. Эта версия(для тех кто не в курсе) с низкочастотным ШИМ на выходе(оно же фазовое управление). В архиве 2 файла - скетч и файл моих изменений.
     

    Вложения:

    SOLOway нравится это.
  7. SOLOway

    SOLOway Гик

    Предложение snmar4enko о НИ в 650Вт совсем не добавило мне оптимизма в попытках разобрать его 2.0.9. Хотя, призыв не столько к такой мощности, а к тому, чтобы растянуть шкалу регулирования...
    Я за то, чтоб хотя-бы версию из поста #1619 довести до оптимума.
    Dmitrysh :)
    А я, наивный, думал, что малой кровью отделаюсь...
    А вот этот пункт как отражается на функционале скетча, кроме как утяжелением его с помощью float?:
    5. Добавил новую локальную переменную float out_float; для того чтобы выводить коэффициенты ПИД в дробном формате, а то
    были товарищи которые очень сильно переживали по поводу исчезновения точки при выводе коэффициентов.
    Скомпилировал в IDE 1.8.5. Прошло успешно, но я включил в настройках IDE вывод сообщений компилятора "по умолчанию". И IDE мне понаписало... Хотя скетч нормально скомпилировался...
     

    Вложения:

    Последнее редактирование: 7 янв 2019
  8. Dmitrysh

    Dmitrysh Гик

    Коэффициенты выводятся на экран дробными, например 5.5, 0.03 6.2, смысловой нагрузки по сути никакой, просто для красоты ну может ближе к теории, где они не целые числа. На функционал никак не влияют.
    Оно написало, что функция void WriteEEPROM_Long(uint8_t, uint32_t) ему не нравится и работать она может неправильно(это вольный перевод). Мы эту функцию не используем, поэтому можно не обращать на неё внимание.
     
    SOLOway нравится это.
  9. SOLOway

    SOLOway Гик

    Вот я тоже искал, где это в скетче, и не нашёл. Примерно так и понял, что не в скетче, а строках самой библиотеки что-то не понравилось IDE, но, раз скетч скомпилировался, я и успокоился, и вы уверенности мне добавили.
    Спасибо. А за файлик с пояснениями - огромная благодарность! Очень надоедает сотню страниц пролистывать в поисках нужных правок, а надобность в них возникает "по ходу пьесы", а не враз с первовключением.
     
    Последнее редактирование: 7 янв 2019
  10. Dmitrysh

    Dmitrysh Гик

    Похоже найдена замена фильтру Калмана. Я проведу пару экспериментов и предоставлю результат.
     
  11. Dmitrysh

    Dmitrysh Гик

    Вот посмотрите на графики. Красный цвет(канал0) - фильтр Калмана, оливковый цвет(канал1) - наша замена, желтый цвет(канал2) - реальный выход max6675. 1.jpg 2.jpg 3.jpg
     
  12. Dmitrysh

    Dmitrysh Гик

    Из графиков видно, что замена получилась с меньшей реакцией и задержкой, а также более точное повторение реальной температуры.
     
  13. SOLOway

    SOLOway Гик

    В смысле, замена реагирует быстрее, чем фильтр, и при этом практически так же плавно ведёт график, как и фильтр? А разница в показаниях на контрольных точках графика насколько существенна?, т.е. какова реальная температура, как узнать? На старте замена завышает на 15*С, далее плавно идет на занижение на 5*С. Это складывание 4-ёх замеров и деление на 4? - по идее тогда это более достоверные температуры...
     
    Последнее редактирование: 11 май 2019
  14. Dmitrysh

    Dmitrysh Гик

    На графиках температура умноженная на 100, т.е 2600 = 26градусов
    Да
    Да, и плавность с точностью можно регулировать
     
  15. SOLOway

    SOLOway Гик

    Тогда я ошибся... Что это тогда за алгоритм?
     
  16. Dmitrysh

    Dmitrysh Гик

    Смотрите как реализован у нас Калман
    Код (C++):
    float varTerm1 = 0.25;  // среднее отклонение (ищем в excel)
    float varProcess1 = 0.0125; // скорость реакции на изменение (подбирается вручную)
    float Pc1 = 0.0;
    float G1 = 0.0;
    float P1 = 1.0;
    float Xp1 = 0.0;
    float Zp1 = 0.0;
    float Xe1 = 0.0;

    float filter1(float val_1) {  //функция фильтрации показений "Верхней" термопары
      Pc1 = P1 + varProcess1;
      G1 = Pc1/(Pc1 + varTerm1);
      P1 = (1-G1)*Pc1;
      Xp1 = Xe1;
      Zp1 = Xp1;
      Xe1 = G1*(val_1-Zp1)+Xp1; // "фильтрованное" значение
      return(Xe1);
      }

    И ТАКИХ 2 КОМПЛЕКТА(ВЕРХ И НИЗ)

    ВОТ ТАК ВЫЗЫВАЕМ
    Input1 =filter1(max6675_read_temp(thermoCLK,thermoCS,thermoDO));
    Input2=filter2(max6675_read_temp(thermoCLK,thermoCS2,thermoDO));
    А теперь альтернатива

    Код (C++):
    Input1 =Input1*0.6 + 0.4*(max6675_read_temp(thermoCLK,thermoCS,thermoDO));
    Input2 =Input2*0.6 + 0.4*(max6675_read_temp(thermoCLK,thermoCS2,thermoDO));
    И все!

    От коэффициентов-множителей Input1*0.6 + 0.4*(max6675_read_temp(thermoCLK,thermoCS,thermoDO1)); Зависит точность и скорость. Сумма этих коэффициентов всегда должна равняться единице. Для нас имеет смысл брать коэффициенты от 0,6-0,4 до 0,75-0,25. Чем больше первый(ну и соответственно меньше последний) тем более гладкий получаем график(более медленный). Вот графики для нескольких значений коэффициентов в сравнении с Калманом.
    4.jpg
     
  17. Dmitrysh

    Dmitrysh Гик

    Поверьте мне, все работает точно. Конечно, как и Калман при изменении температуры задержка реакции есть, но у Калмана она больше и Калман медленнее.
     
  18. SOLOway

    SOLOway Гик

    А как эту строку по-русски прочитать? "вход №1 = (вход №1 умноженный на коэффициент 0,6 прибавить ???)
     
  19. Dmitrysh

    Dmitrysh Гик

    вход №1 = вход №1 умноженный на коэффициент 0,6 прибавить то_что_мы_прочитали_из_мах6675 умноженное на 0,4

    Код (C++):
    Input1 =Input1*0.6 + 0.4*(max6675_read_temp(thermoCLK,thermoCS,thermoDO));
    Т.е мы берём 60% от предыдущего значения температуры и добавляем ещё 40% от только что прочитанного.
     
    SOLOway нравится это.
  20. Dmitrysh

    Dmitrysh Гик

    Тесты показали, что альтернативный вариант считается в 3 раза быстрее фильтра Калмана
    5.jpg

    С таким подходом можно ПИД запихивать в прерывание от ZCC и не париться о точном времени расчёта.
    Если в функции чтения мах6675 работать напрямую с портами, то можно из 272 едениц времени(видно на картинке) ужать до 40. Итого 40 чтения мах 32 фильтр и где-то 100 ПИД(может и быстрее, надо смотреть) получаем 172. И таких 2 раза, потому как у нас 2 ПИДа плюс мелочь получаем около 500ед времени(в данном случае микросекунды). Таким образом 500мкс или 0,5мс это 5% мощности по времени синусоиды, а с учётом того что ZCC выдаёт импульс ноля раньше реального итого меньше.
    Значит чтение температуры и расчёт ПИД можно смело запихнуть в прерывание от ZCC, а в скетче и не задумываться о временной привязке ПИД, всё будет на автомате.
     
    Последнее редактирование: 8 янв 2019
    Probe2005klm нравится это.