// normal delay() won't work anymore because we are changing Timer1 behavior // Adds delay_ms and delay_us functions #include // Clock at 8MHz #define F_CPU 8000000 // This is used by delay.h library word VentPin = 1; word DetPin = A0; float PWM = 50; // takes values from 0 to 100 float PWM9, PWM8, PWM7, PWM6, PWM5, PWM4, PWM3, PWM2, PWM1; // Thermistor int Vo; int DeltaT = 10; // shift curve up/down float R1 = 13000; float logR2, R2, T; float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07; // Boot up delay countdown to keep the fan spinning initially int countdown = 10000; //Microseconds to delay void setup() { //Serial.begin(115200); TCCR0A = _BV(COM0B1) | _BV(WGM01) | _BV(WGM00); TCCR0B = _BV(WGM02) | _BV(CS01); // Set TOP and initialize duty cycle to zero(0) OCR0A = 40; // TOP - DO NOT CHANGE, SETS PWM PULSE RATE OCR0B = 30; // duty cycle for Pin 1(PB1) - generates 1 500nS pulse even when 0 pinMode(VentPin, OUTPUT); pinMode(DetPin, INPUT); } void loop() { // Thermistor data acquisition Vo = analogRead(DetPin); R2 = R1 * (1023.0 / (float)Vo - 1.00); logR2 = log(R2); T = (1.00 / (c1 + c2*logR2 + c3*logR2*logR2*logR2)); T = T - 273.15; // End of temperature measurement // PWM control Logic if (T < 30) { // this next if is necessary to trick BIOS into thinking it xontrols the fan at boot if (countdown > 0) { countdown--; delayMicroseconds(100); PWM = 50; } else if (T < 15 && countdown <= 0) { PWM = 0; // stop the fan if the machine is critically cold } else { PWM = 25; // minimum fan speed while operating normally } } else if (T >= 30+DeltaT && T < 40+DeltaT) { PWM = 2*T - (35+2*DeltaT); // first part of the fan curve } else if (T >= 40+DeltaT) { PWM = 5*T - (155+5*DeltaT); // second, steepest, part of the curve } // these variables are used to average the value over 10 cycles before sending it to the fan PWM9 = PWM8, PWM8 = PWM7; PWM7 = PWM6; PWM6 = PWM5; PWM5 = PWM4; PWM4 = PWM3; PWM3 = PWM2; PWM2 = PWM1; PWM1 = PWM; OCR0B = (PWM9+PWM8+PWM7+PWM6+PWM5+PWM4+PWM3+PWM2+PWM1+PWM)/30; // average and send value to timer }