Помогите пожалуйста с кодом.

Тема в разделе "Arduino & Shields", создана пользователем olegoriy, 9 авг 2015.

  1. olegoriy

    olegoriy Гик

    Код для управления семистором. Чтобы он открывался в определенный момент волны напряжения в сети.
    вот схема все сегодня собрал а как код написать не осталось мыслий
    может завтра отдохну и придумаю
    просто хотелось совета в каком направлении думать
    [​IMG]

    http://www.embed.com.ua/mikrokontro...fazoimpulsnoe-upravlenie-silovyim-simistorom/
    больше чем это пока в голову не чего не приходит:
    Код (Text):
    int x = 400;
    #define SPIED 3
    #define SET 4


    void setup() {
    pinMode(SPIED,OUTPUT);
    pinMode(SET,INPUT_PULLUP);
    }

    void loop() {
    if(digitalRead(SET)== HIGH){
      delayMicroseconds(x);
      digitalWrite(SPIED, HIGH);
      digitalWrite(SPIED, LOW);
      };


    }
    Буду рад любым советам)
     
  2. 9xA59kK

    9xA59kK Гик

  3. olegoriy

    olegoriy Гик

    Спасибо.
    Чет слишком много неизвестного там. Пытаюсь понять код. Но смотрю в книгу вижу фигу. Слишком много неизвестных мне операторов. Смотрел и простой, и все равно логику работы не пойму.(печалька) Сбивают с толку библиотеки которые не пойми как работают.
    Убил весь сегодняшний день, на то что разбирался. В конце дня оказалось что в моей опто развязке у транзистора на выходе перепутаны эмитор с коллектором . Весь день к черту.
    Но пока сдаваться не собираюсь:eek:
     
  4. olegoriy

    olegoriy Гик

    Если интересно есть фото начального проекта:
    [​IMG]
     
  5. DrProg

    DrProg Вечный нерд

    Если не секрет что это будет и для чего?
     
  6. olegoriy

    olegoriy Гик

  7. 9xA59kK

    9xA59kK Гик

    Это готовый скетч управление от 220В , управление симистором. Я его опробовал нормально работает. И для регулирования двигателем должен подойти.
    А насчет "много неизвестного" - дак оно всегда так, зато позже все будет как по маслу.
    А что там тебе не понятно, единственное что там есть нового это обработка прерывания -attachInterrupt , все остальное старое(объявление переменых и выходов.).
    Грузи мозг - он резиновый. Вот тут описано как это дело работает. И скетч другой без библиотеки - он тебе будет понятный.
     
    Последнее редактирование: 13 авг 2015
  8. 9xA59kK

    9xA59kK Гик

    И еще нужен контроль по току и температуре на двигателе- это в части защиты двигателя.
     
  9. olegoriy

    olegoriy Гик

    Спасибо за совет.
    В целом я понимаю как все работает. И с кодом можно сделать все проще. Без прирываний.
    Просто - контроллер узнал что произошла точка перехода через ноль - подождал сколько надо - выдал импульс на семистор.
    Проблема у меня в другом. Семистор ведет себя как попало. Возможно использую не тот тип семисторов.
     
  10. 9xA59kK

    9xA59kK Гик

    А что за семистор то? Я пробовал на BT138 и BTA16 работает нормально. Без прерываний у тебя нормально работать не будет. На нем организованно точное(более менее) отсчет времени, а если ты просто в LOOP будешь пытаться открыть семистор , то он всегда будет в разное время открываться.
     
  11. olegoriy

    olegoriy Гик

    Семисторы BTA12 и BTB16 .
    По ходу дела я нашел причину.
    С контороллера у меня все норм выходит.
    При отключении семистора и прпуск через оптопару 12 волт переменки все режеться как положено, уже оптопарой.
    Посмотрел ее характеристики и там уже в ней стоит какойто модуль который определяет момент нуля.
    Может это и влияет на работу семистора.
    Оптопара MOC3061 , думаю если поставлю MOC3023 то будет все в порядке.
    Код заливаю тот который вы преводили в пример.(спасибо)
     
  12. 9xA59kK

    9xA59kK Гик

    Ну да надо без контроля нуля тип MOC3052. MOC3023 по напряжению маловато - всплески в сети бывают приличные надо всегда брать с запасом.
    На схеме у тебя нарисован BT137, но как я понял это тиристор(может ошибаюсь).- да ошибся, проверил, симистор

    ps/ на тему с запасом: Ко мне друган заходит и спрашивает- чего это у него в ванной комнате лампочки взрываются. еще говорит что, я мол поставил блок защиты, который ему в магазине впарили, а он тоже сгорел и лампу не спас. Пришел я к нему домой, померил тестиром, а там 235V, а на лампочке написано 230V.
    PS\ ради интереса посмотрел сейчас, в розетке 227V.
     
    Последнее редактирование: 13 авг 2015
  13. olegoriy

    olegoriy Гик

    Да схема левая просто для примера.
     
  14. olegoriy

    olegoriy Гик

    Ну я думаю, что оптопара сильно в процессе с нагрузкой не учавствует или можно увеличить сопротивления.
    Дело не в этом я когда покупал запчасти спрашивал именно MOC3023 а негодяй продавец заверил меня что разницы абсолютно не какой нет.
    По этому я на оптопару и не грешил даже.
    Три дня не о чем!!
     
  15. 9xA59kK

    9xA59kK Гик

    В этом деле спешить не надо , как говориться "семь раз отмерь"..., процесс творческий.
     
  16. olegoriy

    olegoriy Гик

    Добрый день.
    Вы мне очень помогли, поэтому думаю не откажете еще в паре моментов.
    В обшем у меня все получилось. Барабан машинки вращается в разные стороны и с разной скоростью. ( Просто шепчет.)
    Теплуха и защита от перегруза стоит в самом двигателе еще на всякий случай поставил реле которое скидывает полностью питания с движка.
    Теперь о плохом.
    При определенной скорости и при разной загруженности барабана бельем, он(барабан) ведет себя по разному. То есть при большой загруженности крутиться медленно при (скажем заначении 150) и при том же значении, пустой крутиться очень быстро.
    Как я понял мне нужно в коде что то типа ПИД регулятора.
    Вот тут у меня и возник вопрос.
    Правильно ли я понял как работает этот ПИД?
    Постоянно считываем значение с тахо датчика(энкодера) и если мало оборотов то добавляем мощности, если много то убавляем мощность.
    Если я правельно понимаю происходящее то возникает еще вопрос.
    На кой так все сложно??
    Код (Text):
    // Timer1 output compare A interrupt service routine
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    signed char E,Ep; //Временные переменные для работы алгоритма.
    signed int Y,Ei;

    taxo=imp2; //Сколько посчитали импульсов, то и будет тек. скоростью

    //Тут у нас обработчик PID
    E=skorost-taxo; //Сумматор обратной связи
    Ep=E; //Обрабатываем пропорциональное звено
    if (Ep<0) {Ep=0;}; //Если сумматор вернул отриц. число - сбрасываем в ноль

    S=S+E; // Интегральная сумма
    if (S>73) {S=73;}; //Ограничиваем верхний предел.
    if (S<0) {S=0;}; //Ограничиваем нижний предел.

    Ei=taxo-Eo; //Разница с предыдущим показанием сумматора обратной связи.
    if (Ei<0) {Ei=0;}; //Меньше нуля быть не должно.
    if (Ei>73) {Ei=73;}; //Больше кол-ва скоростей тоже.
    Eo=taxo; //Сделали текущее показание предыдущим

    Y=Yn[Ep]+Yi[S]+Yd[Ei]; // Сумматор ПИД регулятора

    if (Y<0) {Y=0;}; //Скорость не может быть отрицательной.
    if (Y>220) {Y=220;}; //И больше 220 значений мощности.

    speed=Y; //Выводим заданную мощность на мотор

    }
    Не проше ли прописать двумя строками: если частота меньще то мощность больше и наоборот?
    Если я ошибаюсь то плиз объясните куда этот код вставлять В луп или в сетап или в разные части? И не будет ли таймер в этом коде мешать таймеру в коде для семистора?
     
  17. olegoriy

    olegoriy Гик

    Или еще проще. Делаем пробную раскрутку, узнаем сколько беля, выводим коофициент который применяем на весь цикл.
     
  18. 9xA59kK

    9xA59kK Гик

    По этой же причине на новой стиралке у меня не работает один режим(деликатной стирки), что то не расчитали разработчики.
    Нет, не проще. Это самое простое. Представь что будет если например обороты двигателя упадут до "0", что будет делать программа в которой этого не учтено. Или наоборот раскрутился двигатель до 500 оборотов а в программе нету ограничения , так он продолжит раскручивать до бесконечности.

    Можно ступенчатое регулирование написать т.е.
    Раскручиваем барабан до необходимых оборотов(таходатчик), но неболее чем Z- зона в пределах которой будет крутиься двигатель. Если обороты падают меньше чем ... то увеличиваем мощность на например 5% и так еще три ступени на 10% и 15%. А можно и ПИД замутить желательно с зоной нечувствительности. Формула ПИД не сложная если одноимпульсный регулятор( т.е. один датчик). Я ПИД еще не собирал.
    Вот немного ПИД, Немного теории , ЕЩЕ пример , ЕЩЕ

    PS\ Программа будет очень замысловатая, надо много учесть. Например во время программы стирки включать реверс только после остановки барабана.
     
    Последнее редактирование: 17 авг 2015
  19. 9xA59kK

    9xA59kK Гик

    Ну а как это поймет контроллер, он же не знает что это пробная раскрутка и тем более сколько там белья - если только там нету весов(или еще чего). Да и на весь цикл никак не получится, белье в самом начале стирки сухое , полусухое и мокрое, а в это время двигатель крутит барабан с определенными оборотами. Потом в конце будет отжим там все наоборот.
     
  20. Vivan755

    Vivan755 Нерд

    Кто подскажет, какая оптопара подойдёт для управления тиристором? Обычным несимметричным тиристором вроде КУ202Н. Оптопары вроде MOC3023 ил 3061 заявлены как «оптопара с симисторным выходом», они подойдут?
    Я собираюсь собрать повёрнутый мост из четырёх тиристоров и сделать на нём делитель частоты для регулирования оборотов однофазных асинхронников. Так я это вижу в теории, цифры слева — какие частоты будут получаться, белые полупериоды — открытие «прямых» тиристоров, закрашенные — «крестовых».
    https://pp.vk.me/c631322/v631322419/3809c/6ZcUrHvB1cE.jpg