PWM Fan Controller
Het Idee
Ik had een aantal PWM (4 draads) fans die ik graag op een PWM fan controller aan wilde sluiten. Nou daar zijn er dus niet veel van, de enigste die ik kan vinden kost een kleine 120 euro. Dit moet goedkoper kunnen, nu had ik ook net mijn eerste arduino ontvangen dus waarom dit niet samen voegen. Toen ben ik aan de slag gegaan met wat hulp vanuit het arduino topic. Om dat topic wat te ontlasten hier verder gegaan. De voortgang zal ik in de OP bijhouden.Voortgang

Zwart: GND
Rood: 12V
Bruin: LCD data
Geel: RPM
Blauw: PWM
Grijs: Button
Groen: LCD backlight
Zo ziet het hardware plaatje er tot nu toe uit.
Hardware:
- Arduino UNO (wordt wss vervangen door een Pro Mini)
- 1602 LCD
- Breadboard (straks hopelijk een eigen bordje
- 3 momentary switches
- Instel pod
Voor de aansturing heb ik het volgende uitgedacht:


Laatste volgt nog
Code voor het uitlezen van de RPM's via de analoge pinnen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| int pin = A0; unsigned long duration; unsigned int rpm; void setup() { pinMode(pin, INPUT); Serial.begin(9600); } void loop() { duration = pulseIn(pin, HIGH); //X is the max rpm of your fan (12V) //Y is the average outcome of duration at 12V (first two outcomes/2) rpm = (( X L* Y )/duration); //Z is the printed duration as rpm when the fan has stopped. if (rpm == Z){ Serial.println("0"); if (rpm <Z){ Serial.println(rpm); } } |
Deze code vereist wel enige calibratie:
Wat je als eerste doet is dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| int pin = A0; unsigned long duration; void setup() { pinMode(pin, INPUT); Serial.begin(9600); } void loop() { duration = pulseIn(pin, HIGH); Serial.println(duration); } |
Dan krijg je in de serial monitor een hele waslijst aan getallen.
Dan even automatisch scrollen uitzetten en het gemiddelde nemen van de eerste paar getallen.
Vervolgens ga je de gemiddelde duration samen met je max rpm (alles gemeten op 12V) invullen.
X = max rpm
Y = gem duration
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| int pin = A0; unsigned long duration; unsigned int rpm; void setup() { pinMode(pin, INPUT); Serial.begin(9600); } void loop() { duration = pulseIn(pin, HIGH); rpm = (( 2200L*6550 )/duration); Serial.println(rpm); } } |
De 'L' blijft staan omdat anders het cijfer niet goed wordt weergegeven.
Dan ga je kijken of de rpm keurig wordt weergegeven, zo ja dan stop je de fan met de hand en kijk je welk getal in de seriele monitor verschijnt. Dit is je 'Z'.
Zo nee dan heb je iets van de 'X' en de 'Y' niet goed ingevuld.
[ Voor 78% gewijzigd door ProAce op 26-05-2014 09:10 ]