регулятор оборотов 3-x(4-x) проводного вентилятора

evgta
Offline
Зарегистрирован: 02.09.2016

Сделал себе жидкостное ожлаждение проца и 2-х видях, работа вентиляторов от мамки неустроила, а потому сделал регулятор от температуры теплоносителя. на 328 залил нановскую прошивку.

ШИМ работает на 25кГц

монитор порта через TTL адаптер показывает температуру, шим, заданную температуру, также через адаптер можно перепрошить.

также через монитор порта можно ввести заданную температуру

да, сделано через делей, ибо лень, а быстрее мне не надо.

код 

#include <EEPROM.h>

word pwmA = 60; // 50% duty (0-320 = 0-100% duty cycle)
word pwmB = 60; // 90% duty (0-320 = 0-100% duty cycle)

#define datchik  A0
unsigned long temp = 0;
unsigned long temp1 = 0;
int Tzad = 300;
int pwmA1  = 0;

void setup() {
Serial.begin(9600);       

pinMode(datchik, INPUT);
pinMode(9, OUTPUT);  //pwmA
pinMode(10, OUTPUT); //pwmB

 byte xx[] = {EEPROM.read(0), EEPROM.read(1)};
  int *y = (int *)&xx;
  Tzad = y[0];

}

void loop() {

 if (Serial.available() > 0) {
 Tzad = Serial.parseInt();
   byte *x = (byte *)&Tzad;
  EEPROM.write(0, x[0]);
  EEPROM.write(1, x[1]);
 
 
 }
  
pwmA1=pwmA;
if(temp<=Tzad){pwmA = 1;pwmB = 1;}
if(temp>Tzad){pwmA = 80;pwmB = 80;}
if(temp>Tzad+10){pwmA = 100;pwmB = 100;}
if(temp>Tzad+13){pwmA = 120;pwmB = 120;}
if(temp>Tzad+16){pwmA = 140;pwmB = 140;}
if(temp>Tzad+19){pwmA = 160;pwmB = 160;}
if(temp>Tzad+22){pwmA = 180;pwmB = 180;}
if(temp>Tzad+25){pwmA = 200;pwmB = 200;}
if(temp>Tzad+28){pwmA = 220;pwmB = 220;}
if(temp>Tzad+31){pwmA = 240;pwmB = 240;}
if(temp>Tzad+34){pwmA = 260;pwmB = 260;}
if(temp>Tzad+37){pwmA = 280;pwmB = 280;}
if(temp>Tzad+41){pwmA = 300;pwmB = 300;}
if(temp>Tzad+44){pwmA = 320;pwmB = 320;}
if(pwmA1!=pwmA){aaaa();}  

readtemp();



Serial.println(Tzad);
Serial.println(temp);
Serial.println(pwmA);
Serial.println(" ");

delay(1000);
}



//---------------------------------------------------------------------------------------------------------------------------------------------------------------
void readtemp()                                                                           
{
temp1=0;
for (int i=0; i <= 150; i++){
      temp =( analogRead(datchik)/1023.0 )*5000;
      temp1=temp1+temp;
      delay(5);
   }
temp=temp1/150;


}

void aaaa() {


TCCR1A = 0;            //clear timer registers
  TCCR1B = 0;
  TCNT1 = 0;

  TCCR1B |= _BV(CS10);   //no prescaler
  ICR1 = 320;            //PWM mode counts up 320 then down 320 counts (25kHz)

  OCR1A = pwmA;          //0-320 = 0-100% duty cycle
  TCCR1A |= _BV(COM1A1); //output A clear rising/set falling

  OCR1B = pwmB;          //0-320 = 0-100% duty cycle
  TCCR1A |= _BV(COM1B1); //output B clear rising/set falling

  TCCR1B |= _BV(WGM13);  //PWM mode with ICR1 Mode 10
  TCCR1A |= _BV(WGM11);  //WGM13:WGM10 set 1010
 
}

файлы протеуса и трафарета лут

https://drive.google.com/open?id=1GsBqYYh5u7eZOc5mfkStr_XSIFF8BrEf

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

evgta пишет:
работа вентиляторов от мамки неустроила, а потому сделал регулятор от температуры теплоносителя. на 328

Круто!

Это про Вас на лурке писали: «Цифровик. … Радиолюбитель, осознавший всю мощь микроконтроллеров и старающийся впихнуть их даже туда, где можно обойтись одним транзистором»??? :))))

evgta
Offline
Зарегистрирован: 02.09.2016

неа, и вообще написал просто чтобы как всегда не протерять прошивку при очередной сносе винды)))

кстати обманул, можно управлять только 4-х проводными вентиляторами