Hi all
Small update... I have received most of the parts I need to test the fan controller circuitry.
Unfortunately the ones I don't have (the MOSFET and the pots) are pretty critical and I can't calibrate my controller until I get hold of them.
But at least I got the "programmer" ready...
And I tested my "bench" 12V PSU with the Noctua and the original Sanyo....
Interestingly enough, even though the Sanyo is older and noisier, it moves A LOT more air compared to the Industrial PPC Noctua... But the latter should still be plenty enough as the Becker PSU doesn't really need any cooling (it has massive heatsinks!) and the fan MOSFET won't generate much heat (according to my calculations, the max. temperature rise in the worst case scenario will be 3°C (1A fan), or about 1.5°C for the Sanyo, negligible!)
Here's the current version of the microcode:
// QuadrATX fan speed controller //
// The Apple Chronicles //
// v0.25A //
// NOTES:
// set board to 8MHz!!!
// configure Arduino as ISP
// CALIBRATION NEEDED, currently using dummy values.
// variables declaration
int SensorPin = PB2; // pin 7
int PWMPin = PB0; // pin 5
int PotPin = PB4; // pin 3
int LEDPin = PB1; // pin 6
int SpeedPin = PB3 // pin 2
int SensorVal; // "temperature" from NTC
int PWMVal; // fan PWM output "speed"
int PotVal; // real potentiometer value, to define the cold/normal operation fan speed.
int PotValmapped; // lowest position shall correspond to the absolute minimum speed (see below) and not OFF, new potentiometer value
int MinSpeed=64; // absolute minimum speed, 0=0% and 255=100%, currently set to 25%, corresponds to lowest pot value
// Calibration variables, TBD
int NTCcold=450; // corresponds to ambient temperature, 10K for a 10k NTC @25°C
int NTChot=800; // corresponds to highest temperature before LED lights up, about 1.3K for a 10k NTC @80°C
int PotMin=0; // corresponds to lowest position on potentiometer
int PotMax=800; // corresponds to highest position on potentiometer
// setup code, to run once
void setup() {
// set PWM frequency of PB0 (Pin 5, ATTiny85, fan output) to 31,250 Hz.
TCCR0B = TCCR0B & 0b11111000 | 0b001;
// define pin modes ATTiny85
pinMode(SensorPin, INPUT);
pinMode(PotPin, INPUT);
pinMode(PWMPin, OUTPUT);
pinMode(LEDPin, OUTPUT);
pinMode(SpeedPin, OUTPUT);
// Set fan to full speed for one second at startup (prevents stall)
analogWrite(PWMPin, 255);
delay(1000);
}
// main code, to run repeatedly
void loop() {
//read NTC sensor value
SensorVal = analogRead(SensorPin);
if(SensorVal < NTCcold){ // in case ambient temperature is lower than 25°C
SensorVal = NTCcold;}
//read pot value
PotVal = analogRead(PotPin);
// map and assign pot/pwm values. 0 to 255 corresponds to 0 to 100%
PotValmapped = map(PotVal, PotMin, PotMax, MinSpeed, 254) // change potentiometer characteristic, lowest position corresponds to absolute minimum speed
PWMVal = map(SensorVal, NTCcold, NTChot, PotValmapped, 255); // linear fan curve from ambient to LED lighting up. PotValmapped is the minimum fan speed set by the potentiometer
// Overheating indicator
if (SensorVal>NTChot){
PWMVal=255; // full speed
analogWrite(LEDPin, HIGH); // LED ON
}
else {
analogWrite(LEDPin, LOW); // LED OFF
}
//write the PWM value to the pwm output pin
analogWrite(PWMPin, PWMVal);
//basic RPM indicator
analogWrite(SpeedPin, PWMVal);
}
I added a basic RPM indicator at the last minute... hopefully that'll work. For debug purposes only...
Comments/suggestions are welcome.
I also updated the schematic. It's not final (I'll probably place the MOSFET horizontally and the traces are most certainly too thick):