изменение оборотов вентилятора в зависимости от температуры

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 19 дек 2015.

  1. Толик Иванов

    Толик Иванов Administrator Администратор

    есть датчик температуры, и два параметра tmin и tmax работы вентилатора, допустим 20 и 25 градусов соответственно. пока температура ниже 20 градусов вентилятор работает в штатном режиме со скоростью вращения через ШИМ равной 127. как только температура достигла 20 градусов и продолжает расти до 25 и выше - вентилятор должен пропорционально увеличивать скорость вращения от 127 до 255.
    для реализации попробывал изпользовать функцию map(), но компилятор ругается. сам разобраться не смог. прощу помощи!

    Код (C++):
    #include <OneWire.h>
    #include <DallasTemperature.h>

    int tempPin= A1; // пин с подключенными датчиками температуры
    int coolerPin=6; //пин вентилятора
      int tcurentin; //переменная хранящая текущее значение температуры

    // переменные хранящие верхний и нижний порог температуры
      int tfanmin;
      int tfanmax;

    void setup(){

      pinMode(coolerPin, OUTPUT);
      ds.begin();
    }

    void loop() {

    ds.requestTemperatures(); // считываем температуру с датчиков
     
       tcurentin = ds.getTempC(sensor1);//присваивыаем значение температуры переменной

    // РЕЖИМ РАБОТЫ ВЕНТИЛЯТОРА

       fanspeed= map ( tcurentin, tfanmin, tfanmax, 127, 255) ;
       fanspeed= constrain ( fanspeed , 127, 255);

       analogWrite= (coolerPin, fanspeed);
    }
    ругается :
    error: assignment of function 'void analogWrite(uint8_t, int)'
    error: cannot convert 'int' to 'void(uint8_t, int) {aka void(unsigned char, int)}' in assignment
    assignment of function 'void analogWrite(uint8_t, int)'

    я так понимаю что не нравятся тип переменных которые я передаю. с датчика приходят дробные значения, например Т=25,65 С
    полагаю что нужно перевести их но как не знаю. можете подсказать?
     
  2. AlexU

    AlexU Гуру

    Предпоследняя строчка:
    Знак присвоения -- '=' -- после имени функции 'analogWrite', наверное, лишний. Вы таким образом пытаетесь присвоить указателю на функцию 'analogWrite' значение 'int', на что компилятор ругается. И дело не в типе переменных 'coolerPin' или 'fanspeed'. Попробуйте исправить на:
    Код (C++):
    analogWrite(coolerPin, fanspeed);
     
  3. Толик Иванов

    Толик Иванов Administrator Администратор

    да спасибо оргромное. не заметил
    все работает, вот только вопрос. вентилятор пищит при работе чере шим в зависимости от температуры с разной частотой. если паралельно вентилятору поставить конденсатор для сглаживания импульсов, то писк пропадает , но вентилятор начинает быстрее вращаться и при изменении значений шим от 127 до 255 скорочть практически не меняеться- постоянно почти максимальная.
    как еще можно избавится от писка на вентиляторе при использовании ШИМ?
     
  4. AlexU

    AlexU Гуру

    Скажем так -- "конденсатор увеличивает напряжение" -- т.е., сглаживая колебания, конденсатор увеличивает активную мощность (это, если коротко объяснять).
    Причем все зависит от емкости конденсатора и частоты ШИМ. Выше емкость + ниже частота == ниже емкость + выше частота. Вполне вероятно, что емкость конденсатора, применяемого Вами, "достаточна для компенсирования/устранения скважности" ШИМ при значениях от 127 до 255. Поэтому:
     
  5. Толик Иванов

    Толик Иванов Administrator Администратор

    а как все же сделать так чтоб разница на всем диапазоне изменения шим была видна и при этом устранить писк вентилятора? а то получаеться избавляюсь от писка- получаю плохо контролируемые обороты, и наоборот.
     
  6. AlexU

    AlexU Гуру

    Импульсы -- это главный источник шумов в радиоэлектронике (большинство станций РЭБ -- радиоэлектронной борьбы и поставления шумов -- излучают импульсы, т.к. они захватывают большой спектр радиочастот). Вам следует определится -- либо ШИМ, либо отсутствие писка. Или применять более сложные схемы управления вентилятором.

    Можно попробовать поколдовать с частотой ШИМ и емкостью конденсатора, но если это устройство предстоит использовать дома (там где Вы живёте), я бы постарался устранить всякое излучение от ~25kHz до ~1MHz -- на мозг давит сильно. ШИМ примерно в этом диапазоне работает. В своё время внедряли рацпредложение (рациональное предложение) -- для получения красных дипломов одним из условий было наличие удостоверения о внедрении рацпредложения -- испытывали "отпугиватель крыс" для продовольственных складов, который излучал переменный ультразвук выше 25 kHz. Так вот, в помещении, где мы своё устройтво испытывали, люди больше 10 минут находится не могли -- начинались головные боли. Но мощность была не малая. А при малых мощностях -- оно вроде как не чувствуется, но дискомфорт есть и сон плохой.
     
  7. Толик Иванов

    Толик Иванов Administrator Администратор

    понятно, буду размышлять над этим
     
  8. Vad33

    Vad33 Капитан-оригинал

    Возможно, у вашего вентилятора нелинейная зависимость частоты вращения от напряжения
    или схема управления дает нелинейную зависимость.
    Поэтому, чтобы пропорционально увеличить обороты нужно промерить напряжения
    и подобрать значения.
     
  9. Толик Иванов

    Толик Иванов Administrator Администратор

    Так и делаю, меняю значения не от 0 до255 а от 50до 200 и еще резистор перед кондегсатором использую