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

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

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

    Dmitrysh Гуру

    Это все ПИД.
    Я раньше писал, но никто не обратил внимание. Я и сам об этом думаю, но пока решения не пришло. Суть вот в чём. Нужно организовать третий ПИД, который будет следить не за температурой, а за скоростью роста температуры, т.е первой производной температуры по времени. На входе пида - разница между последними двумя измерениями температуры, желаемая скорость роста и коэффициенты. На выходе - рассчитанная мощность.
    Пользоваться как и в предыдущем случае. До зоны пропорциональности работает ПИД по скорости роста, далее подключаем ПИД по температуре.
     
    SOLOway нравится это.
  2. SOLOway

    SOLOway Гуру

    Та же идея у меня в голове и крутилась, когда ваши посты перечитывал :)
     
  3. revolover

    revolover Гик

    ВНИМАНИЕ!
    Я извиняюсь, массу последних постов не перечитал, может это уже обсуждали.
    Максимально 12 раз в секунду - этот параметр не жестко привязан ко времени? Он не по прерыванию выполняется? Дело в том, что период хоть раз в минуту, хоть 1000 раз в секунду, как задан, так и должен выполняться! Никакого плавания. Иначе, неизбежно, плавающая выходная мощность!
    У кого плавала? - обратите внимание.
     
  4. Dmitrysh

    Dmitrysh Гуру

    В данном случае это максимум без привязки ко времени. Это я эксперимент ставил. А вообще все четко по времени, через равные промежутки.
     
  5. SOLOway

    SOLOway Гуру

    Когда LDZ мутил свою станцию, volodim нарисовал её схему, чтоб всем понятнее стало. И лежит эта схема прямо здесь. А, вот посмотрите, как там силовая устроена ;)
    P.S.: Была еще разработка ИК станции от miron63 - архив здесь. У него тоже софт для ПК есть, там только вывод графиков. Нам он чем-то может стать полезен? (exe-файл его софта распаковывается в несколько файлов и папку с подпапками...)
     

    Вложения:

    • Desktop.zip
      Размер файла:
      48,1 КБ
      Просмотров:
      375
    Последнее редактирование: 24 май 2018
  6. Dmitrysh

    Dmitrysh Гуру

    А в чем особенность? У меня также в принципе. Единственное не увидел детектора ноля.
     
  7. SOLOway

    SOLOway Гуру

    Это тоже, а еще у него оптосимисторы без ZCC, а мы с этого поста vector99 ориентируемся на SSR и их аналоги самодельные, которые ZCC имеют.
     
  8. Dmitrysh

    Dmitrysh Гуру

    Я, допустим, сам силовую часть собирал - MOC3021 + BTA139 и отдельно ZCC на 4n25. Можно использовать SSR которые ZCC имеют только в скетче с димером. Для фазового управления они не годятся. Но детектор ноля все равно нужен, какой бы тип управления мы не использовали. Странно что LDZ детектор ноля не использовал, может в схеме ошибка.
     
  9. SOLOway

    SOLOway Гуру

    Да, нет, вроде - эта схема по многим форумам гуляет, платы силовые разных вариантов попадались, и те и другие оптосимисторы народ ставил, как-то умудрялись же настраивать... Замеров-то нет нигде, как понять, работает оно корректно вообще?
    Вот еще от sanderman, например
     
  10. xake

    xake Нерд

    а формат данных, передаваемых через COM порт, как узнать?
     
  11. SOLOway

    SOLOway Гуру

    Там в архиве есть проект для Proteus старой версии (год-то 2010 был!). Тогда miron63 спросил у LDZ о протоколе обмена между его контролером и софтом IrSoft 2.14 и LDZ ответил, что, мол , не знает и "AVR шлет своих попугаев, а IrSoft в ответ шлет своих". Какой протокол использовал в итоге miron63 - он не сообщил. Если только Proteus поможет разобраться...
     
  12. Dmitrysh

    Dmitrysh Гуру

    В теме был софт с открытым кодом, я его цеплял к нашему скетчу, можете использовать. Могу более свежую версию выложить.
     
  13. Dmitrysh

    Dmitrysh Гуру

    Вот что писали на одном из форумов
     
  14. SOLOway

    SOLOway Гуру

    Буду вам очень благодарен!
    Да, помню, читал этот пост.
    Вот в этой теме автор-разработчик mon применил ФИУ симисторами с точным заданием угла открытия 0-180*. На первой же странице он ответил на вопросы по ZCC и пр.
     
  15. Простая автоматика на Ардуино Мега 2560 из готовых элементов (http://forum.homedistiller.ru/index.php?topic=118519.0)

    Принципиальная детектора нуля. Решил продублировать, хотя замечал в начале темы версии vector99 с диммером и контролем перехода нуля сетевого напряжения
    [​IMG]
    Также на этой странице прошивки - http://forum.homedistiller.ru/index.php?topic=118518.0
    На сайте много полезной информации. Надеюсь поможет начинающим и уже опытным, сам почерпну для себя инфу
     
    Последнее редактирование: 25 май 2018
  16. Работа с еепром. Смотрю код HelloDistiller305i.ino
    Код (C++):
    unsigned int ee_addr; // Переменная для хранения текущего адреса чтения/записи в EEPROM
    unsigned char eeReadChar()
    {
      unsigned char lByte = EEPROM.read(ee_addr);
      ee_addr++;
      return lByte;
    }

    void eeWriteChar(char p_value)
    {
      if (EEPROM.read(ee_addr)!=p_value)
        EEPROM.write(ee_addr, p_value);
      ee_addr++;
    }

    void eeWriteInt(int p_value)
    {
      unsigned char lByte = (unsigned char) (p_value);
      unsigned char hByte =(unsigned char) (p_value >> 8);

      // Для экономии ресурса флеш памяти, сначала проверяем ее содержимое и запись производим только если значение отличается.
      eeWriteChar(lByte);
      eeWriteChar(hByte);
    }

    //This function will read a 2 byte integer from the eeprom at the specified address and address + 1
    unsigned int eeReadInt()
    {
      unsigned char lByte = eeReadChar();
      unsigned char hByte = eeReadChar();
      return (unsigned int) (lByte) | (unsigned int)  (hByte << 8);
    }
     
  17. реализован алгоритм Брезенхема о котором мне уже намекали
    Код (C++):
    void bresenham_Init(char n, unsigned char sz)
    {
      b_size[n] = sz;
      b_error[n] = b_size[n]/2;
      b_stepNumber[n] = 0;
      b_value[n] = 0;
    }

    boolean bresenham_getNext(char n)
    {
      boolean result;
      b_error[n] -= b_value[n];
      if ( b_error[n] < 0 )
      {
        b_error[n] += b_size[n];
        result = HIGH;
      }
      else
      {
        result = LOW;
      }

      if ( ++b_stepNumber[n] >= b_size[n]) {
        b_stepNumber[n] = 0;
        b_error[n] = b_size[n]/2;
      }
      return result;
    }        
     
    Последнее редактирование: 25 май 2018
  18. Dmitrysh я почти уверен что в этом коде реализоан целочисленный пид. Думаю вы согласитесь что NeedTemp, FactTemp лучше сделать byte. Кому более 255 гр нагрев достаточно оставить как есть
    Код (C++):
    // Процедура осуществляет ПИД регулирование температуры.
    // В качестве результата возвращается коэффициент мощности, умноженный на 1000, то есть
    // 1000 - это 100% подача мощности на ТЭНы.
    void ProcessPIDTemp(int NeedTemp, int FactTemp)
    {
        NewErrTemp=(NeedTemp-FactTemp);
        DtTemp=NewErrTemp-OldErrTemp;
        ItTemp=ItTemp+NewErrTemp;
     
        if (ItTemp<-1000) ItTemp=-1000;
          else
            if (ItTemp>1000) ItTemp=1000;
         
        OldErrTempOut=OldErrTemp; // Запоминаем старую ошибку.
        OldErrTemp=NewErrTemp; // Запоминаем старую ошибку.
        // Считаем коэффициент температуры
        KtT=((long)PIDTemp[0]*NewErrTemp*8 + (long)PIDTemp[1]*ItTemp/10+(long)PIDTemp[2]*DtTemp*10)/10;
        #ifdef TEST
          Serial1.print("Ktt:");
          Serial1.println(KtT);
        #endif
        if (KtT>1000) KtT=1000;
        if (KtT<0) KtT=0;
    }
     
    Более 10 тыс строк кода, что мог просмотрел...
     
    Последнее редактирование: 25 май 2018
  19. SOLOway

    SOLOway Гуру

    Aleksander1997 Я уже неоднократно поднимал вопрос о схемотехнике детектора и предлагал ознакомиться с этой темой.
    На некоторые темы с того форума самогонщиков я и ранее на других форумах ссылался - там есть много интересного, в т. ч. и о промышленных ПИД-контроллерах, и о регулировке мощности...
    Я собирал разные схемки. Вам приходилось настраивать аналоговые схемы? В правильном детекторе важны: а) стабильность, б) помехозащищенность, в) совместимость с кодом (можно кодом поправить).
    Я не умею работать с программами-симуляторами, поэтому собираю схемки и делаю замеры. Жаль времени свободного за недорого негде прикупить... Простейшие схемки, а также те, что не синхронизированы со встроенным в SSR элементами ZCC не могут работать корректно, увы :(.
    Кстати, ваша разработка вами позиционируется в качестве универсальной, или, все-таки завязана на конкретные типы излучателей?
     
    Последнее редактирование: 25 май 2018
  20. Dmitrysh

    Dmitrysh Гуру

    Для функционирования программы добавляем в скетч следующее
    1. в секцию определений
    Код (C++):
    //секция ввода/вывода для ПЭВМ
    char buf[20];   //буфер вывода сообщений через сом порт
    char buf1[70];  //буфер вывода праметров через сом порт
    String ttydata; //принятая строка параметров с сом порта от ПЭВМ
    2. Перед процедурой void setup () добавляем парсер параметров
    Код (C++):
    void ParseParameters ()
    {
      String st;
      sprintf (buf, "TXRecive Params%02d\r\n",ttydata.length());
      Serial.print(buf);
      st = ttydata.substring(0,1);
      EEPROM.write((currentProfile - 1) * 29, st.toInt());
      st = ttydata.substring(1,2);
      EEPROM.write(((currentProfile - 1) * 6 + 202), st.toInt());
      st = ttydata.substring(2,5);
      EEPROM.write((currentProfile - 1) * 29 + 1, st.toInt());
      st = ttydata.substring(5,8);
      EEPROM.write(((currentProfile - 1) * 6 + 203), st.toInt());
      st = ttydata.substring(8,11);
      EEPROM.write(((currentProfile - 1) * 6 + 204), st.toInt());
      for (int i = 0; i < 3; i + 1) {
              st=ttydata.substring(11+i*2,13+i*2);
              EEPROM.write(((currentProfile - 1) * 29 + i + 2), st.toInt());
              i++;
            }
      for (int i = 0; i < 3; i + 1) {
              st=ttydata.substring(17+i*3,20+i*3);
              EEPROM.write(((currentProfile - 1) * 29 + i + 8), st.toInt());
              i++;
            }
      for (int i = 0; i < 3; i + 1) {
              st=ttydata.substring(26+i*3,29+i*3);
              EEPROM.write(((currentProfile - 1) * 29 + i + 11), st.toInt());
              i++;
            }
      for (int i = 0; i < 3; i + 1) {
              st=ttydata.substring(35+i*3,38+i*3);
              EEPROM.write(((currentProfile - 1) * 29 + i + 14), st.toInt());
              i++;
            }
      for (int i = 0; i < 3; i + 1) {
              st=ttydata.substring(44+i*3,47+i*3);
              EEPROM.write(((currentProfile - 1) * 29 + i + 5), st.toInt() / 5);
              i++;
            }
      st=ttydata.substring(53,55);
      EEPROM.write(((currentProfile - 1) * 6 + 175), st.toInt());
      st=ttydata.substring(55,57);
      EEPROM.write(((currentProfile - 1) * 6 + 172), st.toInt());
      st=ttydata.substring(57,59);
      EEPROM.write(((currentProfile - 1) * 6 + 176), st.toInt());
      st=ttydata.substring(59,61);
      EEPROM.write(((currentProfile - 1) * 6 + 173), st.toInt());
      st=ttydata.substring(61,63);
      EEPROM.write(((currentProfile - 1) * 6 + 177), st.toInt());
      st=ttydata.substring(63,65);
      EEPROM.write(((currentProfile - 1) * 6 + 174), st.toInt());
      ttydata="";
      loadProfile();
      updateScreen=true;
    return;
    }
    3. блок обработки данных с ПЭВМ (он находится в loop)
    Код (C++):
            nextRead1 += SENSOR_SAMPLING_TIME;
            Input1 = filter1(max6675_read_temp (thermoCLK, thermoCS, thermoDO));
            Input2 = filter2(max6675_read_temp (thermoCLK, thermoCS2, thermoDO));
            tc1 = Input1;
            tc2 = Input2;
           
    //блок обработки данных с ПЭВМ--------------------------------------------------------------------
    int b1,b2=0;
        b2=Serial.available();
        if (b2 > 0) {
         
        b1 = Serial.read();
        if ((b1 == 'P') ) {
          sprintf (buf, "TXSend Params\r\n");
          Serial.println(buf);
          delay(20);
          loadProfile();
        }
          if (b1=='N') {
          ttydata=ttydata+Serial.readString();
          sprintf (buf, "TXRecive Params%02d\r\n",b2);
          Serial.println(buf);
          Serial.println("TX"+ttydata);
          if (ttydata.length()==65)
                  {
                    Serial.println("TXParsing...\r\n");
                    ParseParameters();
                  }
          if (ttydata.length()>65)
          {
            ttydata="";
            Serial.print("TXERROR on reciever");
          }
         }
       }
          sprintf (buf, "OK%03d%03d%03d%03d%03d\r\n", int(Output1), int(Output2), tc1, tc2, int(profileName));
          Serial.print(buf);
    //--------------------------------------------------------------------------------------------------  
    старый sprintf (buf, "OK%03d%03d... заменить на тот что у меня сейчас(последние 2 строки в коде выше).

    4. заменить в блоке режима пайки старый sprintf(в коде ниже это две последние строки)
    Код (C++):
    if (reflowStatus == REFLOW_STATUS_ON)
         {
        if (millis() > nextRead1)
         {
          Input1 = filter1(max6675_read_temp (thermoCLK, thermoCS, thermoDO));
          Input2 = filter2(max6675_read_temp (thermoCLK, thermoCS2, thermoDO));
          tc1 = Input1;
          tc2 = Input2;

       
          sprintf (buf, "OK%03d%03d%03d%03d%03d\r\n", int(Output1), int(Output2), tc1, tc2,int(profileName));
          Serial.print(buf);
     

    Вложения:

    • irsp.zip
      Размер файла:
      290,8 КБ
      Просмотров:
      391
Статус темы:
Закрыта.