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

Тема в разделе "Глядите, что я сделал", создана пользователем Jalnin, 2 ноя 2012.

Статус темы:
Закрыта.
  1. SNMar4enko

    SNMar4enko Нерд

    - не согласен. Включения ком порта сильно замедляет скетч .... но с вклченным UART действительно все застопорится на 10 - 12

    Вывод - нужно повышать быстродействие ПИД
     
  2. bamik

    bamik Нерд

    Код (C++):
    //сохраняем текущие параметры в "Память"
            EEPROM.write((currentProfile - 1) * 29, profileSteps);
            EEPROM.write((currentProfile - 1) * 29 + 1, Setpoint2);
            for (uint8_t i = 0; i < 9; i + 1) {
              EEPROM.write(((currentProfile - 1) * 29 + i + 2), rampRateStep[i] );
              EEPROM.write(((currentProfile - 1) * 29 + i + 11), dwellTimerStep[i]);
              EEPROM.write(((currentProfile - 1) * 29 + i + 20), temperatureStep[i]);
              i++;
            }
            EEPROM.write(480, kp1);
            EEPROM.write(481, ki1);
            EEPROM.write(482, kd1);
            EEPROM.write(483, kp2);
            EEPROM.write(484, ki2);
            EEPROM.write(485, kd2);
           
            EEPROM.write(486, pwr_TOP);
            EEPROM.write(487, pwr_BOTTOM);

     
    rampRateStep[] - тип double. Что пишется в EEPROM? Эта ошибка кочует из скетча в скетч. И писать лучше с помощью как минимум EEPROM.update(). Не всегда все изменяется. Надо экономить ресурс флеши. Вообще работа с флешем у snmar4enko извращена. Зачем очищать, например, всю флешь? Можно ввести стопбайт. Если он равен 0xff, то дальше записей нет. Но при редактировании профилей надо будет проверять, чтобы номер текущего профиля не был больше количества записанных профилей+1. И при записи его переносить стопбайт.
     
  3. SNMar4enko

    SNMar4enko Нерд

    Неплохая идея - от библиотеки PID_V1.h избавляемся, на целые числа переходим (INT), Однако умножение и деление всю картину портит. Предлагаю для начала выбрать выходную шкалу ПИД - и если она равна 20 то достаточно будет целого Byte , теперь с деление - предлагаю деление делать на 2 в степени N путем сдвига побитно в меньшую сторону, если переменныя INT то все усложняется....Или вообще избавится от умножений и делений ...
    к примеру для шкалы 20 - Пропорциональная составляющая будет просто равна ошибке в градусах,
    Интегральная составляющая просто добавление 1 если меньше, уменьшение на 1 если больше и никаких изменений если до 1 градуса разность. Диффиринциальную составляющую можно не пока не заводить.
     
  4. SNMar4enko

    SNMar4enko Нерд

    В моем скетче этот параметр учитывается как 12 кратный, то есть при записи в память 12 - и это далее пересчитыается в скорость роста температуры по профилю градусов в секунду по отношению к 4 секундам.
    Другими словами значения в память от 1 до 12, а фактически от 0.25 градусов в секунду до 3 градусов с секунду рост.
    То что все значения для профиля переписываются заново - это не я придумал.
    При первом включении ардуины с моим скетчем происходить начальная инициализация памяти, я забиваю 14 а не 4 как здесь профилей, кстати ПИД коэффициенты здесь разные для всех профилей - думаю это тоже изврат -нагреватели то одни и те же .....Да и инициализацию памяти делаю путем стирания, чтобы при следующем включения память переписалась значениями по умолчанию .... думаю такой подход понятен хотя и изврашен. Но это извращение ничто по сравнению с тем чтобы на ESP8266 ловить поток mp3 радио, писать его в EEPROM и декодировать самостоятельно.....

    Да и кто мешает разнести запись в память по пунктам меню которые опрашиваются .....
    И кто мешает удалить обнуление EEPROM - 1 раз проинициализировал и все .....дальше только ручками
     
    Последнее редактирование: 11 май 2018
  5. SNMar4enko

    SNMar4enko Нерд

    Проект на ISIS выложишь, хочется тоже попробывать
     
  6. bamik

    bamik Нерд

    Я спрашивал, что фактически попадает во флеш? Из 4х байт, что составляет double?
    В версии Ардуины ИДЕ 1.8.5 есть методы get и put для записи значений во флеш. Лучше пользоваться ими. Чтобы переменная полностью сохранялась. 2х байтных переменных в большинстве случаев должно хватить на все величины. И посмотри мои посты ранее на счет формирования флеши.
    Инициализацию памяти следует выполнять только в случае использования ее в качестве накопителя. Для дальнейшей самодиагностики. В нашем случае это не требуется. Достаточно признака конца записей.
     
  7. SNMar4enko

    SNMar4enko Нерд

    А зачем сохранять все 4 байта - достаточно только 1.
    double нужен только для совместимости форматов для функции ПИД
    а фактически там записывается целое число от 1 до 12

    И я применяю не конец записи FF а символ индикации инициализации - "C" в определенной ячейке - как потом получилось сокращение от "CFG" конфигурация

    Да и зачем копаться в состыковке переменных - если параллельно идет работа на перевод ПИД в целочисленный .... и потом все равно нужно будет пересостыковывать переменные - хотя без начальной инициализации памяти тяжело сразу разобраться и запустить станцию.
     
    Последнее редактирование: 11 май 2018
  8. Dmitrysh

    Dmitrysh Гуру

    Так как функция пишет байт, то из double пишется младший.
     
  9. SNMar4enko

    SNMar4enko Нерд

    нет не младший - а целая часть
     
  10. bamik

    bamik Нерд

    По идее, идет неявное преобразование типов из double в byte с потерей точности. Общепринято делать явное преобразование в таких случаях, чтобы другие читатели кода видели, что автор знает, что делает.
     
  11. SNMar4enko

    SNMar4enko Нерд

    double служит для хранения чисел с плавающей запятой. Этот тип часто используется для операций с данными, считываемыми с аналоговых входов. Диапазон значений — от -3.4028235E+38 до 3.4028235E+38. Переменная типа double занимает 32 бита (4 байта) в памяти.

    Тип double имеет точность 6-7 знаков, имеются ввиду все знаки, а не только мантисса. На платформе Arduino, double и float имеют одинаковую точность.
    При преобразовании в int или byte выделяется только целая часть
     
  12. Dmitrysh

    Dmitrysh Гуру

    Дело в следующем. При преобразовании из double в byte, если число больше чем 255 то записывается 255, если меньше то само число, если отрицательное то ноль. Если такая конструкция :
    Код (C++):
    double i=-123.75;
    int j;

    j=i;
    EEPROM.write(0,j);
    то записывается(для этого примера) 256-123=133, дробная часть отбрасывается. Для типа int подобное только там числа 2 байта и получается для числа 700 допустим, такая раскладка: 700-256-256=188
     
    Последнее редактирование: 11 май 2018
  13. Dmitrysh

    Dmitrysh Гуру

    Могу выложить, но там проблема с max6675. Выдаёт какую-то охинею.
     

    Вложения:

    • nano.zip
      Размер файла:
      22,1 КБ
      Просмотров:
      276
  14. Dmitrysh

    Dmitrysh Гуру

    Это не ошибка, если температура не выходит за 255. Если использовать методы get и put могут быть проблемы с адресацией.
     
  15. Dmitrysh

    Dmitrysh Гуру

    Не только ki и kd, они нас мало интересуют. Смотрите в код, на условие:
    Код (C++):
    bool PID::Compute()
    {
     
       unsigned long now = millis();
       unsigned long timeChange = (now - lastTime);
       if(timeChange>=SampleTime)     // если прошедшее время больше или равно SampleTime, а это 0,1с
       {
          /*Compute all the working error variables*/       рассчитываем пид
       
       }
       else return false; // иначе ничего не считаем и выходим из процедуры
     
    Таким образом, по переменной SampleTime рассчитывается время через которое будет делаться пересчёт ПИД.
    Смотрите на симуляцию. Зеленый график, расстояние между импульсами это время через которое пересчитывается ПИД. Используйте конструкцию SetSampleTime в процедуре Setup.
     

    Вложения:

    • pid_sample.jpg
      pid_sample.jpg
      Размер файла:
      139,8 КБ
      Просмотров:
      642
  16. SNMar4enko

    SNMar4enko Нерд

    - общим нужно снова возвращаться к анализу библиотеки чтобы избежать разногласий
     
  17. Dmitrysh

    Dmitrysh Гуру

    Не сомневайтесь, я её перелопатил вдоль и поперёк
     
  18. Dmitrysh

    Dmitrysh Гуру

    Там есть интересный режим P_ON_M, прочитайте про него.
     
  19. Dmitrysh

    Dmitrysh Гуру

    На вашем скетче 2,0,9 более 20 пересчётов в секунду не отжимается. И эти 20 не очень стабильные. Как то первые секунд 10 выжимает даже 73, а потом 20. Я использовал SetSampleTime(5) для разгона по максимуму.
    P.S. СОМ порт не использовал, "дёргал ногами"
     
  20. SOLOway

    SOLOway Гуру

    А mon каким-то иным образом представляет себе реализацию ПИД-алгоритма на AVR в контексте воздействия на источники излучения?
    Мне показалось, что snmar4enko оказал некое влияние на mvm_ksaa - автора-разработчика связки железо+контроллер+софт ПК, в следствии чего, несмотря на хроническое отсутствие свободного времени и стимулов, mvm_ksaa, возможно, пересмотрит некоторые моменты в софте в части его взаимодействия с силовым узлом...
    Кстати, концепция станции с Паяльника (v.2 от 4uvak), на мой взгляд, наряду с интересными моментами, все же имеет ряд недостатков. Самый бросающийся в глаза описан самим автором - он никогда не использует автомат на преднагреве и термопрофиль отрабатывает только ВИ, и только по своему датчику. Это очень печально.
    Внесу сумятицу в тему. Понимаю, что сейчас речь идет о реализации алгоритма. Но рано или поздно, придется столкнуться с прикладыванием алгоритма к железу. Здесь позволю себе напомнить, что ранее высказывался за наличие в конечном скетче пресетов, "заточенных" под конкретные связки типов нагревателей. Не получится сделать некоммерческий проект, одинаково гибкий в настройках относительно любых вариаций типов излучателей! Посему прошу всех участников не терять это из виду. Коммерческая версия никак не возбраняется, конечно, но она, понятно же, не появится здесь :)
     
Статус темы:
Закрыта.