Circuits Online Voeding 2016 Deel 2

Dit topic is gesloten

Hoi Bram,

Ik heb nog een printje en een ringtrafo liggen, dus waarom niet?
Wel enige ervaring met het gebruik van Arduino, dus misschien dat ik nog iets kan bijdragen.

Groeten,
Erik

Ik heb hier op CO ook al eens gevraagd naar een voltmeter IC'tje. Arco heeft mij toen de INA220 aangeraden. Da's een I2C voltmeter/amperemeter/wattmeter.
Je kan de amperemeter ook misbruiken als een spanningsmetertje. Je moet wel enige vorm van spanningsdeling voorzien, aangezien je max 26V mag meten met het ic'tje. (en ze zijn klein.)
De ltc2990 kan ook. Dan kan je 4 spanningen tov ground meten, of 2 differentieel.

Als je maar genoeg geinteresseerd ben, verwondert heel de wereld.
marcob

Golden Member

Neem dan de INA226, deze kan tot 36 Volt

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

verdorie. Had ik dat geweten voor ik de andere had besteld... ach ja, zo zie je maar weer wat een beetje werk op voorhand al kan doen. :p

Als je maar genoeg geinteresseerd ben, verwondert heel de wereld.

Onder het mom van het kan altijd beter en tweaken omdat het kan... ;-)

Arduino, ik kende het wel maar had er nog nooit mee gewerkt. Het Arduino project wat Bram een paar posts terug liet zien leek mij wel een gaaf stukje techniek. Daarnaast, om de voeding nog wat koeler te houden zou een fan geen overbodige luxe kunnen zijn. Niet niveau straaljager, maar intelligent gestuurd. Daar kan je natuurlijk ook een Arduino voor gebruiken. Dus maar een zut Arduino's, breadbordjes en sensors besteld in het verre Oosten. Eerst maar eens even wat geprobeerd met een 16x2 display. Toen wat opgeschaald naar een 16x4 display.

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/0.jpg

So far so good, misschien handig voor de Banggood voeding die ik nog af moet maken want dit past niet in m'n kassie. Dus ook maar een Nokia 5110 display gekocht en de code wat aangepast. Die Arduino's zijn echt fantastisch. Via een Max471 (dat gaat nog nét qua max spanning van 36V) en een weerstanddelertje van 11x (aangepast op de China print) meet ik de stroom door en de spanning over de bufferelco's. Daaruit bereken ik... nouja daaruit berekent de Arduino het vermogen. Verder stuur ik de fan aan via PWM en een BD139. Deze gaat aan vanaf 30 graden en draait op volle snelheid bij 60 graden, waarvan het percentage weergegeven wordt. Als de 60 graden bereikt is gaat een indicatieLED branden. Het is ook gelukt om het aantal RPM uit te lezen via de hall sensor in de fan, maar dit vindt de Arduino minder leuk; doordat de fan high side geswitched wordt is er een potentiaalverschil van +/- 9V wanneer de fan traag draait en loopt er een stroom wanneer ik de tachometer van de fan aansluit op de Arduino. Ik heb al geprobeerd om low side te switchen met een BD140 maar dat werkt niet echt lekker met PWM; het is dan alleen aan of uit. Misschien weet iemand wel een oplossing hoe dit gefixt kan worden.

Hier wat fotootjes:

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/1.JPG

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/2.jpg

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/4.JPG

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/5.JPG

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/6.JPG

Michael / PA4MW
blackdog

Honourable Member

Hi Koekoeksklok,

Leuk gedaan!
Je hebt het eerder ingebouwd dan ik het heb getest op een van mijn CO-2016 printjes :-)

Leuk dat je inspiratie haalt uit wat ik hier laat zien.
Wil je het ook delen met andere hier op het forum?

Gegroet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Hi Bram,

Thanks :-)!

Sure, helemaal vergeten! Hier is de sketch, welke trouwens voor een deel gebasseerd is op wat jij eerder postte. Super dat je dat openbaar maakte!

c code:

 
#include <U8glib.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
 
U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8);       // Constructor For Connection SPI Nokia 5110 Display: CLK = 13, DIN = 11, CE = 10, DC = 9, RST = 8

int fan = 6;                                // The pin where fan is
int led = 7;                                // Led pin
int tempMin = 30;                           // The temperature to start the fan
int tempMax = 60;                           // The maximum temperature when fan is at 100%
int fanSpeed;      
int fanLCD;  

#define VT_PIN A0                           // Connect VT
#define AT_PIN A1                           // Connect AT
#define ONE_WIRE_BUS 4                      // Data wire is plugged into pin 4 on the Arduino
#define T_PRECISION 12                      // Set variable T_PRECISION to 12 (12 bit resolution on the 18D20)

OneWire oneWire(ONE_WIRE_BUS);              // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);        // Pass our oneWire reference to Dallas Temperature. 

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
 
DeviceAddress insideThermometer = { 0x28, 0xFF, 0xFC, 0x7F, 0xC1, 0x15, 0x01, 0x48 };
 
void setup(void)
{
  sensors.begin();                                          // Start up the library
  sensors.setResolution(insideThermometer, T_PRECISION);    // Resolution
  pinMode(fan, OUTPUT);
  pinMode(led, OUTPUT); 
}
 
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
u8g.print("Error");
} 
else {
u8g.print(tempC);
}

if(tempC < tempMin) {   // If temp is lower than minimum temp
fanSpeed = 0;           // fan is not spinning
digitalWrite(fan, LOW);       
} 
  
if((tempC >= tempMin) && (tempC <= tempMax)) {        // If temperature is higher than minimum temp
fanSpeed = map(tempC, tempMin, tempMax, 32, 255);     // The actual speed of fan
fanLCD = map(tempC, tempMin, tempMax, 0, 100);        // Speed of fan to display on LCD
analogWrite(fan, fanSpeed);                           // Spin the fan at the fanSpeed speed
} 
   
if(tempC > tempMax) {                                 // If temp is higher than tempMax
digitalWrite(led, HIGH);                              // Turn on led 
} 
else {                                                // Else turn of led
digitalWrite(led, LOW); 
}
}
 
void loop(void)
{
int vt_read = analogRead(VT_PIN);
int at_read = analogRead(AT_PIN);
float voltage = vt_read * (5.0 / 1023.0) * 11;
float current = at_read * (5.0 / 1023.0);
float watts = voltage * current;

u8g.setContrast(130); 
sensors.requestTemperatures();     // Ask temp

u8g.firstPage();  
    do {
    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 7, "Ubuf");           
    u8g.setPrintPos(27, 7);                      
    u8g.print(voltage);                            
    u8g.setPrintPos(61, 7);  
    u8g.print("Volt");

    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 15, "Ibuf");           
    u8g.setPrintPos(27, 15);                      
    u8g.print(current);                            
    u8g.setPrintPos(61, 15);  
    u8g.print("Amp");

    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 23, "Pbuf");           
    u8g.setPrintPos(27, 23);                      
    u8g.print(watts);                            
    u8g.setPrintPos(61, 23);  
    u8g.print("Watt");

    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 31, "Fan");           
    u8g.setPrintPos(27, 31);                      
    u8g.print(fanLCD);                            
    u8g.setPrintPos(44, 31);  
    u8g.print("%");
    
    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 39, "Temp");           
    u8g.setPrintPos(27, 39);                      
    printTemperature(insideThermometer);                            
    u8g.setPrintPos(63, 39);  
    u8g.print("\260C");
 }  
 
 while( u8g.nextPage() ); 
    delay(100);
}
 

En aangevuld met RPM uitlezing:

c code:

 
#include <U8glib.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>

 
U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8);       // Constructor For Connection SPI Nokia 5110 Display: CLK = 13, DIN = 11, CE = 10, DC = 9, RST = 8

int fan = 6;        // the pin where fan is
int led = 7;        // led pin
int tempMin = 30;   // the temperature to start the fan
int tempMax = 60;   // the maximum temperature when fan is at 100%
int fanSpeed;      
int fanLCD;
int ticks = 0, Speed = 0;
int hallsensor = 2; 

typedef struct{   
char fanntype;
unsigned int fanndiv; }

fannspec;

//Definitions of the fans
//This is the varible used to select the fan and it's divider,
//set 1 for unipole hall effect sensor
//and 2 for bipole hall effect sensor

fannspec fannspace[3]={{0,1},{1,2},{2,8}}; char fann = 2;

#define VT_PIN A0                           // connect VT
#define AT_PIN A1                           // connect AT
#define ONE_WIRE_BUS 4                      // Data wire is plugged into pin 4 on the Arduino
#define T_PRECISION 12                      // Set variable T_PRECISION to 12 (12 bit resolution on the 18D20)

OneWire oneWire(ONE_WIRE_BUS);              // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);        // Pass our oneWire reference to Dallas Temperature. 

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
 
DeviceAddress insideThermometer = { 0x28, 0xFF, 0xFC, 0x7F, 0xC1, 0x15, 0x01, 0x48 };

void pickrpm ()
//This is the function that the interupt calls
{ ticks++; }

void setup(void)
{
  sensors.begin();    // Start up the library
  sensors.setResolution(insideThermometer, T_PRECISION);    // Resolution
  pinMode(fan, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(hallsensor, INPUT); 
  attachInterrupt(0, pickrpm, RISING); 
  digitalWrite(hallsensor, HIGH);
}
 
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
u8g.print("ERROR");
} 
else {
u8g.print(tempC);
}

if(tempC < tempMin) {   // if temp is lower than minimum temp
fanSpeed = 0;           // fan is not spinning
digitalWrite(fan, LOW);       
} 
  
if((tempC >= tempMin) && (tempC <= tempMax)) {        // if temperature is higher than minimum temp
fanSpeed = map(tempC, tempMin, tempMax, 32, 255);     // the actual speed of fan
fanLCD = map(tempC, tempMin, tempMax, 0, 100);        // speed of fan to display on LCD
analogWrite(fan, fanSpeed);                           // spin the fan at the fanSpeed speed
} 
   
if(tempC > tempMax) {                                 // if temp is higher than tempMax
digitalWrite(led, HIGH);                              // turn on led 
} 
else {                                                // else turn of led
digitalWrite(led, LOW); 
}
}
 
void loop(void)
{
int vt_read = analogRead(VT_PIN);
int at_read = analogRead(AT_PIN);
float voltage = vt_read * (5.0 / 1023.0) * 11;
float current = at_read * (5.0 / 1023.0);
float watts = voltage * current;

ticks = 0;      // Make ticks zero before starting interrupts.

interrupts();    // or use sei(); to Enables interrupts
delay (1000);     //Wait 1 second
noInterrupts();  //  or use  cli();  to Disable interrupts

//Times sensorclicks (which is apprioxiamately the fequency the fan 
//is spinning at) by 60 seconds before dividing by the fan's divider
// this gives reasonable accuracy in upto few 10s of RPM
// for more accurate and fast measurements, other algorithms is required.
Speed = ((ticks * 60)/fannspace[fann].fanndiv);  

u8g.setContrast(130); 
sensors.requestTemperatures();     // Ask temp

u8g.firstPage();  
    do {
    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 7, "Ubuf");           
    u8g.setPrintPos(27, 7);                      
    u8g.print(voltage);                            
    u8g.setPrintPos(61, 7);  
    u8g.print("Volt");

    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 15, "Ibuf");           
    u8g.setPrintPos(27, 15);                      
    u8g.print(current);                            
    u8g.setPrintPos(61, 15);  
    u8g.print("Amp");

    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 23, "Pbuf");           
    u8g.setPrintPos(27, 23);                      
    u8g.print(watts);                            
    u8g.setPrintPos(61, 23);  
    u8g.print("Watt");

    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 31, "Fan");           
    u8g.setPrintPos(27, 31);                      
    u8g.print(fanLCD);                            
    u8g.setPrintPos(44, 31);  
    u8g.print("%");
    char  SpeedString[4];    // Buffer to store string of 4 chars + 0 termination
    sprintf(SpeedString, "%4d", Speed);   // change this to %3, 4 ,5 etc depending upon your max speed
    u8g.setPrintPos(51, 31);  
    u8g.print(SpeedString);
    
    u8g.setFont(u8g_font_6x12);                      
    u8g.drawStr(0, 39, "Temp");           
    u8g.setPrintPos(27, 39);                      
    printTemperature(insideThermometer);                            
    u8g.setPrintPos(63, 39);  
    u8g.print("\260C");
 }  
 
 while( u8g.nextPage() ); 
    delay(100);
}

Let hierbij op bij de attachInterrupt(0, pickrpm, RISING); de interrupt is voor ieder Arduino model weer anders en dit is niet het pinnummer. Pen 2 = 0 en pen 3 = 1 voor de nano.

Kleine disclaimer; ik ben nog maar net begonnen met Arduino, dus de code is vast nog niet optimaal ;-).

Michael / PA4MW
blackdog

Honourable Member

Hi Koekoeksklok

Dank je voor de code, ook goed dat je ook nog even aangeeft dat Interrupt 0 niet aan Pin-0 hangt, kan een hoop verwarring schelen :-)

Hoe heb je het nu met je ventilator opgelost, want het is mij niet duidelijk.
Heb je een extra sensor bij de ventilator geplakt of gebruik je een aansluiting van de ventilator hiervoor.

Ventilatoren PWM regelen gaat meestal alleen mooi, als de desbetreffende ventilator een PWM ingang heeft.
De voeding van de meeste ventilatoren moet een lage Ri hebben.
Een "gewone" ventilator vanuit een transistor met PWM aansturen is meestal geen goed plan.
Als de PWM transistor uit is ziet de ventilator een hoge Ri.
Je kan een elco over de ventilator zetten maar dat vind je PWM transistor weer niet leuk.
Beter blijft b.v. mijn simpele analoge regelaar of een andere analoge regeling en dat je dan met een sensor op je display de snelheid aangeeft.

Nog een tip.
Je hebt de bedrading in je voeding met bindbandjes vastgezet, dat is verder OK, dat doe ik ook regelmatig.
Maar zoals jij het doet vraagt om storingen, bedrading mag nooit strak staan, ook al heeft men dan meer het gevoel dat het dan netter is.

Het kabeltje dat naar het printje gaat dat aan de elco vast zit is wat mij betreft OK,
maar het kabeltje dat recht naar achteren gaat is en NoNo :-)

Let daar op, is vooral als je later aparatuur gaat maken die getransporteerd gaat worden en dan ook betrouwbaar moet zijn.

Nog een Tip.
Plaats een rooster op de achterzijde van de ventilator.
Dat jij de stukken van je nagels slaat als je er in grijpt is jouw probleem,
voor iemand anders, zoals vrienden, studie genoten, familie e.d. is dit minder fijn.
Je wordt daar niet populiair mee *grin*

Keep up the good work!

Gegroet,
Blackdog

PS,
Maak je niet druk over de code, de mijne is nog steeds van het RDC type. (Real Dumb Code)
Maar langzaam aan wordt het wat beter.

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Hi Bram,

Dank voor de tips :)!

Aan het koelblok is een DS18B20 temperatuursensor bevestigd (waar de 3 polige DuPont kabel naartoe loopt). Ik heb een klein gaatje geboord in het koelblok waar de DS18B20 precies inpast met hiertussen een klein beetje koelpasta om het contactoppervlak te vergroten. Het 3 polige kabeltje zit vrij stevig vast aan de header, maar goede tip deze nog iets minder strak te zetten, meteen gedaan! :) Aan de hand van de sensorwaarde gaat de ventillator harder, danwel zachter draaien. Ik heb een elco tussen basis en emitter gezet. Hier is trouwens het schema dat ik daarvoor gebruikt heb (pinnen zijn anders in mijn sketch en gebruik geen LM35):

http://www.electroschematics.com/wp-content/uploads/2014/01/arduino-temperature-fan-speed-control.png

Het werkt tot nu toe eigenlijk best goed, behalve als ik ook RPM uit wil gaan lezen. Ik weet nog niet goed hoe ik dit op kan lossen. Niet dat het echt nodig is, maar aangezien de Arduino nog steeds een paar pootjes vrij heeft... ;) Het lijkt ermee te maken te hebben dat wanneer je het aantal RPM uit wil lezen, de - van de fan eigenlijk op ground level moet zijn.

Ik heb een Panduit tie-wrap tang waarmee ik de kracht waarmee tiewraps worden aangetrokken kan instellen. Dit is zo gedaan dat de tiewrap wel strak zit, maar niet té strak. Heb ik op gelet, die DuPont draadjes zijn inderdaad fragiel.

Poging 2 ;-)

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/8%20(1).jpg

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/8%20(2).jpg

Michael / PA4MW
blackdog

Honourable Member

Hi Koekoeksklok,

Zie je wel dat je het kan ;-)
Een nagelbeschermer en de bedrading netjes gebonden!

Wat je temperatuur regeling betreft, zet direct over de ventilator eens een 220uF condensator.
Of als dit niet direct kan, de bedrading twisten en dan waar het kan de 220uF elco plaatsen.

Verder dan nog dit, hoeveel spanning heeft de basis van de BD 139 nodig om de ventilator aan te sturen.
Dus binnen wel bereik is dit?
(de vraag is dus eigenlijk bij welke spanning gaat de BD139 geleiden en wat is de basis spanning als de transistor net in verzadiging gaat, wat de maximale spanning voor de ventilator is)

Denk na over het PWM bereik van je regeling, komt dit goed overeen met wat nodig is voor het aansturen van de basis van de BD139?

Dat je een 18DS20 gebruikt of een LM35 als temperatuur sensor maakt niet uit.

Gegroet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Hi Bram,

Aldoende leert men ;)!

Zojuist even de proef op de som genomen. Ook met elco direct over de fan treedt nog steeds hetzelfde probleem op; wanneer ik de hall sensor verbind met pen 2 zakt de spanning ietsje in, de Arduino wordt warm en er loopt een stroom.

De eerste stap waarbij de fan aanslaat is ~0.7VDC op de basis. Op het schermpje komt dan 5%. Net iets hieronder sprint de spanning terug naar 0.55VDC. Dit kan kloppen, want in de software geef ik altijd minimaal 32 van de 255 pulsjes (tenzij beneden 30 graden, dan wordt de spanning ook 0). Geen idee of dit lineair gaat, maar 32/255*5 zou ongeveer 0.62VDC moeten zijn. Bij de maximale snelheid is dit ~1.86V. Dit lukt overigens niet door de voeding kort te sluiten, maar met een Föhn kreeg ik het koelblok warm genoeg. Ik had natuurlijk ook de software aan kunnen passen, I know ;)

De PWM regeling lijkt vooralsnog prima te werken en stuurt de boel netjes open. Ik weet niet zo goed hoe het intern in de fan gaat (een type zonder PWM regeling, dus alleen 3 draden +, - en hall sensor). Zou ik de hall sensor niet galvanisch kunnen scheiden waardoor ik deze wel uit kan lezen maar er geen stroom kan lopen?

Michael / PA4MW

Je RPM teruglezing is inderdaad lastig omdat je het ground-niveau van die fan opgetild hebt. Met een extra PNP tor achter je NPN kun je de fan in z'n positieve lijn gaan knijpen, waardoor de ground op 0V kan blijven.

Een andere optie is een optocoupler voor de RPM teruglezing, maar dat is wel wat vergezocht als het met een extra tor in de sturing ook opgelost is.

De laatste optie is om die 100uF te lozen, en je NPN door een N-channel MOSFET te vervangen. Je gaat dan niet meer lineair sturen maar echt PWM tot en met je fan. Je moet dan wel zeker weten dat je fan zich nog gelukkig voelt met die PWM-sturing (even testen). Ondanks de beweringen zijn moderne fans hier meestal prima op voorbereid. Commercieel verkrijgbare fan-control IC's doen ook vaak zat PWM (en niet alleen op 4-draads fans, maar ook op 2- of 3-draads).

De instinker die je nu wel hebt is dat je tacho-uitlezing alleen geldig is op het moment dat je PWM-signaal actief is, dus je zult die uitlezing moeten synchroniseren met de aansturing. Ik meen dat Analog ooit een appnote over dit fenomeen had.

If you want to succeed, double your failure rate.

Jochem, u gaat door voor de magnetron; dat was de oplossing! :D Hartstikke bedankt. Optie 1 was meteen goed; een extra PNP tor bijplaatsen. Ik post vanavond wel even een schemaatje van hoe ik het nu aangesloten heb.

Michael / PA4MW

Op 31 augustus 2016 08:25:09 schreef Jochem:
...

De instinker die je nu wel hebt is dat je tacho-uitlezing alleen geldig is op het moment dat je PWM-signaal actief is, dus je zult die uitlezing moeten synchroniseren met de aansturing. Ik meen dat Analog ooit een appnote over dit fenomeen had.

Deze?
http://www.analog.com/library/analogdialogue/archives/38-02/fan_speed.…

If you want to succeed, double your failure rate.
blackdog

Honourable Member

Hi Koekoeksklok,

Waarom mijn simpel Fet regeling hier niet toegepast?
Dan ben je niet afhankelijk van de processor.
De kans dat deze simpel Fet regeling er me ophoud is erg klein.
Een software gestuurde regeling is wat minder betrouwbaar.
De keuze is natuurlijk aan jouw, maar het is goed om over dit soort zaken na te denken en beslissingen hierover te nemen.

Als je door gaat met de processor regeling, zet in ieder geval je sensor net naast een van de power transitors.
Dan heb je de beste regeling met de minste "lag"

Bij mijn beste regelingen boorde ik een gat net naast of onder de power transitoren in het koelblok.
En of je nu PWM of een lineaire regelaar gebruikt, dat regeld lekker direct en is goed voor de gezondheid van je power sectie :-)

Met PWM kan je heel mooi regelen, maar ik had je ook al aangegeven dat het ook een grote stoorbron kan zijn.
Dus als je ergens PWM wilt gaan toepassen denk dan na over de effecten die dit op de te koelen electronica kan hebben.

Als je een stuk apparatuur hebt met gevoelige schakelingen dan zal je hiermee rekening moeten houden dat de PWM schakel frequentie ook in je andere electronica terrecht komt.
Vooral als de PWM aan de zelfde ground hangt...

Dat is meestal zoiets als dat jij een geluisopname wilt maken van een muis die piept en je hebt een buurjongen die van Gabber House houd en op dat moment uit zijn dak aan het gaan is ;-)

Gegroet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

De fan wordt nu lineair gestuurd, want die PWM wordt al meteen door een filter getrokken voordat hij de basis in gaat. En die Arduino rammelt sowieso op de voedingslijn, dus een hoogohmig belast pinnetje dat PWM doet zal daar het verschil niet meer in maken.

Op 31 augustus 2016 13:45:54 schreef blackdog:
Een software gestuurde regeling is wat minder betrouwbaar.

Nou ben ik dat geheel met je eens als je het bijvoorbeeld over de stroomregeling van een labvoeding hebt. Daar wil je een snelle loop, etc. Maar bij zo'n traag proces als een fan-sturing is dat natuurlijk prima in software te doen. En als je het aantal RPM van je tacho nog als terugkoppeling wilt gebruiken is een stukje software natuurlijk erg comfortabel.

If you want to succeed, double your failure rate.
blackdog

Honourable Member

Hi Jochem,

De tiental mA van de processor is niet direct het probleem,
het kan een probleem worden als de ventilator zelf met PWM wordt aangestuurd.
Dat wordt dan 200 a 500 mA dat geschakeld wordt, dat is andere koek.
B.V. op welk punt wordt de ventilator gekoppeld aan de voedings nul?

Ik heb ik mijn professionele leven heel veel storingswerk gedaan in Audio en Video installaties.
Een klein brommetje kan men meestal nog mee leven een ratel (PWM, Dimmerpack storingen enz.) werd nooit gewardeerd.
Soms had je een beetje Voodoo nodig om het op te lossen, vaak waren er ook meerdere oorzaken een mix van stoorbronnen.

Wat betreft de betrouwbaarheid, ik heb het over het vastslaan van de processor door een of andere rede.
De TS is net als ik een beginner wat programmeren betreft, dus er is ruim kans op bugs in de software.

Ik wil graag duidelijk maken dat als je iets bouwd, dat je met vele eigenschappen rekening zal moeten houden voor een betrouwbare werking.
Bijvoorbeeld mijn dikke Dummy Load, daar zit dan wel geen processor in voor b.v. de ventilator regeling maar een PWM generator met een quad opamp en een temperatuur sensor in het koelblok.
De PWM generator stuurd de PWM ingang aan van de ventilator, dit werkt voorbeeldig.
Dit zou ook met een processor kunnen worden uitgevoerd, dat kan ook zeer goed werken.
De voeding van de ventilator is zwevend, maar de motor van de ventilator heeft een aardig strooiveld,
omdat het een ventilator is van als ik het goed heb 10 a 12-Watt.
Ik kom de PWM dus tegen op mijn meetuitgang ondanks dat ik nu symetrisch meet over mijn stroomshunt.

Toch heb ik een Clickson op de koelplaat zitten die het apparaat uitschakeld bij te hoge koelplaat temperaturen als de regeling op een of andere manier niet goed meer zou werken.

In mijn zakelijke leven kom ik zeer veel bug tegen in software, ik wordt daar af en toe gillend gek van.
Je hoeft helemaal geen professionel coder te zijn om te begrijpen wat er mis gaat.
Het grootste deel bestaat er volgens mij uit, dat het niet goed genoeg getest word!
Neem mijn KeySight 34461A multimeter, de doormeet pieper werkte goed tot er een update kwam.
Die functie was dus na de update gesloopt, hikken en piepen deed hij op een manier waardoor het niet bruikbaar was.
Het heeft een jaar en drie update's gekost om het weer zover te krijgen dat het werkbaar werd, onbegrijpelijk...
Ik kwam wat die pieper betreft daar trouwens pas vrij laat achter, ik gebruik die functie bijna nooit :-)

Terug naar de Arduino,
Een aantal keren met zeer simpele software waarmee is teste,
heb ik al gehad dat het ding vastsloeg of via een reset niet tot werking te brengen was.
Een power cycle was nodig om er dan weer beweging in te krijgen.
De Arduino is niet te vergelijken met mijn multimeter maar beide hebben gammele software ;-)

Dus Jochem, ik denk dat de Arduino prachtig ventilatoren kan regelen, ik zal daar zelf ook eens mee spelen.
Maar ik doelde meer op andere zaken zoals hierboven beschreven.

Gegroet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Wat betreft de betrouwbaarheid, ik heb het over het vastslaan van de processor door een of andere rede.

Watchdog gebruiken: https://bigdanzblog.wordpress.com/2014/10/24/arduino-watchdog-timer-wd…

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Interessant Artikel zerox! Thanks Allen :-)

Zoals beloofd, het schema (let niet op mijn MS paint skils... had ff geen andere software bij de hand ;-))

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/Schema.jpg

Met een föhn en het kortsluiten van de uitgang zit je zo aan de 53 graden hehe:

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/rpm.jpg

En nu twee transistoren! Koelblokjes zijn niet echt nodig, maarja kwaad kan het ook niet:

https://michaelq.home.xs4all.nl/Projects/Lab%20PSU/Inside.jpg

Van de FET-regeling was ik nog niet op de hoogte, dat zou ook een leuke oplossing kunnen zijn. Van de andere kant is mijn belangrijkste doel te leren hoe de Arduino werkt, dus bij voorkeur doe ik in dit project alles software gestuurd. Ik heb trouwens nog twee digitale pinnen over dus misschien kunnen we daar nog iets mee doen ;-) Ik zit te denkem om misschien twee sensors te plaatsen, sensor 1 naast transistor 1, sensor 2 naast transistor 2 en misschien die waarde uitmiddelen voor een meer accurate temperatuurmeting.

Tot dusver werkt het heel leuk, ook nog geen vastlopers of instabiliteit gehad. Zelfs niet nadat de Arduino inmiddels al een paar keer flink op z'n d*nder gehad heeft; zelfs kortsluiting heeft ie overleefd (niet mijn schuld maar een China 18B20 die heel leuk 0 ohm tussen + en - gaf, de weg van de minste weerstand pur sang. Kostte me wel een nieuwe SMD diode, maar dan heb je ook wat.

Michael / PA4MW

@Koekoeksklok: Als je die PWM toch glad wilt strijken, dan zou ik dat aan de basis van de NPN doen zoals je dat eerder met die elco deed. Dan stuur je die transistoren gewoon lineair open.

Op 31 augustus 2016 13:45:54 schreef blackdog:
Een software gestuurde regeling is wat minder betrouwbaar.

Op 31 augustus 2016 17:45:46 schreef blackdog:
De TS is net als ik een beginner wat programmeren betreft, dus er is ruim kans op bugs in de software.

Wat je nu zegt is heel wat anders dan dat je de eerste keer zei.

Maargoed, als ik (als analoge nitwit) een regeling met een opamp maak, dan zou je me dat dus ook af moeten raden, omdat ik daar veel minder goed in ben. Stel dat het gaat staan oscilleren!

Wat jij zegt dat er veel bugs zijn etc. ligt gewoon aan incapabele ontwerpers (of de managers die ze aansturen). Dan maakt het geen zak uit of dat hardware of software is. Jouw eerste stelling was plain dat een softwaregestuurde regeling minder betrouwbaar is, en dat is gewoon onzin. Zoals ik zei leent natuurlijk niet elke regeling zich voor een implementatie in software (snelheid etc), maar die vlieger gaat bij een beetje ventilatiesnelheid aanpassen niet op.

Beginnersfouten (jouw nieuwe argument) zijn natuurlijk een heel ander verhaal, maar daar moet een lerende hobbyist zich m.i. nooit door tegen laten houden.

If you want to succeed, double your failure rate.

Deze weerstand is helemaal geen 1k5 zoals in de tekst staat!

hij is
1) van links naar rechts gelezen: 220 ohm
2) van rechts naar links gelezen: 20 kOhm

En met welke waarde zijn de oscilloscoopplaatjes gemaakt?

Is er trouwens een manier om te zien aan welke kant je moet beginnen te lezen? Ik heb altijd een soort minimale asymmetrie in weerstanden gezien (een kant lijkt iets dikker), maar nooit genoeg om daar een conclusie uit te trekken.

Ja dat heb je goed de tolerantie ring is asymmetrisch in afstand geplaatst.
Nu moet ik wel zeggen dat de weerstanden van Royaal Ohm verkrijgbaar bij de C niet in duidelijk uitblinken.

Groet Henk.

Everything should be as simple as possible, but not simpler.

Hi Jochem, thanks voor je reactie! :) Klopt en heb ik ook geprobeerd. Maar het gekke is dat wanneer ik dat doe de regeling meteen vol aan gaat. Ook worden de transistoren dan een klein beetje warmer omdat ze nu altijd aanstaan, al is dat relatief; meer handwarm naar ietsje warmer. Wat ik nog even wil proberen is de startwaarde in de software iets verder naar beneden brengen (moet iets hoger zijn omdat de fan iets meer prik nodig heeft voor de aanloop) en kijken wat er dan gebeurd met de elco erbij. Loopt de fan ook weer wat rustiger. Ohja, nog vergeten te melden; er zit ook een kleine pull up weerstand over pen 4 (waar de tacho aanzit) en 5v.

Michael / PA4MW

Je zult dan wel de weerstandwaardes goed door moeten rekenen ja, want je hebt een flinke versterking met die twee torren zodat de fan al snel aan blijft staan.

If you want to succeed, double your failure rate.

Dit topic is gesloten