как подключить кулер 4пин к ардуино

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Basilio83, 17 май 2017.

  1. Basilio83

    Basilio83 Нерд

    хочу управлять скоростью вращения компьютерного вентилятора. Подключаю + 12 В к желтому проводу, gnd к черному и к синему ардуино (UNO) 11 пин
    Вот код
    Код (C++):
    int vint = 11;           // вывод 11 с символом ~
    int brightness = 100;    // начальная скорость
    int fadeAmount = 1;    // величина изменения скорости
    void setup()
    {
      pinMode(vint, OUTPUT);
      TCCR2B = TCCR2B & 0b11111000 | 0x01;
    }
    void loop()
    {
      analogWrite(vint, brightness);  
    if (digitalRead(8) == HIGH && brightness != 255)
    {
      // изменяем скорость в цикле, прибавляя заданную величину
      brightness = brightness + fadeAmount;
    }
    if (digitalRead(9) == HIGH && brightness != 0)
    {
      // изменяем скорость в цикле, прибавляя заданную величину
      brightness = brightness - fadeAmount;
    }  
      }    
       
    Но в результате ничего не происходит вращается на полной скорости
     
  2. Tomasina

    Tomasina Иномирянин

  3. Basilio83

    Basilio83 Нерд

    вот именно так и подключено
     
  4. Tomasina

    Tomasina Иномирянин

    значит входной сигнал (на синем проводе) не соответствует стандарту (PWM signal acceptable operational range 21 kHz to 28 kHz).
    Четырехпроводные кулеры имеют собственную управляющую микросхему, которая контролирует обороты.

    4-Wire Pulse Width Modulation (PWM) Controlled Fans Specification
    http://www.formfactors.org/developer/specs/4_Wire_PWM_Spec.pdf
     
    Unixon нравится это.
  5. Arkad_snz

    Arkad_snz Гик

    Ардуино, светодиоды, кнопки, тройка-модули - детские бирюльки!
    Самый непокорный для Ардуино аппарат - банальный кулер!
    В Тырнете нет вразумительных схем работы с ним (взять 5 или 12В и воткнуть - вырожденное пользование кулера - источник "ж-ж;-ж").
    И нет вразумительных решений на самом компетентном ардуино-форуме!
    Все-таки, как подключить кулер к Ардуино с контролем его вертлявости!?
     
  6. Basilio83

    Basilio83 Нерд

    Помогите сделал управление кулера питанием через мосфет ключ. Но не могу разобраться если уменьшить скорость до min и отключить БП а затем снова включить, мигание светодиода нарушается. Т.е. резко загорается и плавно гаснет. Извините за сумбур вот код[
    Код (C++):
    unsigned long TB1;
    unsigned long loopTB1;
    unsigned long TC;
    unsigned long loopTC;
    unsigned long TB7;
    unsigned long loopTB7;
    unsigned long TB8;
    unsigned long loopTB8;
    unsigned long TL1;
    unsigned long loopL1;
    int SPEED = 0;    //  скорость кулера
    int vint=0;// переменная равна 0
    int fan = 3;           // вывод 3 с символом ~
    int INCREASE = 5;    // величина увеличение скорости
    int REDUCTION = 5;   // величина уменьшения скорости
    int flag = 0; // переменная равна 0
    int led = 11;           // вывод 9 с символом ~
    int brightness = 0;    // начальная яркость светодиода
    int fadeAmount = 3;    // величина изменения яркости светодиода 1
    void setup () {
    TCCR2B = TCCR2B & B11111000 | B00000001;
      pinMode(12, OUTPUT);   //установил на 12 пин
      digitalWrite(12,HIGH); //включение бп HIGH=выкл,LOW=вкл
      pinMode(led, OUTPUT);
    TB1=millis();//временные переменные
    loopTB1=TB1;
    TL1=millis();
    loopL1=TL1;
    TB7=millis();
    loopTB7=TB7;
    TB8=millis();
    loopTB8=TB8;
    TC=millis();
    loopTC=TC;
    }
    void loop ()
    {
     
     
      long val = 0;
      TB1=millis();
     
      if (digitalRead(4) == HIGH && flag == 0)
        // если на 4 входе есть сигнал и переменная равна 0 то...
      {
        if(TB1>=(loopTB1+1000))//задержка
        {
        loopTB1=TB1;
        digitalWrite(12, !digitalRead(12)); //меняем значение выхода на противоположное
        flag = 1; //меняем значение ФЛАГА
        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        }
      }
      if (digitalRead(4) == LOW && flag == 1)
        //если на 4 входе нет сигнал и переменная равна 1 то...
      {
        if(TB1>=(loopTB1+500))//задержка
        {
        loopTB1=TB1;
        flag = 0; //обнуляем переменную
        }
      }
       if (digitalRead(12)== LOW)//если БП включен
       {
        analogWrite(fan, SPEED);
        if (vint==0)
        {
         SPEED = 255;//запуск кулера
        }
        TC=millis();
        if(TC>=(loopTC+2000)&&vint==0)//задержка
        {
         SPEED = 150;//нужная скорость
         vint=1;
        }
        //плавное мигание светодиода
          TL1=millis();
          if(TL1>=(loopL1+30))
          {
          analogWrite(led, brightness);
          brightness = brightness + fadeAmount;
          loopL1=TL1;
          if (brightness == 0 || brightness == 255) {
          fadeAmount = -fadeAmount ;
          }
          }
         
       if(SPEED<255&&vint==1)//если скорость меньше max и запуск прошел
          {
           TB7=millis();
           if (digitalRead(7)==HIGH) //есть сигнал на 7 пине
           {
            if(TB7>=(loopTB7+500))
            {
              loopTB7=TB7;
              SPEED = SPEED + INCREASE;//увеличиваем скорость
            }
           }
           if (digitalRead(7)==LOW)//если нет сигнала ничего не делаем
            {
            if(TB7>=(loopTB7+500))
            {
             loopTB7=TB7;
             }
            }
          }
         if(SPEED>115&&vint==1)//если скорость больше min и запуск прошел
         {
          TB8=millis();
          if (digitalRead(8)==HIGH)  //есть сигнал на 8 пине
          {
           if(TB8>=(loopTB8+500))
           {
             loopTB8=TB8;
             SPEED = SPEED-REDUCTION;//уменьшаем скорость
           }
          }
          if (digitalRead(8)==LOW)//если нет сигнала ничего не делаем
          {
           if(TB8>=(loopTB8+500))
           {
           loopTB8=TB8;
           }
          }
         }
       }
       else if (digitalRead(12)== HIGH)//иначе если БП отключен
       {
       analogWrite(fan, SPEED);
       analogWrite(led, brightness);
       SPEED = 0;//кулер не работает
       brightness = 0;//светодиод не горит
       vint=0;
       }
      }
     
  7. ostrov

    ostrov Гуру

    Я уже давал сегодня ссылку на противоречия MOSFET с PWM, возможно причина та же.