Sådan bygger du en variabel hastighed Fan controller
i denne artikel viser jeg dig, hvordan du bygger en DC fan controller (DC) ved hjælp af et kort C-program og et par dele inklusive Launchpad RM57L microcontroller development kit. Det giver brugerne mulighed for effektivt at variere hastigheden på PM-ventilatorer for at reducere støjniveauer og strømforbrug. Dette projekt overvåger automatisk temperaturen på det objekt, temperatursensoren er fastgjort til (i dette tilfælde en CPU-køleplade, der bruges til at afkøle et lille termoelektrisk modul), og styrer blæserhastigheden i overensstemmelse hermed for at minimere støjudgang samt strømforbrug. Nedenfor er en demo af ventilatorcontrolleren, der er i brug på en desktop CPU-køler.
Video: Kompulsa.
før du lærer at opbygge en blæserhastighedscontroller, hjælper det med at lære, hvordan de forskellige hastighedskontrolmetoder fungerer. Jeg vil forklare to nøgleteknologier: Resistive hastighedskontrollere og ventilatorcontrollere.
Resistive hastighedsregulatorer
Resistive hastighedsregulatorer styrer en given blæsermotors hastighed ved at modstå strømmen fra strømkilden til motoren. Dette kan gøres ved hjælp af en kombination af et potentiometer og transistor eller et andet varistor kredsløb. Den tidligere teknologi er ekstremt let at bygge, men får transistoren til at brænde en hel del af strømmen igennem den. Derfor er det ineffektivt. På den anden side pulserer den fulde strøm til og fra mange gange i sekundet. Transistoren vil stadig spilde noget elektricitet, men ikke så meget.
pulsbreddemodulation
pulsbreddemodulation er en langt mere kompleks, overlegen og en stadig mere almindelig strømstyringsmetode, der letter styringen af motorhastigheder, lampens lysstyrke, blandt andet på en energieffektiv måde. Blandt de vigtigste årsager til motorstyringsenheder er forbedring af apparaternes effektivitet samt reduktion af støjniveauet ved at betjene dem ved lave hastigheder, når det er muligt.
jeg brugte ti Launchpad RM57L MCU development kit til at konstruere denne ventilatorcontroller (takket være TI for at sende den), men denne kode kan let ændres til at køre på den billigere Launchpad TMS57012 eller Launchpad TMS57004 Launchpads også.
når du lærer at konstruere en fan controller, hjælper det med at forstå eller lære at udføre de forskellige teknologier/metoder samt deres fordele og ulemper. På denne måde ved du nøjagtigt, hvad du skal bruge, og hvornår.
denne artikel antager, at du har en vis elektroteknisk erfaring og ved, hvordan du sikkert forbinder transistoren, sensoren og alt det andet nævnte udstyr. Prøv dette projekt på egen risiko.
Indholdsfortegnelse
- Deleliste.
- Forberedelse Af Udviklingsmiljø.
- lad os starte kodning!
dette billede kræver JavaScript.
Reservedelsliste
Alle priser er i USD.
- 2n6284g NPN Darlington BJT Transistor. BJT betyder bipolar junction transistor (praktisk, fordi den har en DC-strømforstærkning på 750).
- tre 12 kOhm 1/2 vand modstande.
- samledåse med skrueterminaler eller bar stik.
- udviklingssæt til instrumenter Launchpad RM57L MCU (RM57L843).
- 10 kOhm NTC termistor med en B-værdi på 3435. ‘NTC’ betyder, at dens modstand falder, når temperaturen stiger.
- 40mm * 40mm (eller større, hvis du ikke kan finde den størrelse) køleplade til transistoren.
- jumperledninger/pin-stik til at forbinde udviklingssættets stifter til transistoren og til at forbinde transistoren til strømkilden (medmindre du bruger et brødbræt). Disse er normalt i $ 3-6 området.
- 12 eller 5 volt strømkilde.
- 12 volt CPU fan, eller en 5 volt laptop fan (dette projekt er beregnet til tre eller fire-leder fans, der understøtter PCM). Disse er typisk i intervallet $10 – $20.
- CPU-køler (med køleskab og ventilator inkluderet) eller enhver anden kombination af en ventilator og en varm genstand, der kan afkøles med den. Dette giver dig mulighed for at se ventilatorcontrolleren automatisk afkøle sig selv og slukke for ventilatoren. Jeg brugte en CPU-køler med en indbygget ventilator. Det er den ultimative test!
jeg vil anbefale at vedhæfte en køleplade til transistoren, hvis du skal drive store fans (større end de små 80mm fans, der typisk bruges til desktop CPU køling). Det vil generere en betydelig mængde varme.
Forbered dit udviklingsmiljø
rm57l843-udviklingssæt er hjertet i denne fan-controller (den måde, disse mikrocontrollere fungerer på, adskiller sig ikke meget fra en Arduino, så lad dig ikke skræmme!). Vores første skridt til at opbygge denne fan controller er at oprette vores udviklingsmiljø, som vi vil bruge til at programmere/blinke MCU.
sæt Udviklingssættet Launchpad RM57L i computerens USB-port ved hjælp af det medfølgende kabel, og opret derefter en konto, så du kan hente CCS IDE. Vi vil også bruge HALCoGen til denne øvelse. HALCoGen er en HAL kode generator, der giver dig mulighed for nemt at konfigurere din MCU ved hjælp af en GUI. I dette tilfælde bruger vi det til at konfigurere analog-til-digital-konverteren (MibADC) og Het timer-modulet.
Hent HALCoGen og CCS (sørg for, at du er logget ind på din TI-konto for CCS), og følg derefter instruktionerne nedenfor for at oprette dit HALCoGen-projekt.
Opret først et nyt projekt i HALCoGen, vælg ‘rm57lks’ udviklingssæt, og så vil du se en liste over dens varianter til højre for skærmen. I dette tilfælde er der kun en variant: RM57L843. Vælg det og navngiv dit projekt som vist nedenfor. Indtast projektets sti i feltet ‘Placering’, noter det, og klik på OK. Vi gemmer vores CCS-projekt i samme mappe. Dit projekt skal placeres i en mappe med navnet PMM under dit arbejdsmappe, som vi vil navngive RM57L.
Opret et nyt projekt kaldet’ PV ‘ i HALCoGen. Det er her, du konfigurerer ADC-og HET-modulerne.
for at opbygge en ventilatorcontroller skal du indstille timere, der vil svinge en lille elektrisk til og fra, og indstille deres frekvens.
aktiver derefter adc1-og HET1-driverne ved at vælge fanen ‘Driver Enable’ og markere afkrydsningsfelterne som vist nedenfor. Analog til digital converter (ADC) vil blive brugt til at konvertere den analoge temperatursensoraflæsning til en digital værdi, vi kan bruge til at bestemme temperaturen, hvilket gør det muligt for ventilatorcontrolleren at justere blæserhastigheden i overensstemmelse hermed. High-end timer (HET) vil blive brugt til at generere vores PV-signal, som vil blive brugt til at styre en simpel BJT-transistor.
jeg anbefaler at fjerne markeringen af resten af driverne for at spare systemressourcer (for eksempel: RAM og flashhukommelse).
aktiver het1-og ADC1-driverne i HALCoGen.
det er nu tid til at konfigurere vores fan controller analog til digital konverter (som er indbygget i Launchpad RM57L MCU). Gå til fanen ADC1, og indstil FiFo-størrelsen til 1, da det er alt, hvad vi har brug for til dette projekt. Vælg også Aktiver Pin 7, da det er det, vi forbinder temperatursensoren til. Pin 7 er markeret ‘AI1_7’ på undersiden af dit Launchpad-udviklingssæt.
Sådan fungerer Analog til Digital konvertering
fortsæt til fanen het1, hvor du konfigurerer vores ventilatorcontrollers FMM-timer (indbygget i rm57l-udviklingssættet), og HET-stiften, der styrer transistoren, der driver ventilatoren, og gør følgende som vist på det næste skærmbillede.
vælg fanen PMM 0-7, Indstil Pligtfeltet for PMM 0 til 0. Det indstiller arbejdscyklussen for PMM-signalet til 0, og dermed indstiller arbejdscyklussen for den ventilator, du styrer, til 0. En arbejdscyklus på 0 betyder simpelthen, at ventilatoren er slukket. En anden måde at sige det på er: procentdelen af den tid, strømmen vil være på, er 0.
vi starter med en arbejdscyklus på 0 i dette projekt, fordi vi programmatisk justerer arbejdscyklussen (og dermed ventilatorens hastighed) på en sådan måde, at den følger temperaturen på kølelegemet, som temperatursensoren er fastgjort til. Når driftscyklussen er indstillet til 0, slukker ventilatorregulatoren blæseren (0 svarer til 0%). Marker derefter afkrydsningsfeltet par ‘aktiver’ lige til venstre for feltet ‘Pin’. Det gør det muligt for PMV-signalet. Indtast 2 i feltet’ Pin’, som er het port 1, Pin 2, markeret ‘HET1_2’ på undersiden af din Launchpad. Endelig: indtast 10.000 (uden komma) i feltet periode.
den enhed, der anvendes i dette felt, er mikrosekund. Et mikrosekund er en milliontedel af et sekund. Indstilling af dette felt til 10.000 vil gøre het timer cyklus strømmen til og fra hver 10.000 mikrosekunder (hver 0.01 sekunder). På grund af denne hurtige skift vil du ikke bemærke, at strømmen tændes og slukkes, hvilket resulterer i jævn, kontinuerlig drift af ventilatoren.
aktiver timeren ‘PMM 0’.
for at afslutte HALCoGen-konfigurationen skal du vælge fanen Pin 0-7. Det er her, du konfigurerer RM57L-stiften, som transistorens base vil blive forbundet til (gennem 12 kOhm-modstanden, selvfølgelig). Marker afkrydsningsfeltet DIR i afsnittet’ Bit 2 ‘ som vist nedenfor for at indstille bit 2 til udgangsretningen. Dette gør det muligt for os at tænde blæseren. En pin kan betegnes som en bit, så’ Bit 2 ‘ betyder i dette tilfælde het Pin 2.
Hvad Er En Modstand?
outputværdien (markeret DOUT i skærmbilledet nedenfor) er pin-tilstanden, som enten kan være tændt (1) eller slukket (0). Sørg for, at den er indstillet til 0, så den er slukket, når MCU oprindeligt starter.
Indstil HET1, Pin 2 til udgangsretningen.
vælg File > Save Project, og derefter File > Generer kode (eller tryk på F5). Se ruden ‘Output’ nederst, indtil der står, at kodegenereringen er afsluttet. Nu kan du gå videre til CCS-konfigurationen, og når du er færdig, kan du endelig samle delene og opbygge ventilatorcontrolleren.
lad os kode!
start CCS, og vælg/Opret en mappe med navnet RM57L som dit arbejdsområde som vist nedenfor. Opret et nyt projekt i Code Composer Studio kaldet PMM, som gemmes i roden af PMM-biblioteket, hvor du vil se PMM.hcg-fil. Hmm.hcg er din HALCoGen projekt fil. Som jeg sagde ovenfor, skal CCS-og HALCoGen-projektfilerne være i samme mappe til denne øvelse.
Tilslut dit Launchpad RM57L-udviklingssæt ved hjælp af det medfølgende USB-kabel.
vælg ‘Rm57l8’ til højre i rullemenuen, da det er det, vi bruger. Vælg derefter USB debug probe fra rullelisten under den. Til sidst skal du vælge ‘Tøm projekt’ og klikke på Udfør.
Højreklik på projektet i ruden Projektudforsker (det er på venstre side af skærmen), og tilføj derefter mappen HALCoGen /inkluderer fra dit projektmappe til dit CCS-projekt ved at klikke på knappen, der er cirklet nedenfor. Disse RM57L omfatter filer består af biblioteker og drivere, som gør det meget nemmere at skrive programmer til MCU.
Naviger til HL_sys_main.C-fil i ruden Projektudforsker til venstre under / kilde/. I den fil skal du indsætte rm57l-kodeeksemplet nedenfor.
kildekoden (Hercules Rm57l Code Sample)
følgende rm57l-prøvekode kan uploades til din Launchpad via USB ved hjælp af Code Composer Studio. Sådan skal din kildefil se ud:
temperaturaflæsninger er i kur C.
hl_sys_main.c
/* USER CODE BEGIN (1) */#include "HL_het.h" //The HET library we'll use for PWM.#include "HL_adc.h" //The ADC library we'll use to read the sensor./* USER CODE END */void main(void){/* USER CODE BEGIN (3) */adcData_t adc_data; //ADC Data Structure.adcData_t *adc_data_ptr = &adc_data; //ADC Data Pointer.unsigned int value; //The ADC value is stored in this variable.float resistance; //The resistance of the thermistor at the current temperature reading;float degperohm = 0.003267974; //Degrees per ohm of resistance.unsigned int temperature; //The temperature in degrees Celsius.hetInit(); //Initialize the HET module.adcInit(); //Initialize the ADC module.while(1) //ADC conversion loop.{ adcStartConversion(adcREG1, 1U); //Start conversion on ADC 1. while(!adcIsConversionComplete(adcREG1, 1U)); //Keep looping until the conversion is complete. adcGetData(adcREG1, 1U, adc_data_ptr); //Store conversion into ADC pointer value = (unsigned int)adc_data_ptr->value; resistance = 1000 * (4096 / value); temperature = degperohm * resistance;//Adjust the fan speed based on the temperature readings obtained above. pwmStart(hetRAM1, pwm0); if (temperature < 40) { pwmSetDuty(hetRAM1, pwm0, 0U); //0% duty cycle. Fan is switched off. } else if (temperature >= 40 && temperature <= 42) { //If the temp is between 40°C and 42°C, set the fan to 20%. pwmSetDuty(hetRAM1, pwm0, 20U); //20% duty cycle. Fan Speed 1. } else if (temperature >= 42 && temperature <= 44) { pwmSetDuty(hetRAM1, pwm0, 30U); //30% duty cycle. Fan Speed 2. } else if (temperature >= 44 && temperature <= 46) { pwmSetDuty(hetRAM1, pwm0, 40U); //40% duty cycle. Fan Speed 3. } else if (temperature >= 46 && temperature <= 48) { pwmSetDuty(hetRAM1, pwm0, 50U); //50% duty cycle. Fan Speed 4. } else if (temperature >= 48 && temperature <= 50) { pwmSetDuty(hetRAM1, pwm0, 60U); //60% duty cycle. Fan Speed 5. } else if (temperature >= 50 && temperature <= 52) { pwmSetDuty(hetRAM1, pwm0, 70U); //70% duty cycle. Fan Speed 6. } else if (temperature >= 52 && temperature <= 54) { pwmSetDuty(hetRAM1, pwm0, 80U); //80% duty cycle. Fan Speed 7. } else if (temperature >= 54 && temperature <= 56) { pwmSetDuty(hetRAM1, pwm0, 90U); //90% duty cycle. Fan Speed 8. } else if (temperature >= 56 && temperature <= 58) { pwmSetDuty(hetRAM1, pwm0, 100U); //100% duty cycle. Fan Speed 9 (full speed). } else if (temperature > 65) { //65 //Code to display a temperature warning. 65 °C is a bit hot, warn the user. } else if (temperature > 70) { //Code to shut the device down (70 °C just won't do, shut it off). }} //End of ADC conversion loop./* USER CODE END */}
du er velkommen til at omfordele denne rm57l-kode, forudsat at du medtager et link tilbage til denne side.
Placer altid din kode mellem /* brugerkoden begynder */ og /* brugerkoden slutter */ kommentarer, så HALCoGen ikke sletter den efter at have foretaget ændringer i dit projekt.
husk altid, at kølelegemet temperaturen vil være lavere end temperaturen af CPU eller hvilken enhed det køling. Dette betyder, at hvis kølelegemet er 70 liter C, så er CPU ‘ en endnu varmere end det. Du kan også designe denne ventilatorcontroller til direkte at måle CPU-temperaturen og placere termistoren på den. Dette er mere præcist, da kølelegemetemperaturen langsomt ligger bag CPU-temperaturen.
hver af ADC-værdierne er digitale repræsentationer af ventilatorregulatorens temperaturaflæsninger, og hvert værdiområde repræsenterer et temperaturområde, der kræver en vis mængde luftstrøm for at afkøle det. I tilfælde af denne termistor svarer en lavere ADC-værdi til en højere temperatur og omvendt. Koden er nu blevet opdateret for at konvertere de analoge til digitale konverterværdier til temperaturaflæsninger i grader Celsius.
eksempel scenario: Et ADC-værdiområde på 310 til 320 kan være højt nok til at berettige at dreje ventilatoren helt op til 80%, da det indikerer, at vores testperson (kølelegemet og dermed CPU) bliver varmt. Men hvis kølelegemet/ventilatoren er stor nok, bør denne hastighed ikke være nødvendig det meste af tiden. Dette er et tilfælde, hvor du måske ønsker at udnytte en større køleplade.
på den anden side kan et ADC-værdiområde på 340 til 350 indikere, at kølelegemet bare er lidt varmt og kun kræver, at ventilatoren fungerer ved en meget lav indstilling (20%), så det vil være meget mere støjsvagt ved denne indstilling. Jeg indstiller arbejdscyklussen baseret på ADC-værdiområderne i stedet for de nøjagtige ADC-værdier for at undgå hyppige hastighedsudsving. Jeg vil meget anbefale at implementere en UART rutine, der overfører analog-til-digital konverter aflæsninger til din computer, så du kan se alt sker i realtid. Det gør debugging lettere, og det er også informativt.
nyttige applikationer til PV inkluderer, men er ikke begrænset til:
- klimaanlæg og køleskab kompressor hastighedskontrol for forbedret effektivitet og reducerede støjniveauer.
- LED lampe dæmpning.
- hev/elektrisk køretøj hastighedskontrol.
- Ventilatorregulatorer.
- Radiator fan controllere, som kan spare elektricitet, gas og reducere støjforurening forårsaget af biler på vejene. Støjreduktionen kan endda hjælpe folk med at sove bedre om natten i nogle tilfælde.
husk, at alle ovennævnte applikationer kræver en ventilator, der understøtter PV. Desværre er ikke alle fans bygget til dette.
opsætning af udstyr
som jeg sagde i begyndelsen, blev denne artikel skrevet med den antagelse, at du ved, hvordan du bruger en transistor, og hvordan du tilslutter sensoren til Launchpad sikkert.
Tilslut termistoren til ADC-porten 1 pin 7, og transistoren til het-porten 1 pin 2 på dit rm57l-udviklingssæt ved hjælp af de tre modstande i delelisten i overensstemmelse hermed. Hvis du bruger en CPU-køler (kølelegeme + indbygget ventilatorkombination), skal du indsætte temperatursensoren i kølelegemet (sørg for ikke at lade nogen af sensorterminalerne komme i kontakt med kølelegemet, som kan være elektrisk ledende). Tilslut køleventilatoren til controlleren. Vejledningerne, der er linket nedenfor, hjælper dig med at lære, hvordan du konfigurerer ventilatoren, ADC-pin, og transistor.
Sparkfun forklarer analog til digital konvertering og et grundlæggende eksempel på en ADC-sensorforbindelse her (hvilket er det, jeg brugte til dette projekt, bortset fra at min sensor har to ledninger, snarere end de tre, som deres potentiometer gør). De forklarer også transistorer her.
når du har mestret det, kan du få din fan controller i gang på ingen tid!
Sensor
ADC i rm57l MCU-udviklingssættet konverterer de analoge spændingsudsving forårsaget af termistoren (eller hvilken temperatursensor du bruger) til digitale værdier, der er gemt i værdivariablen ovenfor. På grund af det faktum, at ADC-værdier er afhængige af den sensor, du bruger, skal du bruge specifikationerne i din sensors dokumentation til at konvertere temperaturaflæsningerne til grader.
sensoren, der blev brugt til dette projekt, var en termistor 3435b 10 kOhm. En termistor er en modstand designet til at variere dens modstand med temperatur (meget mere end en almindelig modstand). Hvis en termistor er bedømt til 10 kOhm, betyder det, at modstanden er 10 kOhm ved 25 liter C.
NB: modstanden af en given termistor vil ikke lineært variere med temperaturen, hvorfor termistorproducenter vil levere et Temperatur vs modstandsdiagram og (nogle gange) A -, B-og C-værdierne til brug i Steinhart-Hart-ligningen, som løser dette problem.
kode testet med succes med CCS versioner: