DIY: Cree CXA Arduino Thermal Monitoring & Protection.

stardustsailor

Well-Known Member
Take a rough idea how the system will work inside the box of CXA -loaded led grow light ...

To rise the temperature to the thermistor ,I use the solder iron ..
Fan is a crappy,weak one ..Just for testing purposese used ..
Blue led represents the signal to the SSR to shut off the power to the CXA drivers if Tc rises above 90°C..

All yours ..
( Please ignore my heavy smokey ol'stoners breathin' ... )


I'm open to your bright ideas,folks ...
Let's make it better,than it is ...
 

stardustsailor

Well-Known Member
Maker's thoughts about his build :

It is a " floating feedback closed-loop " system ...

It measures the heat of (C)X(A) and adjusts fan speed
(positive feedback-wise )..
Fan speed increases ,the chip cools ...
Fan speed lowers ..
Chip Tc rises ..
Fan speed increases ..
And so on ...

"Floating " ...
There's no "target temperature" for the chip,in order for the fan speed to be adjusted constantly
to match that figure ..(like on PID thermal control systems ..) ...
It is not a "fixed closed loop feedback system ...

And in what way it could be ?
What would be the ideal temperature per xxxxmA of driving current ,really ?

So ,Probably a floating system will be good ...
As in every position of the the led driver's constant current adjusting pot
(manually set) the system will respond 'floating" ...

Only question...
Will it balance ,somehow ?
I mean will it reach a "stable" operating state between fan speed/ Tc ,at every given driving current ( ~300-1950mA ) ?
or...
It will keep increasing/decreasing fan speed for ever and ever( oscillating ) ,no matter the driving current ?
LOL !!!!

HELLLLLPPPPPPPP!!!!!!
 
Last edited:

stardustsailor

Well-Known Member
The complete " base code " code :
( only blue or otherwise colored text are the code ...The black are notes and must be left out of code )

//LIB.
#include <math.h>
#include <TimerOne.h>
//Pins
#define SSR_PIN 5
<=This is the pin for the solid state relay output(thermal protection)
#define FAN_PIN 9
<=This is the pin for the fan speed control output
#define SENSOR30A_PIN A0
#define SENSOR30B_PIN A1
#define SENSOR50A_PIN A2
#define SENSOR50B_PIN A3
#define SENSOR27A_PIN A4
#define SENSOR27B_PIN A5
//VAR
#define THR_NOM_RES 10000
<=Value in Ohms of the thermistors nominal resistance.Default:10K
#define TEMP_NOM 25
<=Value in °C of the thermistors nom Res .Temperature.Default: 25C
#define AI 0.003353832
<=The A1-B1-C1-D1 values of the thermistor used .
#define B1 0.0002569355
CHANGE THOSE VALUES!....CHECK FOR THEM IN THERM';S SPEC DATASHEET
#define C1 0.000002626311
#define D1 0.000000675278
#define SAMPLE 5
<=N of samples for averaging therm's R over temperature.
#define SER_RES_30A 10000
<= resistance in Ohms os each series resistor.
#define SER_RES_30B 10000
Measure the ones used and apply values here for higher precision .Default:10K
#define SER_RES_50A 10000
#define SER_RES_50B 10000
#define SER_RES_27A 10000
#define SER_RES_27B 10000
//INT
int samples30A[SAMPLE];
int samples30B[SAMPLE];
int samples50A[SAMPLE];
int samples50B[SAMPLE];
int samples27A[SAMPLE];
int samples27B[SAMPLE];
//SET UP
void setup()
{
//analogReference(EXTERNAL);
Activate that (erase the // in front ),if you are using an external voltage,
pinMode( SSR_PIN,OUTPUT ); for reference (connect it to Aref pin of Arduino )
digitalWrite(SSR_PIN,LOW); <= Change to HIGH ,if Arduino has to output +5V from pin 5 in order to
pinMode (FAN_PIN,OUTPUT );
to declare "normal" temps to the SSR ..
Timer1.initialize(40);
<= the PWM fan control frequency set .Period in microseconds .

( 1 sec/ 40 microsec= 1/ 0.00004 = 25 000 .Default Frequency= 25 kHz .Max setting =1 ( 1Mhz Frequency .Not Adviced.)
Timer1.pwm(FAN_PIN, 768); <= The power level of the fan "kickstart" .Fans-generally- better to 'hot' start from higher level of power to decrease to lower ,than 'cold start' at low power levels ..768 is 75% Duty cycle .
set value = (Desired power level / 100 )* 1024

pinMode (SENSOR30A_PIN,INPUT);
pinMode (SENSOR30B_PIN,INPUT);
pinMode (SENSOR50A_PIN,INPUT);
pinMode (SENSOR50B_PIN,INPUT);
pinMode (SENSOR27A_PIN,INPUT);
pinMode (SENSOR27B_PIN,INPUT);

delay( 5000); <= the duration of the 'kickstart' in milliseconds .Default 5 seconds .Suggested range :2-6 sec .

}
void loop()
{
uint8_t i;
float average30A;
float average30B;
float average50A;
float average50B;
float average27A;
float average27B;
for (i=0; i< SAMPLE; i++)
{
samples30A = analogRead(SENSOR30A_PIN);
samples30B = analogRead(SENSOR30B_PIN);
samples50A = analogRead(SENSOR50A_PIN);
samples50B = analogRead(SENSOR50B_PIN);
samples27A = analogRead(SENSOR27A_PIN);
samples27B = analogRead(SENSOR27B_PIN);
delay(10);
}
average30A=0;
average30B=0;
average50A=0;
average50B=0;
average27A=0;
average27B=0;
for (i=0; i< SAMPLE; i++)
{
average30A += samples30A;
average30B += samples30B;
average50A += samples50A;
average50B += samples50B;
average27A += samples27A;
average27B += samples27B;
}
average30A /= SAMPLE;
average30B /= SAMPLE;
average50A /= SAMPLE;
average50B /= SAMPLE;
average27A /= SAMPLE;
average27B /= SAMPLE;
//
average30A = 1023 / average30A - 1;
average30A = SER_RES_30A / average30A;
//
average30B = 1023 / average30B - 1;
average30B = SER_RES_30B / average30B;
//
average50A = 1023 / average50A - 1;
average50A = SER_RES_50A / average50A;
//
average50B = 1023 / average50B - 1;
average50B = SER_RES_50B / average50B;
//
average27A = 1023 / average27A - 1;
average27A = SER_RES_27A / average27A;
//
average27B = 1023 / average27B - 1;
average27B = SER_RES_27B / average27B;
//
float TC30A;
TC30A = average30A / THR_NOM_RES;
TC30A = log(TC30A);
TC30A =1/(AI+(B1*TC30A)+(C1*TC30A*TC30A)+(D1*TC30A*TC30A*TC30A));
TC30A =TC30A- 273.15;
float TC30B;
TC30B = average30B / THR_NOM_RES;
TC30B = log(TC30B);
TC30B =1/(AI+(B1*TC30B)+(C1*TC30B*TC30B)+(D1*TC30B*TC30B*TC30B));
TC30B =TC30B- 273.15;
float TC50A;
TC50A = average50A / THR_NOM_RES;
TC50A = log(TC50A);
TC50A =1/(AI+(B1*TC50A)+(C1*TC50A*TC50A)+(D1*TC50A*TC50A*TC50A));
TC50A =TC50A- 273.15;
float TC50B;
TC50B = average50B / THR_NOM_RES;
TC50B = log(TC50B);
TC50B =1/(AI+(B1*TC50B)+(C1*TC50B*TC50B)+(D1*TC50B*TC50B*TC50B));
TC50B =TC50B- 273.15;
float TC27A;
TC27A = average27A / THR_NOM_RES;
TC27A = log(TC27A);
TC27A =1/(AI+(B1*TC27A)+(C1*TC27A*TC27A)+(D1*TC27A*TC27A*TC27A));
TC27A =TC27A- 273.15;
float TC27B;
TC27B = average27B / THR_NOM_RES;
TC27B = log(TC27B);
TC27B =1/(AI+(B1*TC27B)+(C1*TC27B*TC27B)+(D1*TC27B*TC27B*TC27B));
TC27B =TC27B- 273.15;


( End of Part A' ).....
 

stardustsailor

Well-Known Member
(part B')


//THERMAL PROTECTION RULES
if ( TC30A >= 90|| TC30B >= 90||TC50A >= 90|| TC50B >= 90|| TC27A >= 90||TC27B >= 90)

The threshold temperature in °C .Over that led drivers switch off
{
digitalWrite(SSR_PIN,HIGH);
<= Change to LOW ,if in "protection" state ,Arduino has to output 0V

at pin 5.
}
else
if ( TC30A < 90&& TC30B< 90 &&TC50A< 90&& TC50B< 90&& TC27A < 90&&TC27B < 90)

The threshold temperature in °C ,lower than that means "normal operation" .It can be set to lower values if you wish
the leds to cool down for longer time ,before switching on back again,after an overheat situation...
{
digitalWrite(SSR_PIN,LOW);
<= Change to LOW ,if in "protection" state ,Arduino has to output 0V
at pin 5.

}
//FAN CONTROL RULES
float TCAVERG;
TCAVERG= ( (TC30A+TC30B+TC50A+TC50B+TC27A+TC27B ) / 6 );

Averaging the six Tc s' ...Simple math here ...

if ( TCAVERG < 25 || TCAVERG >= 25 && TCAVERG < 27.5)
<= Temperature range in °C ,for every Duty Cycle (Fan speed ) level ..Ignore the green part ,is a debugging feature ...(In case of Tc lower than 25°C for the arduino to know what to do ... )
{
Timer1.setPwmDuty(FAN_PIN, 384 );
<= Lower (Initial) power fan level ...

(384/1024)*100= 37.5%
}
else
if ( TCAVERG >= 27.5 && TCAVERG < 30 )
{
Timer1.setPwmDuty(FAN_PIN, 416 );
}
else
if ( TCAVERG >= 30 && TCAVERG < 32.5 )
{
Timer1.setPwmDuty(FAN_PIN, 448 );
}
else
if ( TCAVERG >= 32.5 && TCAVERG < 35 )
{
Timer1.setPwmDuty(FAN_PIN, 480 );
}
else
if ( TCAVERG >= 35 && TCAVERG < 37.5 )
{
Timer1.setPwmDuty(FAN_PIN, 512 );
}
else
if ( TCAVERG >= 37.5 && TCAVERG < 40 )
{
Timer1.setPwmDuty(FAN_PIN, 544 );
}
else
if ( TCAVERG >= 40 && TCAVERG < 42.5 )
{
Timer1.setPwmDuty(FAN_PIN, 576 );
}
else
if ( TCAVERG >= 42.5 && TCAVERG < 45 )
{
Timer1.setPwmDuty(FAN_PIN, 608 );
}
else
if ( TCAVERG >= 45 && TCAVERG < 47.5 )
{
Timer1.setPwmDuty(FAN_PIN, 640 );
}
else
if ( TCAVERG >= 47.5 && TCAVERG < 50 )
{
Timer1.setPwmDuty(FAN_PIN, 672 );
}
else
if ( TCAVERG >= 50 && TCAVERG < 52.5 )
{
Timer1.setPwmDuty(FAN_PIN, 704 );
}
else
if ( TCAVERG >= 52.5 && TCAVERG < 55 )
{
Timer1.setPwmDuty(FAN_PIN, 736 );
}
else
if ( TCAVERG >= 55 && TCAVERG < 57.5 )
{
Timer1.setPwmDuty(FAN_PIN, 768 );
}
else
if ( TCAVERG >= 57.5 && TCAVERG < 60)
{
Timer1.setPwmDuty(FAN_PIN, 800 );
}
else
if ( TCAVERG >= 60 && TCAVERG < 62.5 )
{
Timer1.setPwmDuty(FAN_PIN, 832 );
}
else
if ( TCAVERG >= 62.5 && TCAVERG < 65 )
{
Timer1.setPwmDuty(FAN_PIN, 864 );
}
else
if ( TCAVERG >= 65 && TCAVERG < 67.5 )
{
Timer1.setPwmDuty(FAN_PIN, 896 );
}
else
if ( TCAVERG >= 67.5 && TCAVERG < 70 )
{
Timer1.setPwmDuty(FAN_PIN, 928 );
}
else
if ( TCAVERG >= 70 && TCAVERG < 72.5 )
{
Timer1.setPwmDuty(FAN_PIN, 960 );
}
else
if ( TCAVERG >= 72.5 && TCAVERG < 75 )
{
Timer1.setPwmDuty(FAN_PIN, 992 );
}
else
if ( TCAVERG >= 75 )
<=Threshold temperature in °C ,where fans from there and avbove operate at chosen max level .
{
Timer1.setPwmDuty(FAN_PIN, 1023 );
<=Max value of Duty Cycle .Default: 100%
}
delay(1000);
<= Refresh Rate of the system operational loop in milliseconds .Default :1 sec (1 hz ,one time every sec )
}
//END
 

stardustsailor

Well-Known Member
Im not quite sure if it works ....
but ......

Version 2 of "fan control rules :" ...

//FAN CONTROL RULES
float TCAVERG;
TCAVERG= ( (TC30A+TC30B+TC50A+TC50B+TC27A+TC27B ) / 6 );

float SPDX;
SPDX= map( TCAVERG,25,74,384,1023);

if ( TCAVERG < 25 )
{
Timer1.setPwmDuty(FAN_PIN, 384 );
}
else
if ( TCAVERG >= 25 && TCAVERG < 75)
{

Timer1.setPwmDuty(FAN_PIN, SPDX );

}
else
if ( TCAVERG >= 75 )
{

Timer1.setPwmDuty(FAN_PIN, 1023);

}
delay(1000);
}
//END


......And that was it ...Arduino maps average temperature ( range 25-74 C ) into 37.5%-100% power and adjusts automatically ..
( except in cases <25 & >= 75 where it sets min and max speed settings accordingly (or respectively it is ...? )
I've to test it and see if the code works though ...

"Full Float " ....
 

stardustsailor

Well-Known Member
Im not quite sure if it works ....
but ......

Version 2 of "fan control rules :" ...

//FAN CONTROL RULES
float TCAVERG;
TCAVERG= ( (TC30A+TC30B+TC50A+TC50B+TC27A+TC27B ) / 6 );

float SPDX;
SPDX= map( TCAVERG,25,74,384,1023);

if ( TCAVERG < 25 )
{
Timer1.setPwmDuty(FAN_PIN, 384 );
}
else
if ( TCAVERG >= 25 && TCAVERG < 75)
{

Timer1.setPwmDuty(FAN_PIN, SPDX );

}
else
if ( TCAVERG >= 75 )
{

Timer1.setPwmDuty(FAN_PIN, 1023);

}
delay(1000);
}
//END


......And that was it ...Arduino maps average temperature ( range 25-74 C ) into 37.5%-100% power and adjusts automatically ..
( except in cases <25 & >= 75 where it sets min and max speed settings accordingly (or respectively it is ...? )
I've to test it and see if the code works though ...

"Full Float " ....

IT WORKS LIKE CREAM!!!

Check the kick start ,the flawless speed fan response and the thermal protection !
Superb ...A trully nice thermal monitoring ,protecting and active cooling control system !

 

stardustsailor

Well-Known Member
//LIB.

#include <math.h>
#include <TimerOne.h>
//LCD Display Fonts
extern uint8_t Normal[];
//Pins

#define SSR_PIN 10
#define FAN_PIN 9
#define SENSOR30A_PIN A0
#define SENSOR30B_PIN A1
#define SENSOR50A_PIN A2
#define SENSOR50B_PIN A3
#define SENSOR27A_PIN A4
#define SENSOR27B_PIN A5
//VAR
#define THR_NOM_RES 10000
#define TEMP_NOM 25
#define AI 0.003353832
#define B1 0.0002569355
#define C1 0.000002626311
#define D1 0.000000675278
#define SAMPLE 5
#define SER_RES_30A 10000
#define SER_RES_30B 10000
#define SER_RES_50A 10000
#define SER_RES_50B 10000
#define SER_RES_27A 10000
#define SER_RES_27B 10000
//INT
int samples30A[SAMPLE];
int samples30B[SAMPLE];
int samples50A[SAMPLE];
int samples50B[SAMPLE];
int samples27A[SAMPLE];
int samples27B[SAMPLE];
//SET UP
void setup()
{
//analogReference(EXTERNAL); //activate for shield
pinMode( SSR_PIN,OUTPUT );
digitalWrite(SSR_PIN,LOW);
pinMode (FAN_PIN,OUTPUT );
Timer1.initialize(40);
Timer1.pwm(FAN_PIN, 768,40);
pinMode (SENSOR30A_PIN,INPUT);
pinMode (SENSOR30B_PIN,INPUT);
pinMode (SENSOR50A_PIN,INPUT);
pinMode (SENSOR50B_PIN,INPUT);
pinMode (SENSOR27A_PIN,INPUT);
pinMode (SENSOR27B_PIN,INPUT);

}

void loop()
{
uint8_t i;
float average30A;
float average30B;
float average50A;
float average50B;
float average27A;
float average27B;
for (i=0; i< SAMPLE; i++)
{
samples30A = analogRead(SENSOR30A_PIN);
samples30B = analogRead(SENSOR30B_PIN);
samples50A = analogRead(SENSOR50A_PIN);
samples50B = analogRead(SENSOR50B_PIN);
samples27A = analogRead(SENSOR27A_PIN);
samples27B = analogRead(SENSOR27B_PIN);
delay(10);
}
average30A=0;
average30B=0;
average50A=0;
average50B=0;
average27A=0;
average27B=0;
for (i=0; i< SAMPLE; i++)
{
average30A += samples30A;
average30B += samples30B;
average50A += samples50A;
average50B += samples50B;
average27A += samples27A;
average27B += samples27B;
}
average30A /= SAMPLE;
average30B /= SAMPLE;
average50A /= SAMPLE;
average50B /= SAMPLE;
average27A /= SAMPLE;
average27B /= SAMPLE;
//
average30A = 1023 / average30A - 1;
average30A = SER_RES_30A / average30A;
//
average30B = 1023 / average30B - 1;
average30B = SER_RES_30B / average30B;
//
average50A = 1023 / average50A - 1;
average50A = SER_RES_50A / average50A;
//
average50B = 1023 / average50B - 1;
average50B = SER_RES_50B / average50B;
//
average27A = 1023 / average27A - 1;
average27A = SER_RES_27A / average27A;
//
average27B = 1023 / average27B - 1;
average27B = SER_RES_27B / average27B;
//
float TC30A;
TC30A = average30A / THR_NOM_RES;
TC30A = log(TC30A);
TC30A =1/(AI+(B1*TC30A)+(C1*TC30A*TC30A)+(D1*TC30A*TC30A*TC30A));
TC30A =TC30A- 273.15;
float TC30B;
TC30B = average30B / THR_NOM_RES;
TC30B = log(TC30B);
TC30B =1/(AI+(B1*TC30B)+(C1*TC30B*TC30B)+(D1*TC30B*TC30B*TC30B));
TC30B =TC30B- 273.15;
float TC50A;
TC50A = average50A / THR_NOM_RES;
TC50A = log(TC50A);
TC50A =1/(AI+(B1*TC50A)+(C1*TC50A*TC50A)+(D1*TC50A*TC50A*TC50A));
TC50A =TC50A- 273.15;
float TC50B;
TC50B = average50B / THR_NOM_RES;
TC50B = log(TC50B);
TC50B =1/(AI+(B1*TC50B)+(C1*TC50B*TC50B)+(D1*TC50B*TC50B*TC50B));
TC50B =TC50B- 273.15;
float TC27A;
TC27A = average27A / THR_NOM_RES;
TC27A = log(TC27A);
TC27A =1/(AI+(B1*TC27A)+(C1*TC27A*TC27A)+(D1*TC27A*TC27A*TC27A));
TC27A =TC27A- 273.15;
float TC27B;
TC27B = average27B / THR_NOM_RES;
TC27B = log(TC27B);
TC27B =1/(AI+(B1*TC27B)+(C1*TC27B*TC27B)+(D1*TC27B*TC27B*TC27B));
TC27B =TC27B- 273.15;


//THERMAL PROTECTION RULES
if ( TC30A >= 90|| TC30B >= 90||TC50A >= 90|| TC50B >= 90|| TC27A >= 90||TC27B >= 90)
{
digitalWrite(SSR_PIN,HIGH);
}
else
if ( TC30A < 90&& TC30B< 90 &&TC50A< 90&& TC50B< 90&& TC27A < 90&&TC27B < 90)
{
digitalWrite(SSR_PIN,LOW);
}

//FAN CONTROL RULES
float TCAVERG;
TCAVERG= ( (TC30A+TC30B+TC50A+TC50B+TC27A+TC27B ) / 6 );
float SPDX;
SPDX= map( TCAVERG,25,74,384,1023);

if ( TCAVERG < 25 )
{
Timer1.setPwmDuty(FAN_PIN, 384 );
}
else
if ( TCAVERG >= 25 && TCAVERG < 75)
{
Timer1.setPwmDuty(FAN_PIN, SPDX );
}
else
if ( TCAVERG >= 75 )
{
Timer1.setPwmDuty(FAN_PIN, 1023);
}
delay(1000);
}
 

stardustsailor

Well-Known Member
No ....
But I found why ....
When I copy paste the code ,RIU takes out a " [ i ] " from these lines :....

samples30A = analogRead(SENSOR30A_PIN);
samples30B = analogRead(SENSOR30B_PIN);
samples50A = analogRead(SENSOR50A_PIN);
samples50B = analogRead(SENSOR50B_PIN);
samples27A = analogRead(SENSOR27A_PIN);
samples27B = analogRead(SENSOR27B_PIN);


That ,thing should be after every samplesXXx before the =mark
And ....
At

for (i=0; i< SAMPLE; i++)
{
average30A += samples30A;
average30B += samples30B;
average50A += samples50A;
average50B += samples50B;
average27A += samples27A;
average27B += samples27B;
}


after every samplesXXx before the ; mark

And I think It's ok ,then ...
 
Last edited:

salmone

Well-Known Member
tuning the reflow oven
http://coralux.net/?p=348

https://learn.adafruit.com/downloads/pdf/adafruit-1-wire-thermocouple-amplifier-max31850k.pdf
1-Wire for all the thermocouples

http://www.adafruit.com/datasheets/kthermotable.pdf

K Thermocouple Datasheet

http://www.adafruit.com/datasheets/MAX31850-MAX31851.pdf
MAX31850 datasheet

http://www.adafruit.com/datasheets/MAX6675.pdf
MAX6675 (discontinued)

http://www.analog.com/en/mems-sensors/digital-temperature-sensors/ad595/products/product.html
AD595 (analog)

https://learn.adafruit.com/downloads/pdf/connecting-the-max31855-thermocouple-amplifier-breakout-to-an-electric-imp.pdf
Read thermocouple data with an Electric Imp, then graph it on Xively, tweet it, and monitor it on your iPhone!

PWM Fan Control Feature
http://coralux.net/?p=437

http://www.formfactors.org/developer\specs\4_Wire_PWM_Spec.pdf
4-Wire Pulse Width Modulation (PWM) Controlled Fans

great design ...at last for my pov


Easy access temperature test point makes LED junction temperature measurements fast and simple.





http://www.luxeonstar.com/v/vspfiles/downloadables/sr-02.pdf
SR-02 Datasheet

http://www.luxeonstar.com/v/vspfiles/downloadables/sr-02-thermal.pdf
Onboard Thermistor Temperature Measurement Application Note

http://www.luxeonstar.com/v/vspfiles/downloadables/NTHS0805N02N1002J Curve.xls
Thermistor Temperature/Resistance Curve

http://www.luxeonstar.com/v/vspfiles/downloadables/nths.pdf
Vishay NTC 10K thermistor


http://www.maximintegrated.com/app-notes/index.mvp/id/148
Guidelines for Reliable Long Line 1-Wire Networks

http://playground.arduino.cc/Learning/OneWire
Dallas Semiconductor's 1-Wire Protocol

http://www.pjrc.com/teensy/td_libs_OneWire.html
OneWire lets you access 1-wire devices made by Maxim/Dallas, such as temperature sensors and ibutton secure memory. For temperature sensors, the DallasTemperature library can be used with this library

and more info links on link ^ ^...

and pardon me sds for this hijack too... i hope you understand me well...
 
Last edited:

salmone

Well-Known Member
on mosfet you select IRF540N... i see IRFZ44N on a web they recomend for PWM
http://www.neoteo.com/irfz44n-el-mos-fet-de-batalla-para-pwm/

on control temp... your design depens on driver function...elected... in my dreams the driver is dimable... and the control temperature dimming the amperage of the driver...minus amperaje minus temp on leds arrays.. what dimmanle driver for yor design?

pwm for fans... but pwm for leds too ...or dim fans and dim leds too ..two systems working ..in my dream prototype...

saludos
 
Last edited:

Positivity

Well-Known Member
My light has a thermostat that shuts off at 95c, dimmable driver, and dimmable fans. Kinda the manual version of this. Electronic way is very cool but I'll have to wait till I have more free time.

These features make the light safe and very tunable. I wouldn't do it any other way anymore.
 
Very nice @stardustsailor , is this your own code?

Nice to see some other guys with an engineering back ground, project looks very good so far. I do power management design and board layouts, if you have not done a layout yet, I would definitely be interested in laying one out in my free time. I played with Arduino's while I was in school and actually picked up one of their Due's the other week with the Atmel SAM3X 32bit MCU, might try to port this code over to the 32 bit core and get some added functionality and speed.

@salmone , when selecting the FET, I would just make sure it is a logic-level FET to allow switching from one of the I/O's of the MCU, which can only source about 20mA @ 5V.

Awesome project and will definitely be following this one!
 
@stardustsailor , I see where you had some questions regarding your fan drive circuit?

Could you let me know what you need some help on and I would be more than happy to help out where I can, now I am a hardware engineer, software is not my strong point, haha. We do a lot of different stage lighting where I work, we are using CREE's XML Xlamps and their MT-G's, also been playing around with some of CREE's RGB's, so LED driver design is definitely my strong point. Depending on how many LEDs are in the string you are driving and what the max output current of the array is, using a specialized driver IC may be more suitable than using discrete components.
 

stardustsailor

Well-Known Member
on mosfet you select IRF540N... i see IRFZ44N on a web they recomend for PWM
http://www.neoteo.com/irfz44n-el-mos-fet-de-batalla-para-pwm/

on control temp... your design depens on driver function...elected... in my dreams the driver is dimable... and the control temperature dimming the amperage of the driver...minus amperaje minus temp on leds arrays.. what dimmanle driver for yor design?

pwm for fans... but pwm for leds too ...or dim fans and dim leds too ..two systems working ..in my dream prototype...

saludos
Very nice @stardustsailor , is this your own code?

Nice to see some other guys with an engineering back ground, project looks very good so far. I do power management design and board layouts, if you have not done a layout yet, I would definitely be interested in laying one out in my free time. I played with Arduino's while I was in school and actually picked up one of their Due's the other week with the Atmel SAM3X 32bit MCU, might try to port this code over to the 32 bit core and get some added functionality and speed.

@salmone , when selecting the FET, I would just make sure it is a logic-level FET to allow switching from one of the I/O's of the MCU, which can only source about 20mA @ 5V.

Awesome project and will definitely be following this one!

No it's not entirely my code ...
But yes ,I did "evolve " it in my own " needs and "form" ..
Thank you for all your kind words and offerings ..
But firstly go here ..<=
And read it ,if you spare any free time ...

We can analyse it further from there ...
 

salmone

Well-Known Member
@TheHazeyMan im not a expert... on nothing... im poor poor dyer...but i like read... i dont unserstand you very well...but thanks for your opinion... its very difficult to me talk or understand terms cientific on english... i hope you understand me..

logic level fet?... too much for me poor english... sorry...

i see few differences .... on datasheet for my eyes... where i saw for see logic level fet differences...

sorry my bad english...

http://www.irf.com/product-info/datasheets/data/irf540n.pdf
datasheet irf540n

http://www.irf.com/product-info/datasheets/data/irfz44n.pdf
datasheet irfz44n

sds..thanks for your patience with me ...
 
Last edited:

stardustsailor

Well-Known Member
My friend salmone ...
The IRFz44n can not deliver the amperage that the IRF540 can ,when at their gates they have 4.5-5 volts
(that is often called "logic level '" ..must IC's and logic circuitry ,use 5 VDC and 0/low is <0.7 Volts ,as 1/High signal is often >2.5 VDC )


Irfz44n ...


123.JPG




At gate 4.5V ,current is 9A up to 25 V ....



IRF540n
456.JPG
at 4.5 V gate voltage ...10,plus a tad Amperes, at 50 Volts ..
(@25 C ....)


Driving 4x fans 12 V ,451 mA each ....( 1,8 A ),for hours and hours ....
Imagine the inductive kick-back spikes ..
(over) Driving them at 15 V,probably they going to suck about ~500mA if not more ....
2A at 15 V ...
For hours and hours of operation ....


Irf540 ,is far better mosfet for the job ...
(for this particular job ..IRFz44 is much faster recovering mosfet ...But not for big /difficult 'loads',as 20 Watts of fans ,with gate voltage 4.5-5 VDC ...)
 
Top