помогите разобраться в чем дело

Тема в разделе "Флудилка", создана пользователем Basilio83, 19 сен 2017.

  1. Basilio83

    Basilio83 Нерд

    Отключаю и снова включаю блок питания. Светодиод почему то начинает странно мигать т.е. сразу загорается и плавно гаснет. Иногда все нормально работает плавно загорается и плавно гаснет.
    Код (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;           // вывод 11 с символом ~
    int brightness = 0;    // начальная яркость светодиода
    int fadeAmount = 3;    // величина изменения яркости светодиода 1
    void setup () {
    TCCR2B = TCCR2B & B11111000 | B00000001; //установил частоту 31кгц на 11 и 3 пине
      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;
       }
      }
     
    Последнее редактирование: 19 сен 2017
  2. ostrov

    ostrov Гуру

    Нагрузка через MOSFET?
     
  3. Basilio83

    Basilio83 Нерд

    совершенно верно и кулер и светодиод (метр ленты) подключены через MOSFETы. Ардуино уно запитана от дежурного питания, кулер и светодиод от 12В компьютерного БП.
     
    Последнее редактирование: 20 сен 2017
  4. DIYMan

    DIYMan Guest

    На затворе мосфета подтяжка к земле присутствует? А то вдруг у вас затвор из эфира нажирается - и иногда открывает переход ;)
     
  5. Basilio83

    Basilio83 Нерд

    Разумеется. Обвязка сделана по правой схеме. Мои домыслы что нарушение работы светодиода связано с моментом выключения БП. Бывает пять раз отключиш включиш все норм работает, а на шестой начинает глючить.
     

    Вложения:

    • arduino11-3.png
      arduino11-3.png
      Размер файла:
      17,6 КБ
      Просмотров:
      540
  6. ostrov

    ostrov Гуру

    Про мосфет писали, что с шимом не дружит на высокой частоте, может в этом дело?
     
  7. Basilio83

    Basilio83 Нерд

    Вот где Вы увидели что MOSFET не дружит с шимом. При том что если я не играюсь включением-отключением БП все стабильно работает. Вентилятор у меня подключен через самодельный мосфет ключ как тут

    лед лента через такой https://ru.aliexpress.com/item/0-24...rduino-MCU-ARM-Raspberry-pie/32275524365.html
     
  8. rkit

    rkit Гуру

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

    Basilio83 Нерд

    Вот Вы как думаете в чем дело
     
  10. Basilio83

    Basilio83 Нерд

    Проблема решена установкой задержки после включения БП