Управление оборотами куллера

Тема в разделе "Arduino & Shields", создана пользователем rusincor, 26 авг 2018.

  1. rusincor

    rusincor Нуб

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

    Код (C++):
    int switchPin1 = 8;
    int switchPin2 = 7;
    int PWMpin = 9;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    boolean lastButton1 = LOW;
    boolean currentButton1 = LOW;
    int PWMlevel = 165;



    void setup()
    {
      pinMode(switchPin1, INPUT);
      pinMode(switchPin2, INPUT);
      pinMode(PWMpin, OUTPUT);
      Serial.begin(9600);
      // ШИМ 8 разрядов, 62,5 кГц
      TCCR1A = TCCR1A & 0xe0 | 1;
      TCCR1B = TCCR1B & 0xe0 | 0x09;
      analogWrite(9, 25); // на выводе 9 ШИМ=10%
     
      }

    boolean debounce(boolean last)
    {
      boolean current = digitalRead(switchPin1);
      if (last != current)
      {
        delay(5);
        current = digitalRead(switchPin1);
      }
      return current;
      }
    boolean debounce1(boolean last1)
    {
        boolean current1 = digitalRead(switchPin2);
      if (last1 != current1)
      {
        delay(5);
        current1 = digitalRead(switchPin2);
      }
      return current1;
    }



    void loop()

    {
     
      currentButton = debounce(lastButton);
      if (lastButton == LOW && currentButton == HIGH)
      {
        PWMlevel = PWMlevel + 15;
      }
      lastButton = currentButton;
     
      if (PWMlevel > 255) PWMlevel = 255;
      analogWrite(PWMpin, PWMlevel);


      currentButton1 = debounce1(lastButton1);
      if (lastButton1 == LOW && currentButton1 == HIGH)
      {
        PWMlevel = PWMlevel - 15;
      }
      lastButton1 = currentButton1;
     
      if (PWMlevel < 75) PWMlevel = 75;
      analogWrite(PWMpin, PWMlevel);
      Serial.print("POWER - ");Serial.println(PWMlevel);
    }
     
  2. a1000

    a1000 Гуру

    Скетч хоть и кривоватый, но на первый взгляд рабочий. Кнопки как подключены? Подтяжка есть? Приведите схему.
     
  3. rusincor

    rusincor Нуб

    подключены к 7 и 8 пину через подтягивающий резистор
    транзистор тоже с подтяжкой на землю
    проблема мне кажется в коде
    при установке оборотов при запуске --- когда ардуино запускается (int PWMlevel =165;
    ) я поставил примерно 60% скорости
    вентилятор с такой скоростью и крутится --- но может сам резко набрать обороты на максимум

    в чем проблема не могу понять
     
  4. a1000

    a1000 Гуру

    Попробуйте запустить всё на стандартных настройках ШИМ,
    Да, и что оно вам в сериал пишет?
     
  5. rusincor

    rusincor Нуб

    при стандартных настройках (без управления кнопками) шим работает нормально
    в сериале отображает значения шим
    при первом запуске вентилятор включается со значениями 165 и в сериале так и отображается - 165 но через пару секунд набирает максимальные обороты -- в сериале отображает 255
     
  6. a1000

    a1000 Гуру

    Про стандартный настройки я имел ввиду убрать повышение частоты ШИМ. Закомментировать строки
    Код (C++):
    TCCR1A = TCCR1A & 0xe0 | 1;
    TCCR1B = TCCR1B & 0xe0 | 0x09;
    Ну и попробуйте для проверки следующее:
    Как я понял за увеличение скорости оборотов отвечает кнопка на 8 порту. Попробуйте перед стартом ардуино отключить эту кнопку, а 8 порт замкнуть на GND. Будут ли при этом увеличиваться обороты?