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

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

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

    revolover Гик

    Поясните, отличие фазового от диммера. считал это одним и тем же. а вообще у меня самодельные твердотелки (оптосимистор с детектором 0 + симистор)
    Я так понимаю, что у меня диммер - верно? Как фазовое организовать? сменить моську на "без контроля 0"?
     
    Последнее редактирование: 25 июн 2018
  2. Dmitrysh

    Dmitrysh Гуру

    А зачем увеличивать длительность импульса? Вы же одновременно увеличиваете и опережение определения нуля. Это может стать проблемой. Смотрите, пришёл импульс от детектора, сработало прерывание, обработчик прерывания выполнил необходимые команды и вышел из прерывания. А сигнал от детектора ещё не снят, он длинный - мы опять попадаем в прерывание, опять обработчик обрабатывает и т.д. И пока мы в прерывании программа не работает. А нам это надо?
    Для справки.
    Если прерывание по восходящему фронту, то оно будет обработано на следующем такте микро процессора(т.е очень очень быстро).
    Если прерывание по спадающему фронту, то оно будет обработано после выполнения текущей команды, это нужно учитывать.
     
  3. Dmitrysh

    Dmitrysh Гуру

    Фазовое - открываем симистор на часть полупериода в пределах одного полупериода, но в каждом полупериоде. Диммер - открываем симистор на целый полупериод, но открываем его не на все полупериоды, т.е из 10 полупериодов открываем на 5 и получаем 50% мощности.
    Здесь словами сложно сказать, проще глянуть картинки в википедии или ещё где. Ничего сложного, просто надо увидеть.
     
  4. Dmitrysh

    Dmitrysh Гуру

    Вам только димер подходит.
     
  5. Dmitrysh

    Dmitrysh Гуру

    Знаете,вот здесь вопрос неоднозначный. По идее, второй раз в прерывание мы попадать не должны, но, должен отметить, у меня такое было на китайских mega-х.
     
  6. revolover

    revolover Гик

    Все отлично объяснили) Я естественно оба принципа прекрасно знаю, тольько словечко диммер смутило - считал, что это обобщенно к любым регуляторам мощности, хоть малоточным через потенциометр...
    Кстати википедия говорит, как я и думал https://ru.wikipedia.org/wiki/Диммер
    Вот и запутался.
     
    Последнее редактирование: 25 июн 2018
  7. alsh_0907

    alsh_0907 Нерд

    Посмотрите код в теме "Многоканальный Dimmer, работающий в фоновом режиме". Мне очень понравилась реализация. Таймер, открывающий симисторы начинает работать только после перехода синусоиды через ноль, так что никаких ложных открываний симисторов быть не должно, да и не разу не наблюдал их за 2 года эксплуатации.
    Вот кусок кода с моего регулятора
    Код (C++):
    void setup() {
      pinMode (14, OUTPUT);                //выход А0 на фототиристор первого диммера (нижний подогрев)
      pinMode (15, OUTPUT);                //выход А1 на фототиристор второго диммера (нижний подогрев)
      pinMode (16, OUTPUT);                //выход А2 на фототиристор третьего диммера (верхний подогрев)
      bitWrite(PORTC, 0, 0);               //PORTC0 - выход А0
      bitWrite(PORTC, 1, 0);               //PORTC1 - выход А1
      bitWrite(PORTC, 2, 0);               //PORTC2 - выход А2
      attachInterrupt(0, detect_up, LOW);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
      Timer1.initialize(40);               // Интервал срабатывания таймера в мкс
      Timer1.attachInterrupt(halfcycle);   //будет вызыватся каждый раз при отсчете заданого времени
      Timer1.stop();
    }

    void halfcycle() { //прерывания таймера
      tic--; //счетчик
        if (dim[0] > tic )  bitWrite(PORTC, 0, 1);
        if (dim[0] > tic )  bitWrite(PORTC, 1, 1);
        if (dim[2] > tic )  bitWrite(PORTC, 2, 1);
    }

    void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту
    {
      tic = 200;           //обнулить счетчик
      Timer1.resume();   //запустить таймер
      attachInterrupt(0, detect_down, HIGH);  //перепрограммировать прерывание на другой обработчик
    }

    void detect_down() {// обработка внешнего прерывания. Сработает по заднему фронту
      Timer1.stop(); //остановить таймер

      bitWrite(PORTC, 0, 0); //PORTC0 - выход А0
      bitWrite(PORTC, 1, 0); //PORTC1 - выход А1
      bitWrite(PORTC, 2, 0); //PORTC2 - выход А2
      tic = 210;   //обнулить счетчик

      attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
    }
     
  8. alsh_0907

    alsh_0907 Нерд

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

    SOLOway Гуру

    Вложения:

  10. Moretti

    Moretti Нуб

    собрал и законектил мегу 2560+2004 без i2c шины не могу кнопки прикрутить ( хоть тресни кнопочки простые подключаю на макетной плате с подтяжкой 10 ком резистором 4 штуки не хотят работать как только нажатие происходит на экране белеберда какая то, оставляешь одну кнопку все ок как только подключаешь остальные все уехало ( 2й день не могу подключить ((
    а переписать скеч под аналоговые у меня мозгов не хватит скеч использую вот этот
     

    Вложения:

  11. Moretti

    Moretti Нуб

    еще раз подключил заметил закономерность кнопоки как будто зажаты а когда даешь на профиль то белеберда на экране
     
  12. SOLOway

    SOLOway Гуру

    Это зачем?
    Скетч из какого поста правили под себя?
    Кнопки-то мультиметром прозвоните, вдруг они у вас подключены "нормально замкнуто"...
     
  13. revolover

    revolover Гик

    Вы случаем не знаете где у нас скетч под аналоговые кнопки + дисп 480х320 + "диммер"?
     
  14. SOLOway

    SOLOway Гуру

    Вот такой, скорее всего: тут
    Позднее я не встречал в постах, а Dmitrysh классические кнопки применяет.
     
    Последнее редактирование: 16 дек 2018
  15. Moretti

    Moretti Нуб

    Прозванивал кнопки новые нормальные скетч выше скидывал
     
  16. SOLOway

    SOLOway Гуру

    Вот вам трудно указать из какого поста скетч, а нам возьми да перечитывай его? Нет-бы указать пост и указать что конкретно меняли... Зачем подтягиваете кнопки внешними резюками? - ведь в скетче прописано:
    Код (C++):
    //setup pins as input for buttons
      pinMode (upSwitchPin, INPUT);
      digitalWrite(upSwitchPin, HIGH); //подключаем подтягивающий резистор
      pinMode (downSwitchPin, INPUT);
      digitalWrite(downSwitchPin, HIGH); //подключаем подтягивающий резистор
      pinMode (cancelSwitchPin, INPUT);
      digitalWrite(cancelSwitchPin, HIGH); //подключаем подтягивающий резистор
      pinMode (okSwitchPin, INPUT);
      digitalWrite(okSwitchPin, HIGH); //подключаем подтягивающий резистор
      pinMode (buzzerPin, OUTPUT);
    И почему не сделать так:
    Код (C++):
    //Назначаем пины кнопок управления
    byte upSwitchPin = 8;
    byte downSwitchPin = 9;
    byte cancelSwitchPin = 10;
    byte okSwitchPin = 11;
    А пищалку:
    Код (C++):
    byte buzzerPin = 30;
    Кстати, пин 30 занят дисплеем, вроде. И как вы его под кнопку или буззер задействуете?: https://yandex.ru/images/search?text=подключение tft 480x320&img_url=http://iarduino.ru/img/upload/ccf67326622b7aa25021997bc4667a81.jpg&pos=35&rpt=simage&lr=213

    А MAX6675 так:
    Код (C++):
    //назначаем пины уселителя термопары MAX6675 "НИЖНЕГО" нагревателя clk=sck cs=cs do=so
    byte thermoCLK2 = 53;  //=sck
    byte thermoCS2 = 47;   //=cs
    byte thermoDO2 = 51;   //=so
    //назначаем пины уселителя термопары MAX6675 "ВЕРХНЕГО" нагревателя   clk=sck cs=cs do=so
    byte thermoCLK = 53;  //=sck
    byte thermoCS = 49;   //=cs
    byte thermoDO = 51;   //=so
    Вернусь к своему вопросу о крайнем скетче snmar4enko: глюк с вкл. нагревателей в режиме простоя, при отсутствии сигналов с ZCC, на соседнем форуме mon предложил убрать так:
    Может, кто подскажет? - архив со скетчем, либами и пояснениями - выше.
     
    Последнее редактирование: 26 июн 2018
  17. revolover

    revolover Гик

    А когда в простое включается нагреватель на пине управляющем есть потенциал? Может силоввая часть шалит?
    Пин на gnd подтянут?

    Я когда детектор нуля собрал - на выходе получил 50 импульсов/сек. Глаза не верили, быть такого не могло, детали исправны. Осликом потыкал и тупо дошло, с базы на минус по флюсу утечка... Промыл - всё как надо заработало (100 импульсов).
     
    Последнее редактирование: 26 июн 2018
  18. SOLOway

    SOLOway Гуру

    Нет силовой - вместо неё только LED с ограничительным резистором. Лишь с ZCC подключенным этот пин D3 (выход НИ) замолкает.
    В скетче так:
    Код (C++):
    void setup()
    {
      D4_Out; D3_Out; //верхний и нижний выходы нагревателей
      D4_Low; D3_Low; //верхний и нижний выходы установить на выходах низкий уровень сигнала
      D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
    Причем на разных платах arduino поведение D3 одинаково
     
  19. revolover

    revolover Гик

    Даже и не знаю, у самого пока в коде ардуины глаза разбегаются, нужно язык подучить...
     
  20. revolover

    revolover Гик

    Загрузил скетч из этого поста http://forum.amperka.ru/threads/ИК-паяльная-станция-на-arduino-mega-2560-Доработка-скетча-ars_v2_lilium_jsn.10176/page-29#post-155318

    Кнопки под свои значения подстроил.
    Подключил свой детектор. Во всяком случае ардуина на прерывании импульсы воспринимает без пропусков вроде.
    Подключил светодиод на порт НИЗА.
    Поставил в ПИД 1 1 0
    И был мягко говоря в шоке:
    При разнице температур текущая 0 уставка 100
    Мощность до 100% возросла секунды за две!
    Тоесть I накопилась до предела всего за две секунды.
    Понятно, что ошибка в целых 100 градусов, Но при минимальном значении такого не должно быть!
    За время роста с комнатной до уставки I должна накопиться равная мощности поддержания.
    Выходит что алгоритм ПИД не отстроен под входные параметры настроек.

    Если так во всех скетчах, то Интегральная составляющая будет устраивать однозначные перелеты((((
    Ведь по достижению уставки мощность будет равна 100%, и снижаться будет только при превышении.
     
    Последнее редактирование: 26 июн 2018
Статус темы:
Закрыта.