Gå til innhold

Viftekontroll for 8 vifter med temperatur styring


Anbefalte innlegg

holder på å designe en viftekontroll jeg skal bygge til PCen min, den skal kunne styre 8 vifter og kunne kobles til 8 NTC-motstander for å måle temperatur.

 

den blir vell ikke akkurat billig da, men moro å ha laget den selv.

 

Siden dette er mit første elektronikk-prosjekt jeg lager selv helt fra bunnen av, så synes jeg det er lurt å spørre andre som har litt mer erfaring om det er noe jeg har glemt å tenke på... så her er det foreløpige kretsskjemaet

 

har ikke satt på verdier på alle komponentene enda da, men det skal jeg fiks på snart... (bruker stort sett verdier som er oppgitt i datablader der det er mulig, og verdier jeg har sett i andre design)

 

skal lage det på et tosidig kretskort, bruker SMD komponenter på det meste, og den skal lages slik at den passer inn i en 3,5" brønn.

 

noen kontakter er ikke koblet til noe spesielt akkurat nå, men tenker på å utvide den med en skjerm senere som skal monteres i fronten i en 5 1/4" brønn, da skal disse kontaktene brukes til å koble sammen de to delene. Har en intern com-port i Pcen som skal kobles til slik at en kan sende data mellom kontrolleren (med skjerm senere kanskje) og Pcen.

 

(og jeg vet at det bare er 4 kanalers PWM på AVRen, men skal ikke bruke de, lager PWM i firmware i stede, har testet det, og det så ut til å funke bra… men hvor stor frekvens bør PWM en ha?)

Lenke til kommentar
Videoannonse
Annonse

Jeg er for tiden arbeidsledig, så jeg har også tenkt på et lignende prosjekt for å få mer erfaring med elektronikk, mikrokontrollere, kontroll systemer o.l. Jeg har også tenkt å lage en viftekontroll/monitor. Jeg har tenkt meg noe slikt:

- ATMega128 eller 64 (sannsynligvis C++ implementasjon)

- RS232 og/eller USB virtual com port (FTDI chip e.l.)

- mulighet for å drive 6 vifter (hardware PWM)

- avlesning av spenning: +5V, +12V, og alle viftespenninger

- avlesning av viftehastighet

- oppdatering av AVR program over serieport

- monitor/kontroll program på PC (i C# eller Java)

- En eller flere temp. sensorer eller NTCer

 

Utsignalet fra viften kalles tach pulse. For å få generert denne pulsen må du koble spenning på tach utgangen. Jeg testet med 3,3VDC gjennom 10K motstand. (Tatt fra eksempel.) Dette gav pene firkantpulser på de to viftene jeg testet. Jeg regnet meg frem til to perioder pr. omdreining, men det virket litt rart.

 

Jeg vet ikke om det er noe fasitsvar på PWM frekvens, så her er det kanskje best å prøve seg frem. Hvilken frekvens har du nå?

Lenke til kommentar

har testet litt på en krets jeg bygde i høst for å lære meg å programmere AVR-kretser (AT90S2313), og hvis jeg har regnet rett (har ikke noe oscilloskop eller noe slik, så jeg får ikke målt på kretsen selv) så klarer den å drive en vifte med PWM frekvens på alt fra 15 Hz og opp til 1 MHz (sikkert høyere også, men det er jo ikke interessant a like vell), så en kan vell ta det som passer best. trur jeg vil ligge noe over 100 Hz i alle fall...

 

kunne jo brukt ATMega128 jeg også når jeg tenker meg om, den har jo 8 PWM kanaler så jeg nå, og 8 interrupt pinner, men er noen av de pinnene felles?

hvis de ikke er det hadde jo det vært genialt...

 

og med 128KB Flash så trenger en ikke akkurat bekymre seg for at programmet blir for stort... (største programmet mitt til nå er rundt 1 KB kompilert...)

Endret av Dr_VingTor
Lenke til kommentar

Jo, på ATmega128 er noen av PWM og interrupt pinnene felles. To av PWM pinnene er også felles, så maks. 7 forskjellige PWM signaler. For å måle hastigheten på 8 vifter kan du jo bruke en multiplexer og bytte mellom tach pulsen til de forskjellige viftene. Er 8 PWM utganger et krav eller klarer du deg med mindre?

 

Jeg valgte ATmega128 siden jeg har brukt den før og det er ikke så mye å spare på å bruke en billigere AVR.

Lenke til kommentar

er ikke noe krav med 8 PWM kanaler, kan jo alltids programmere den til å lage PWM i firmware. Har testet ut kode som gjør det, riktig nok bare for 1 vifte enda, men å utvide koden til 8 vifter gir ikke mye mer kode (vil jeg tru). Men jeg vil ha 8 vifter...

 

multiplexer var ikke noe dum ide da... kunne jeg jo lagt inn i designet jeg alt har... men da har jeg ikke nok kontakter til displayet igjen... spørs om jeg får gå for en ATmega128 da...

 

kobla signalpinnen fra vifta til INT0 på kretsen min i går, fikk noe signal ut fra den i alle fall, men ble ikke helt klok på den... sikkert en del rart i koden min som knoter til, har ikke brukt eksterne interrupt før... får lese litt mer på hvordan dette signalet er, kan vell hende jeg trenger noe mer for å koble den til rett?

 

får se litt mer på det i kveld...

Lenke til kommentar
dere går tydeligvis ikke GK elektro...

når dere blir enige, kan dere lage worklog og forklare litt underveis?

Jo, det er ikke umulig at jeg kan skrive en worklog. Kommer litt ann på interesse og slikt.

Det er intresse ;)

 

går selv GK elektro med svært lavt snitt er jeg redd for så jeg skjønner ikke mer en det jeg trenger :p

Lenke til kommentar
er ikke noe krav med 8 PWM kanaler, kan jo alltids programmere den til å lage PWM i firmware. Har testet ut kode som gjør det, riktig nok bare for 1 vifte enda, men å utvide koden til 8 vifter gir ikke mye mer kode (vil jeg tru). Men jeg vil ha 8 vifter...

 

multiplexer var ikke noe dum ide da... kunne jeg jo lagt inn i designet jeg alt har... men da har jeg ikke nok kontakter til displayet igjen... spørs om jeg får gå for en ATmega128 da...

 

kobla signalpinnen fra vifta til INT0 på kretsen min i går, fikk noe signal ut fra den i alle fall, men ble ikke helt klok på den... sikkert en del rart i koden min som knoter til, har ikke brukt eksterne interrupt før... får lese litt mer på hvordan dette signalet er, kan vell hende jeg trenger noe mer for å koble den til rett?

 

får se litt mer på det i kveld...

En liten ting, ATMega128 er veldig dyr på elfa. Du kan prøve Acte, men de selger muligens bare til bedrifter, skoler osv. Digi-Key (www.digikey.com) i USA selger den til litt under 100 NOK og de har meget bra service. De har også mye annet.

 

Hvilken kompilator bruker du? Eller skriver du assembler?

 

Jeg kan prøve å skrive kode for vifteavlesning de nærmeste dagene, men jeg kan ikke love noe.

 

Husket du å koble pinnen med tach pulsen til DC spenning? Dersom du ikke gjør det, så får du rare pulser.

Lenke til kommentar
dere går tydeligvis ikke GK elektro...

når dere blir enige, kan dere lage worklog og forklare litt underveis?

Jo, det er ikke umulig at jeg kan skrive en worklog. Kommer litt ann på interesse og slikt.

Det er intresse ;)

 

går selv GK elektro med svært lavt snitt er jeg redd for så jeg skjønner ikke mer en det jeg trenger :p

OK, men jeg tror jeg vil ha en hardware prototyp klar først.

Lenke til kommentar
kobla signalpinnen fra vifta til INT0 på kretsen min i går, fikk noe signal ut fra den i alle fall, men ble ikke helt klok på den... sikkert en del rart i koden min som knoter til, har ikke brukt eksterne interrupt før... får lese litt mer på hvordan dette signalet er, kan vell hende jeg trenger noe mer for å koble den til rett?

Her er et eksempel. Se nederst på side 1. http://rocky.digikey.com/WebLib/Linear%20T...202/LTC1840.pdf

Lenke til kommentar

regner med jeg skal få tak en del deler på skolen (NTNU) gjennom omegav..

 

akkurat nå skriver jeg i C, bruker avr-gcc (WinAVR), men har også skrevet litt i assembler, men C er jo litt lettere når en har lært det da (jeg kan ikke så alt for mye enda da, mer som det grunnleggende)

 

hehe, glemte å koble til spenning på tach pulsen, men fant noe som en også må ta hensyn til når en bruker tach med PWM

http://www.analog.com/library/analogDialog...2/fan_speed.pdf

Lenke til kommentar

funker vell det også...

 

hvis du gjør det som i det eksempelet du linka til så vil jo også spolen hjelpe til med å glatte spenningen/strømmen over vifta... slipper jo problemet med signalstøy ved jevn DC spenning også. Det kan jo være et problem. Skal måle litt på kretsen når jeg får anledning for å se om PWMen genererer mye støy.

 

Jeg vil helst ikke glatte PWMen, mener å ha lest at en vil kunne kjøre viftene på mye lavere hastighet på PWM enn på DC. (kondensatoren i mitt design er ikke for glatting, men for fjerning av noe støy, og pipelyd fra vifta, som jeg har lest og hørt kan oppstå ved PWM)

 

skal se om jeg får tatt noen bilder av prototypen min snart...

 

har lagt ut koden jeg jobber på og bruker her: http://vingtor.kicks-ass.org/filer/vifte.c

 

vifta kjører faktisk på 10% spenning (1,2 Volt), men alt under 30% er meningsløst egentlig... ikke noe luftstrøm å skryte av akkurat...

 

bruker bare en seriell terminal for å kommunisere med kretsen nå...

 

skal se om jeg får laga en liten side med bilder o.l. etter hvert... trur nok det blir laga en worklog etter hvert også... gidder ikke begynne på den før jeg har fått ferdig designet...

Lenke til kommentar

Off topic:

Ser at du har brukernavn: toreril.

Hvis jeg ikke husker helt feil; hadde du it-intro (med Matlab) høsten 2003?

 

mener å huske et av studass.barna hadde dette brukenavnet.

 

dangdung her :)

 

 

On topic:

Hvorfor vil du ikke ha kondensatoren med i designet? Jeg vil nok tro at den vil gi en mer stabil spenning til viften. Noe som nok fører til bedre resultat.

Lenke til kommentar

du husker rett ja, hadde deg som studass (jeg fikk A :D )..

 

vell, kan hende det er lurt å sette på noen kondensatorer på 12 Volten, (altså mellom GND og +12V) for å kunne gi nok strøm og spenning til viftene, men det er ikke nødvendig å ha kondensatorer over selve viftene, men det kan jo hende at det er lurt av andre grunner... har jo tegnet inn kondensatorer der, men de er ment at skal være små da... (trur jeg skal bytte ut den komponenten jeg har i designet nå, slik at det blir mulig å sette inn større kondensatorer også, om det skulle vise seg å være bedre).

Lenke til kommentar

har nå mekka litt mer på koden (ligger på samme linken som lengre oppe)

 

trur den nå kan lese hastigheten, eller noe i alle fall... litt vanskelig å tyde data over terminalklient, så jeg får vell begynne på et lite program for å kommunisere med kretsen...

 

har også laga en liten video (5,7 MB), lyd ble det ikke mye av... men en kan nå se at vifta går rundt, og som en kanskje ser så angir jeg hastigheten på tastaturet med tallene 0-9... filmet kretskortet også, men det er ikke akkurat bra bilde heller da... skulle hatt digitalkamera...

 

http://vingtor.kicks-ass.org/filer/vifte.avi

 

trur også at jeg skal klare meg med ATMega16, bruker en 8 til 1 multiplexer for å lese hastigheten på viftene, og ved å bruke enable-pinne på muxen så kan jeg fremdeles få til å bruke skjerm også..., virker som om 16 KB med flash blir mer enn nok også, koden nå er ikke mer enn 1,66 KB kompilert.

Lenke til kommentar

Jeg har skrevet ferdig koden for å lese viftehastighet. Testet programmet på en vifte som var oppgitt til 1200 rpm og får 1220-1235 rpm som resultat. (Avlest vha. JTAG ICE.) På skop er en periode 24,3 ms. Koden er beregnet brukt med pulse stretching, men jeg har bare testet med DC spenning til viften.

 

// Funksjon: Avlesning av viftehastighet vha. tach puls
// MCU: ATMega128
// Skrevet av: Brannigan

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <limits.h>

#define SCALE_TACH_PULSE 300000.0

volatile unsigned int clock;
volatile unsigned char clock_state;
volatile float rpm;
enum clock_states {IDLE, INIT, CLOCK_RUNNING};

void init(void);

INTERRUPT(SIG_OUTPUT_COMPARE2)
{
if (clock != UINT_MAX)	// sjekk for overflow
{
 clock++;
}
}

INTERRUPT(SIG_INTERRUPT0)
{
switch (clock_state)
{
case IDLE:
 break;
case INIT:
 clock = 0;      // nullstill klokke
 clock_state = CLOCK_RUNNING;	// sett ny tilstand
 break;
case CLOCK_RUNNING:
 // En periode passert
 if (clock != UINT_MAX)
 {
 	rpm = SCALE_TACH_PULSE / clock;
 }
 else
 {
 	rpm = 0;  	// klokke "overflow"
 }
 clock_state = IDLE;  // stopp måling av tach puls
 break;
}
}


int main (void)
{
init();    	// init timer og ext. interrupt
clock_state = INIT;  // start måling av tach puls
sei();    	// enable global interrupt

while (1)
{	
}

return 1;	// unngå kompilator advarsel
}

// Init timer 2 og eksternt interrupt på INT0
void init(void)
{
// Timer 2 settes opp til å generere output compare interrupt hvert 100 mikrosekund
TCCR2 = (1<<WGM21)|(1<<CS21);	// FOC: disabled
       	// Waveform generation mode: CTC
       	// Compare match output mode: Normal
       	// Clock select: /8
TCNT2 = 0;
OCR2 = 91;    	// Funnet vha. skop	
TIMSK = (1<<OCF2);  // Timer 2 utput compare interrupt enable
 
// Setter opp eksternt interrupt, INT0
EICRA = (1<<ISC01);	// INT0, falling edge
EIMSK = (1<<INT0);  // INT0 interrupt enable
EIFR = (1<<INTF0);  // Clear INT0 interrupt flag
}




Lenke til kommentar

For oss dødelige er det meste dere snakker om gresk, men logisk...

Det hadde vel ikke vert mulig at en av dere kunne tegnet opp kretsen i multim slik den blir, samt printkortskjema? Bruker det tillegsprogrammet som multisim har?

Den kretsen dere holder på med, er det med LCD for avlesning av hastighet eller? Hvordan blir det når dere stiller på viftehastigheten? Må du bruke PC'en til å stille eller? Hva blir prisen for en sånn sak? Hvor mange vifter kan du koble på?

Endret av icer
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...