Плавное управление сетевым напряжением. Arduino, Espruino.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 23 янв 2016.

  1. ИгорьК

    ИгорьК Гуру

    Эта тема - компиляция решений, с сайта Insrtructables раз, два и уважаемого Пушного Звера.
    Что заставило действовать? Железную часть можно чуть упростить, а вот код управления - требовал пересмотра, поскольку delay() в функции прерывания - это не комильфо.
    Не устраивало и применение функций из библиотеки Timer1.

    Работает так:



    Соединения Ардуино Про Мини: D3 - вход от детектора нуля, А1 - выход для управления триаком.
    Код такой:

    Код (C++):

    // Arduino Pro Mini - Atmega328P https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf
    // INT1 - PD3. Нога для подключения детектора перехода
    // A1 - PC1. А1 - управление триаком.

    #include <avr/interrupt.h>
    volatile unsigned int myPWM = 161;  //Сейчас выключено.  Включено максимально - 159
    // volatile uint8_t sreg;                // Переменная для запоминания регистра SREG

    ISR(TIMER1_COMPA_vect ){            // Отработка прерывания Timer1 по сравнению с регистром OC1A
        PORTC |= ( 1 << PC1 );            // Установка A1 в 1
    }

    ISR(INT1_vect) {
        PORTC &= ~( 1 << PC1 );            // Сброс A1 в 0
        // sreg = SREG;                    // Запомнили  состояние общего флага прерываний
        // cli();            
        TCNT1 = myPWM;
        // SREG = sreg;
    }

    void setup() {

        // Port C - инициализация. PC1 - нога A1 Arduino
        // Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=In
        DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (1<<DDC1) | (0<<DDC0);

        // Timer/Counter 1 инициализация
        // Clock source: System Clock
        // Clock value: 16,000 kHz
        // Mode: Normal top=0xFFFF
        // OC1A output: Disconnected
        // OC1B output: Disconnected
        // Noise Canceler: Off
        // Input Capture on Falling Edge
        // Timer Period: 4,1943 s
        // Timer1 Overflow Interrupt: Off
        // Input Capture Interrupt: Off
        // Compare A Match Interrupt: On
        // Compare B Match Interrupt: Off
        TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
        TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
        TCNT1H=0x00;
        TCNT1L=0x00;
        ICR1H=0x00;
        ICR1L=0x00;
        OCR1AH=0x00;
        OCR1AL=0xA0;
        OCR1BH=0x00;
        OCR1BL=0x00;

        // Timer/Counter 1 Interrupt(s) initialization
        TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (1<<OCIE1A) | (0<<TOIE1);
        // External Interrupt(s) initialization
        // INT0: Off
        // INT1: On
        // INT1 Mode: Rising Edge
        // Interrupt on any change on pins PCINT0-7: Off
        // Interrupt on any change on pins PCINT8-14: Off
        // Interrupt on any change on pins PCINT16-23: Off
        EICRA=(1<<ISC11) | (1<<ISC10) | (0<<ISC01) | (0<<ISC00);
        EIMSK=(1<<INT1) | (0<<INT0);
        EIFR=(1<<INTF1) | (0<<INTF0);
        PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);

        Serial.begin(9600);

        // Разрешаем прерывания
        sei();
    }

    void loop() {

        /*  Для тестирования максимального значения myPWM
        for(myPWM = 155; myPWM <165; myPWM ++) {
            Serial.print("PWM: ");
            Serial.println(myPWM);
            delay(1000);
        }
        */


        /* Играем светом */
        for(myPWM = 5; myPWM <60; myPWM ++) {
            delay(50);
        }

        for(myPWM = 59; myPWM >4; myPWM --) {
            delay(50);
        }
        /**/
    }
     
    Пояснения и схема - в следующем посте. Хотя можно воспользоваться железом Пушного Звера. Практически то же самое.
     
    Последнее редактирование: 4 ноя 2016
    Un_ka, Onkel и Пушной звер нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Схема, которая работает:
    112233.jpg

    Схема, которая должна работать. Пока у меня такого реле нет - не проверял, но, надеюсь, в ближайшую неделю проверю.
    332211.jpg
    То есть, схема может быть сведена к тердотельному реле, оптрону и двум резисторам.
     
    Последнее редактирование: 12 янв 2019
    Securbond и kmaximv нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Как это работает. На видео осциллограф показывает состояние двух источников.
    Желтый - выход детектора нуля, отдельные всплески напряжения, где на растущем фронте срабатывает прерывание INT1 и
    • сбрасывает ногу А1в ноль. А1 - голубая линия: видно как она переходит в 0.
    • устанавливает Timer1 в некоторое состояние, которое берется из переменной myPWM.
    Таймер_Один неспеша считает, и досчитывает до переполнения за 4 секунды. Таймер установлен в прерывание по совпадению с регистром OCR1A. Если ничего не делать со счетным регистром таймера, то один раз в 4 секунды произойдет прерывание, оно выставит единицу на А1, которая будет сброшена в ноль детектором нуля.
    Однако, детектор нуля еще и пишет в счетный регистр цифру от 0 до 159 (из переменной myPWM), где 159 - максимальная яркость. Как только таймер досчитает до 160 (OCR1AL=0xA0 ) произойдет прерывание и перебросит ногу А1 в 1.
    Вот как это выглядит в динамике. Значение myPWM меняется от 0 до 159, соответственно в разное время А1 выставляется в единицу. Сбрасывается всегда на растущем фронте детектора нуля. Пока голубая линия (Нога А1) находится в состоянии 1 - лампочка включена.



    Еще почитать здесь: http://geektimes.ru/post/257416/
     
    Последнее редактирование: 23 янв 2016
  4. NE_XT

    NE_XT Гик

    А зачем всё это делать, для чего ?
     
  5. ИгорьК

    ИгорьК Гуру

    Действительно, сейчас ценность плавного управления 220 вольт снижается. Раньше так можно было управлять каждой лампочкой, а сейчас энергосберегайки и лед лампочки этого не позволяют. Цена диммируемых лед ламп запредельная.
    Применить это сейчас можно при управлении:
    • ТЭНами (электронагревателями);
    • лампочками накаливания, что еще остались кое-где.
    В частности, сейчас делаю проект автоматизации старого инкубатора, в нем идет нагрев яиц лампами накаливания. Старый прибор в нем работает в релейном режиме, что приводит к постоянному выходу лампочек из строя, а доставать их сейчас все сложнее и сложнее. Хочу сделать PID управление, или то же релейное, но включать и выключать лампочки плавно, что увеличит их ресурс. Кроме того, у старого прибора разброс включения-выключения - 2,5 градуса. И с этим надо разобраться.
     
    lepidot нравится это.
  6. вот опять, увидели лампу накаливания, и все думают что для лампы.
    нужно для управления нагревателями.
     
  7. Onkel

    Onkel Гуру

    сейчас и лед, и сберегайки делают диммируемые. Так что не снижается ценность.
     
  8. Onkel

    Onkel Гуру

    нагреватели управляются пропуском целых полупериодов, это если по науке и правильно. Никому помехи от включения киловаттной нагрузки на максимуме синусоиды не нужны.
     
  9. ИгорьК

    ИгорьК Гуру

    Ок. Не знал. Можно будет поразмышлять над этим. Интересно.
     
    Onkel нравится это.
  10. ИгорьК

    ИгорьК Гуру

    Цены...
     
  11. Onkel

    Onkel Гуру

    я уже год led лампочки заказываю из Китая , и это при том что я разработчик (на договоре) в одной фирме- производителе лед и сберегаек. Получается дешевле. Как китайцы умудряются делать лампочки 3 вт по 0.5 $ и 12 Вт по 1.2 $ (включая пересылку в том и том случае) я не знаю, но покупаю.
    да, кстати, очень интересная тема. Есть специальные оптроны, открывающие симисторы строго в нуле, и есть алгоритм Брезенхема, легко реализуемый в целой однобайтной арифметике без знака.
     
    ИгорьК нравится это.
  12. ИгорьК

    ИгорьК Гуру

    Есть твердотельные реле, открывающиеся только в нуле, что сильно упрощает задачу. В частности: http://www.chipdip.ru/product/s202t02/ См: http://lib.chipdip.ru/056/DOC000056017.pdf
     
  13. Onkel

    Onkel Гуру

    симистор 12 А (BTA12xx) стоит 20 руб. , а тут 2А реле - 430 руб.
     
  14. ИгорьК

    ИгорьК Гуру

    Два соображения.
    Чип и Дип не образец для цен, я его привожу как источник информации.
    При разовых отдельных разработках цена особого значения не имеет. Только когда речь идет о серии.
     
    aas84 нравится это.
  15. NE_XT

    NE_XT Гик

  16. alp69

    alp69 Форумчанин

    Насколько управляющий вход твердотелки (1,2-1,4в) будет толерантен к напряжению логической единицы pro mini?
     
  17. ИгорьК

    ИгорьК Гуру

    Надо читать даташит. Насколько мне помнится, управляющий вход твердотельного реле требует правильный ток, и не меньше указанного напряжения. По сути, управляющий вход твердотельного реле есть светодиод.
     
  18. sirota

    sirota Нерд

    Специально зарегистрировался. Зачем было изобретать велосипед? Вот давнюшний проверенный метод: http://cyber-place.ru/showthread.php?t=525
    Он именно для дуньки и написан понятным дуньковским языком. Шим привычный для всех 256 шагов.
     
  19. Artemius

    Artemius Нуб

    Что-то я не пойму как управлять этой штукой, объясните ничего не смыслящему в этом деле.
    Что такое детектор нуля и куда подключается А1? Этой схемой можно управлять напряжением от 0-5 В? Т.е. мне надо изменять мощность ТЭНа 3 квт подавая управляющее напряжение в указанном диапазоне, можно здесь это применить?
     
  20. ИгорьК

    ИгорьК Гуру

    Вам в "Закажу проекты".