Программно управляемый реобас

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Вот собственно видео где всё рассказал:

https://www.youtube.com/watch?v=ERD5Rlj9taM

Если чесно - писать то что говорил на видео леньки.

Код будет позже.

Конструктивная критика приветствуется.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Схема на момент съемки видео выглядела вот так:

Кстати, прошивка, почему-то не работает в протеусе...

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

В идеале было бы неплохо написать достойный софт как тут: http://www.digit-el.com/fn-603 . Но я увы такой софт не потяну, ладно ещё железная часть но программная мне точно не по зубам.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

А вот уже плата почти готова в железе:

art100
Offline
Зарегистрирован: 09.03.2014

итак поехали

только давай договоримся что будем повторять лучшее аналоговое в микропроцессороном варианте

потому как наличие микропроцессора и мосфета перестало быть проблемой

тут противоречие

большая скорость много шума и наборот

вам сразу захочется приглушить вентиляторы

но чтоб по критической температуры 55 60 70 90 вентиляторы включались на максимум отображая как угодно чем угодно что пора включать например большой кондиционер в серверной

или дома допустим открыть форточку при уличных +25

3 ех переменников прямого оперативного управления 3-мя вентиляторами не увидел

регулировать компьютером когда он уже перегревшись повись дорого выходит

когда нужно сделать тише - правильно

когда становиться темно

как мы узнаем о перегреве

только цветом 

писк отметаем сразу в доме уже спят теряется весь смысл регулировки

не увидел индикации вообще никакой

кто знает что сервер уже достиг критической температуры USB?

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

размер лопасте читай эфективность тоже разная нужна

как ни крути а большой вентилятор более 90*90 перед жесткими дисками не всунешь

а питатель+проц легко и нужно больше

вентиляторы сколько у вас там 80*80 из старых питателей это все не для тишины 90*90...120*120 это более подходящее

4 вентилятора тока легко на 1.5 ампера высосут

смотрим например видео проффесионалов

и не смотри что все навесным монтажем это реально в заказных серверах 5 лет оттарабанило http://mail.glassbel.com

короче посмотри как делал когда микропроцессоры были "с других планет"

https://yadi.sk/d/YE3pNIivURbpQ

конечно все сразу не повторишь но цель будет понятна

8 !!! переменников 8 !!! лампочек 4 терморезистора копеечных (сейчас наверно какая-нибудь дрянь типа DHT11...22) 4 реле(сейчас мосфетов навалом)

я с удовольствием микропроцессор всуну в этот узел их 2шт есть

 

 

 

 

 

varnan
Offline
Зарегистрирован: 27.10.2014

Подскажите пожалуйста, возможно ли использовать один транзистор и последовательно подключить вентиляторы (нужно чтобы обороты менялись у всех вентиляторов одинаково), и покажите пожалуйста исходный код, насколько я понимаю нужно менять инициализацию таймеров в arduino т.к. частота по умолчанию очень маленькая.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013
#include <EEPROM.h>  // библиотека для работы с энергонезависимой памятью

byte val1 = 0,val2 = 0,val3 = 0; 
// тип байт идеально подходит, диапазон 0-255
unsigned long previousMillis = 0;      
#define interval 1000

void setup()
{
  /* 
   /////////////////////////////////////////////// для ATmega 328p
   TCCR1A = 0x01 // зададим делитель для ШИМа N = 1
   TCCR2B = 0x01 // тоже самое
   //////////////////////////////////////////////////////
   */
  //////////////////////////////////////////////// для ATmega 8А
  TCCR1B = 0b00000001; // зададим делитель для ШИМа N = 1
  TCCR2 =  0b01101001; // зададим делитель для ШИМа N = 1
  //////////////////////////////////////////////////////
  /*
   TCCR1B = 0x05 (N = 1024), 16000000(16 МГц) / 1024 / 256 = 61(30.5) Гц
   TCCR1B = 0x04; (N = 256), 16000000(8000000) / 256 / 256 = 224(112) Гц
   TCCR1B = 0x03 (N = 64), 16000000(8000000) / 64 / 256 = 976(488) Гц
   TCCR1B = 0x02 (N = 8), 16000000(8000000) / 8 / 256 = 7812(3906) Гц 
   TCCR1B = 0x01 (N = 1), 16000000(8000000) / 1 / 256 = 62500(31250) Гц 
   */

  Serial.begin(9600);    // скорость компорта бод
  // При вызове parseInt() задержка ожидания последующего символа по умолчанию 1 секунда.
  // Функцией setTimeout() можно уменьшить эту задержку. Например на 4 миллисекунды, setTimeout(4);.
  // Чем выше скорость Serial.begin, тем меньше потребуется значение setTimeout.
  Serial.setTimeout(4);  // 4

  val1 = EEPROM.read(1); //считаем что у нас записано в
  val2 = EEPROM.read(2); // энергонезависимой памяти
  val3 = EEPROM.read(3); // там у нас храниться скорость

  pinMode(9, OUTPUT);  
  pinMode(10, OUTPUT);  
  pinMode(11, OUTPUT);  

  digitalWrite(9, HIGH);    // разгон кулеров
  delay(2000);
  analogWrite(9,val1);   // выставляем скорость 
  digitalWrite(10, HIGH);    // чтобы стартануть
  delay(2000); 
  analogWrite(10,val2);  // диапазон значений от 0 до 255
  digitalWrite(11, HIGH); 
  delay(2000);
  analogWrite(11,val3); 

  /*
  ...
   */

}

void loop()
{

  /*
  ...
   */

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  

    if(Serial.available()) // если данные идут то
    {
      char data = Serial.read();

      if(data == 'd'){ // ловим мимвол "d" и приступаем до 
        val1 = Serial.parseInt(); // получений данных
        val2 = Serial.parseInt(); // данные должны быть в формате
        val3 = Serial.parseInt(); // n255.255.255 или напр.: n64.112.230

        EEPROM.write(1, val1); //записываем полученые данные в 
        EEPROM.write(2, val2); // энергонезависимую память
        EEPROM.write(3, val3);
        delay(2000); // обязательно ждём 2 сек, для защиты
      }

      if(data == 'n'){ // ловим символ "n" - норм режим 
        val1 = EEPROM.read(1); //считаем что у нас записано в
        val2 = EEPROM.read(2); // энергонезависимой памяти
        val3 = EEPROM.read(3); // там у нас храниться скорость
      }

      if(data == 'm'){ // ловим символ "m" - макс скорость
        val1 = 255;
        val2 = 255;
        val3 = 255;
      }

      if(data == 's'){ // ловим символ "s" - стоп 
        val1 = 0;
        val2 = 0;
        val3 = 0;
      }

      if(data == 'r'){ // ловим символ "r" - значит нужно перезагрузиться
        reboot();
      }

      Serial.flush();  // чистим буфер

      analogWrite(9,val1); // задаём скорость для 3 куллеров
      analogWrite(10,val2);
      analogWrite(11,val3);
    }

    /////////////////////////////////////////////////////////////

    Serial.print(val1); // отправляем значение кулеров в ком порт
    Serial.print(","); // чисто для отладки
    Serial.print(val2); // хотя... может и пускай будет 
    Serial.print(",");
    Serial.println(val3);

    /////////////////////////////////////////////////////////////  
  }

  /*
 ...
   */

}

void reboot() // функция ресета
{
  Serial.end ();  // if necessary

  asm ("cli");          // interrupts off

  // reset USART to reset defaults
#ifdef __AVR_ATmega8__
  UDR = 0;
  UCSRA = _BV (UDRE);
  UCSRB = 0;
  UCSRC = _BV (URSEL) | _BV (UCSZ1) |  _BV (UCSZ0);
  UBRRL = 0;
  UBRRH = 0;
#else
  UDR0   = 0;
  UCSR0A = _BV (UDRE0);
  UCSR0B = 0;
  UCSR0C = _BV (UCSZ01) |  _BV (UCSZ00);
  UBRR0L = 0;
  UBRR0H = 0;
#endif

  asm volatile ("eor r1,r1");     // make sure zero-register is zero
  asm volatile ("ldi r16,0xFF");  // end of RAM (0xFF)
  asm volatile ("sts 0x5E,r16");  // SPH
  asm volatile ("sts 0x5D,r16");  // SPL
  asm volatile ("eor r31,r31");   // Clear Z register
  asm volatile ("eor r30,r30");
  asm volatile ("ijmp");          // jump to (Z)
}

 

Схема:

 

Переваривайте.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013