Плавное изменение оборотов вентилятора Silent TD 250 с помощью Arduino.

Тема в разделе "Arduino & Shields", создана пользователем zsm, 10 май 2013.

  1. zsm

    zsm Гик

    Собственно весь вопрос в шапке, если кто что скажет по данной теме буду очень признателен)
    нарыл в просторах интернета вот такую схемку:

    http://s2.ipicture.ru/uploads/20130510/zU6aIdYU.gif

    Вроде всё просто , но непонятно:
    - какой транзистор и оптопару использовать
    - в этой схеме нет синхронизации с частотой сети (насколько это критично? не сгорит ли вентик?)
    - как всё это запитать ? как понимаю нужна развязка по питанию - дуня отдельно, управление вентиком отдельно.
    Не исключаю возможность использования готовых решений (ведь есть же наверно такие)
    Ну и конечно же предлагайте свои схемы, и решения данной задачи.
     
  2. Unixon

    Unixon Оракул Модератор

    Весьма забавное схемотехническое решение... :) Синхронизация тут не особо требуется, но эта схема позволяет делать такой ШИМ, от которого в сеть попрут дикие шумы от проШИМленой нагрузки. Обычно все же используется решение на симисторе и оптосимисторе с датчиком перехода через ноль (BTAxx + MOC3083, xx=06,08,16,24 ампер).

    Ну и касательно силовых мосфетов:
    hv_mosfet.png
     
    zsm нравится это.
  3. zsm

    zsm Гик

    Спасибо за ответ.
    Решил эту схему попробовать, если не устроит буду на симисторе делать.
    Нарыл дома парочку IRF830, оптопара такая имеется, как думаете подойдут ли они?
     
  4. Unixon

    Unixon Оракул Модератор

    Хороший, годный мосфет. Оптрон абсолютно типичный. Остается проверить номиналы всех резисторов, чтобы не превысить лимиты по току и по напряжению на затворе полевика ну и организовать питание принимающей половинки оптрона.
     
    zsm нравится это.
  5. zsm

    zsm Гик

    Наконец собрал приведенную выше схемку все заработало , но к сожалению 830 горелые оказались пришлось поставить irf 614 но он слабоват похоже , т.к. даже с радиатором греется лихо,
    а может дело в частоте ШИМа ,(она если не ошибаюсь около 500герц по умолчанию) кстати можно ли её в Arduino менять?
    Еще хотел спросить, можно ли Arduino запитать теми же 9 вольтами что управляют мосфетом ? они вроде развязаны оптроном, но всё равно как то страшно ))
     
  6. Unixon

    Unixon Оракул Модератор

    Сопротивление у 614-го при том же потенциале затвора великовато против 830-го ...
     
  7. zsm

    zsm Гик

    купил 830 , греется поменьше но все равно сильно , увеличивал R3 до 20k не помогает.
    может диоды нужны другие(стоят кд213б), или с частотой ШИМа поиграть?
    может кто знает, как частоту ШИМа менять на Arduino ?
     
  8. zsm

    zsm Гик

    Вы совершенно правы, похоже найденная мной схема не подойдет в конкретной ситуации.(нагрев мосфета так и не удалось в полной мере победить)
    Последую совету и попробую собрать что нибудь на симисторах. имеется BTA 140-800 он вроде должен подойти.
    Буду очень благодарен примерам схем.
     
  9. zsm

    zsm Гик

    Нашел стандартные схемы подключения симисторов к мк

    [​IMG]

    [​IMG]

    обязательно ли в моём случае использовать детектирование перехода через ноль? очень не хотелось бы отказываться от удобной функции analogWrite, да и вообще придется весь код переделывать боюсь что не осилю :)
    сможет ли симистор работать на частоте стандартного ШИМа Arduino ?



    вот код если кому интересно(сильно не ругайте он первый у меня;) ) ,
    Описание устройства: регулятор оборотов вентилятора в зависимости от температуры.

    Датчик температуры DS18B20 используются стандартные библиотеки.
    Первый потенциометр VAR_REZ задаёт температуру включения вентиляции (на наименьших оборотах) , второй потенциометр VAR_REZ2 задает температуру на которой вентилятор выйдет на максимальные обороты. соотношением этих двух резисторов
    можно довольно тонко настроить соотношение эффективности охлаждения к уровню шума.

    Все работает с мотором постоянного тока через мосфет.
    С переменным током возникли сложности непредвиденные..
    Выслушаю любые предложения и критику.
    Примеры схем , кода приветствуются)



     
  10. Unixon

    Unixon Оракул Модератор

    Нет, но желательно. Самый простой способ этого достичь - взять оптосимистор со встроенным детектором нуля. Обратной связи с контроллером не требуется.

    Оптосимисторы без схемы перехода через нуль:
    MOC3009, MOC3010, MOC3011, MOC3012, MOC3020, MOC3021, MOC3022, MOC3023, MOC3051, MOC3052
    Оптосимисторы со схемой перехода через нуль:
    MOC3041, MOC3042, MOC3043, MOC3061, MOC3062, MOC3063, MOC3081, MOC3082, MOC3083


    Нет, симистор принципиально не выключится, пока через него не перестанет течь ток, по естественным причинам это происходит при смене полярности питающего напряжения каждые полпериода. Для управления мощностью с помощью симистора используется метод пропуска полупериодов.
     
  11. zsm

    zsm Гик

    Большое спасибо за ответ,
    Не понимаю как это на Arduino организовать, я полный нуб в этом))
    Похоже не по зубам задачку взял:) Надо наверно с чего то более простого начинать:)
    не уверен что смогу код переделать с прописыванием ШИМа вручную,
    как понимаю это надо делать функцией digitalWrite и delay ?
     
  12. Unixon

    Unixon Оракул Модератор

    Короче говоря, нужен очень медленный ШИМ.
     
  13. zsm

    zsm Гик

    примерно с частотой сети?
     
  14. Unixon

    Unixon Оракул Модератор

    zsm нравится это.
  15. zsm

    zsm Гик

    Спасибо за пример буду изучать.:)
     
  16. Unixon

    Unixon Оракул Модератор

    Это прошивка для симисторного регулятора мощности. ATtiny13 + потенциометр + 2 7-сегментника с драйверами + симистор с оптодрайвером. К сожалению, в железо устройство пока не пошло. Регулятор планировался для паяльника, но с покупкой станции необходимость в нем несколько ослабла.
     
  17. Unixon

    Unixon Оракул Модератор

    Силовая часть как на верхней схеме, а управляющая вся в вики расписана частями. Подключение периферии в общем то должно быть понятно из назначения ног МК в исходнике.
     
  18. zsm

    zsm Гик

    Огромное спасибо, это похоже то что нужно.
    теперь нужно во всём разобраться попробовать)
     
  19. zsm

    zsm Гик

    Большое спасибо ,благодаря ссылкам многое прояснил.
    Изменил код , всё в принципе завелось но появилась проблема-вентилятор вращается с прерыванием , которое
    совпадает с временем опроса датчика температуры(видно когда монитор порта запускаешь )...с функцией analogWrite такого не было.

    если брать пример от сюда всё работает нормально.

    подскажите пожалуйста как сделать так чтобы значение Dimmer1 сохранялось после опроса датчика температуры ?
    Такое ощущение что каждый опрос сбивает значение Dimmer1.
    подозреваю что это конфликт с библиотекой датчика температуры, может она тот же таймер использует?







     
  20. zsm

    zsm Гик

    Заработало ! Большое спасибо за помощь.
    Пришлось датчик температуры по другому подключить(в коде все изменения видно). подсказали добрые люди с форума где димер брал.
    Код конечно еще в порядок приводить, но в целом всё работает .

    Код (C):
    #include <MsTimer2.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include "nanopins.h" //быстрое управление пинами
    #include <TimerOne.h> //использует Timer1

    #define VAR_REZ A0
    #define VAR_REZ2 A1
    #define LM_35  A5
    #define ONE_WIRE_BUS  10    // датчик DS1820 DATA подкл. на pin 10
    #define RES_TEMP      12    // разрешение (точность) темп. датчика в битах

    volatile uint8_t tic, Dimmer1, Dimmer2, Dimmer3;
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    DeviceAddress Thermometer; // адрес устройства

    float TempC=0;
    int led = 13;

    void setup()

    {
        Serial.begin(9600);
        sensors.begin();                                 // Start up the library
        sensors.getAddress(Thermometer, 0);              // получить адрес DS18B20 (0 - 1 датчик)
        sensors.setResolution(Thermometer, RES_TEMP);    // установить разрешение (точность)
        sensors.setWaitForConversion(false);             // отключить ожидание при изм.темп.
                                                         // время на изм. должно быть > 750ms
        sensors.requestTemperatures();                 // Команда на измерение температуры,
                                                         // выборка произойдет по прерыванию таймера через 2 сек (первый раз)

        MsTimer2::set(2000, Tizm);      // установка таймера на 2 сек. для изм. температуры
        MsTimer2::start();              // запустить таймер
      D4_Out; //Настраиваем порт на выход Dimmer1
      D5_Out; //Настраиваем порт на выход Dimmer2
      D6_Out; //Настраиваем порт на выход Dimmer3
      D4_Low; D5_Low; D6_Low; //установить на выходах низкий уровень сигнала
      D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
      pinMode(led, OUTPUT);
      Serial.begin(9600);
      Serial.println("Start");
     
       
      attachInterrupt(0, detect_up, FALLING);  // настроить срабатывание прерывания int0 на pin 2

      Timer1.initialize(40);              // Интервал срабатывания таймера в мкс
      Timer1.attachInterrupt(halfcycle);   //будет вызыватся каждый раз при отсчете заданого времени
      Timer1.stop();
    }
    //********************обработчики прерываний*******************************
    void halfcycle()  //прерывания таймера
    {
      tic++;  //счетчик  
      if(Dimmer1 < tic ) D4_High; //управляем выходом
      if(Dimmer2 < tic ) D5_High;  //управляем выходом
      if(Dimmer3 < tic ) D6_High;  //управляем выходом
    }

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

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

    void Tizm() //обработка прерывания таймера - изм температуры
    {
          TempC = sensors.getTempC(Thermometer);    // Получить температуру в градусах
        sensors.requestTemperatures();        // Команда на измерение температуры для следующего раза
    }


    //*************************************************************************
    void loop()

    {
     
     
     
     
      int valrez = analogRead(VAR_REZ);
      int valrez2 = analogRead(VAR_REZ2);
      int tempmin = map(valrez,147,1023,2000,5000) ;
      int tempmax = map(valrez2,135,1023,2000,5000) ;
      Serial.print("   Requesting temperatures...");
      Serial.println("DONE");
      Serial.print("min temp-");
      Serial.println(tempmin);
      Serial.print("max temp-");
      Serial.println(tempmax);
      Serial.println(valrez);
      Serial.println(valrez2);
     
      int pwmval = map(TempC*100,tempmin,tempmax,110,60);
      Serial.print("pwm-");
      Serial.println(pwmval);
     
     
      if (TempC*100<tempmin)
        {Dimmer1=255;}
     
      else if (TempC*100>tempmax)
        {Dimmer1=0;}
     
      else if  (TempC*100>tempmin)
        {Dimmer1=pwmval;}
     
     
      Serial.print("Temperature: ");
      Serial.print(TempC);
       if  (TempC*100>tempmin) digitalWrite(led, HIGH);
       if  (TempC*100<tempmin) digitalWrite(led, LOW);
       
       delay(200);
         
     
      }