hur man bygger en variabel hastighet PWM Fan Controller
i den här artikeln, Jag ska visa dig hur man bygger en PWM fan controller (DC) med hjälp av en kort C-program, och några delar inklusive Launchpad RM57L microcontroller development kit. Det gör det möjligt för användare att effektivt variera hastigheten på PWM-fläktar för att minska ljudnivåer och strömförbrukning. Detta projekt övervakar automatiskt temperaturen på objektet som temperatursensorn är ansluten till (i detta fall en CPU-kylfläns som används för att kyla en liten termoelektrisk modul) och styr fläkthastigheten i enlighet därmed för att minimera brusutgången samt strömförbrukningen. Nedan följer en demo av fläktkontrollen som används på en stationär CPU-kylare.
Video: Kompulsa.
innan du lär dig hur man bygger en fläkthastighetsregulator hjälper det att lära sig hur de olika hastighetskontrollmetoderna fungerar. Jag kommer att förklara två viktiga tekniker: resistiva hastighetsregulatorer och PWM-fläktregulatorer.
resistiva hastighetsregulatorer
resistiva hastighetsregulatorer styr en given fläktmotors hastighet genom att motstå strömflödet från strömkällan till motorn. Detta kan göras med en kombination av en potentiometer och transistor eller en annan varistorkrets. Den tidigare tekniken är extremt lätt att bygga, men gör att transistorn brinner av en hel del av strömmen som passerar genom den. Därför är det ineffektivt. PWM å andra sidan pulserar hela strömmen på och av många gånger per sekund. Transistorn kommer fortfarande att slösa lite el, men inte lika mycket.
PWM hastighetsregulatorer
pulsbreddsmodulering är en mycket mer komplex, överlägsen och en allt vanligare strömstyrningsmetod som underlättar kontrollen av motorvarvtal, lampans ljusstyrka, bland annat på ett energieffektivt sätt. Viktiga orsaker till PWM-motorstyrenheter är att förbättra effektiviteten hos apparater, samt minska ljudnivåerna genom att använda dem vid låga hastigheter när det är möjligt.
jag använde ti Launchpad RM57L MCU development kit för att konstruera denna fläktkontroll (tack vare TI för att skicka den), men den här koden kan enkelt modifieras för att köras på den billigare Launchpad TMS57012 eller Launchpad Tms57004 Launchpads också.
när man lär sig att konstruera en PWM-fläktstyrenhet hjälper det att förstå eller lära sig att utföra olika tekniker/metoder samt deras fördelar och nackdelar. På så sätt vet du exakt vilken du ska använda och när.
den här artikeln förutsätter att du har viss erfarenhet av elektroteknik och vet hur du säkert ansluter transistorn, sensorn och all annan utrustning som nämns. Prova detta projekt på egen risk.
Innehållsförteckning
- Delar Lista.
- Utvecklingsmiljö Förberedelse.
- Låt oss börja koda!
detta bildspel kräver JavaScript.
reservdelslista
Alla priser är i USD.
- 2n6284g NPN Darlington BJT Transistor. BJT betyder bipolär junction transistor (bekväm eftersom den har en LIKSTRÖMFÖRSTÄRKNING på 750).
- tre 12 kOhm 1/2 watt motstånd.
- kopplingsdosa med skruvplintar eller barkontakt.
- Texas Instrument Launchpad RM57L MCU (RM57L843) utveckling kit.
- 10 kOhm NTC-termistor med ett B-värde på 3435. ’NTC’ betyder att motståndet minskar när temperaturen ökar.
- 40mm x 40mm (eller större, om du inte hittar den storleken) kylfläns för transistorn.
- jumperkablar / stiftkontakter för att ansluta utvecklingssatsens stift till transistorn och för att ansluta transistorn till strömkällan (om du inte använder en brödbräda). Dessa är vanligtvis i intervallet $3-6.
- 12 eller 5 volt strömkälla.
- 12 volts CPU-fläkt, eller en 5 volts bärbar datorfläkt (detta projekt är avsett för tre eller fyrtrådsfläktar som stöder PWM). Dessa är vanligtvis i intervallet $10-$20.
- CPU-kylare (med kylfläns och fläkt ingår) eller någon annan kombination av en fläkt och ett hett föremål som kan kylas med det. Detta gör att du kan titta på fläktstyrenheten automatiskt kyla av sig själv och stänga av fläkten. Jag använde en CPU-kylare med en inbyggd fläkt. Det är det ultimata testet!
jag skulle rekommendera att fästa en kylfläns till transistorn om du ska driva stora fläktar (större än de små 80mm fläktarna som vanligtvis används för stationär CPU-kylning). Det kommer att generera en betydande mängd värme.
Förbered din utvecklingsmiljö
rm57l843 development kit är hjärtat i denna PWM fan controller (hur dessa mikrokontroller fungerar är inte mycket annorlunda än en Arduino, så bli inte skrämd!). Vårt första steg för att bygga denna PWM fan controller är att ställa in vår utvecklingsmiljö som vi kommer att använda för att programmera/blinka MCU.
Anslut Launchpad rm57l development kit till datorns USB-port med den medföljande kabeln och skapa sedan ett Texas Instruments-konto så att du kan ladda ner CCS IDE. Vi kommer också att använda HALCoGen för denna övning. HALCoGen är en hal-kodgenerator som gör att du enkelt kan konfigurera din MCU med hjälp av ett GUI. I det här fallet kommer vi att använda den för att konfigurera analog-till-digital-omvandlaren (MibADC) och HET-timermodulen.
ladda ner HALCoGen och CCS (se till att du är inloggad på ditt TI-konto för CCS) och följ sedan instruktionerna nedan för att skapa ditt HALCoGen-projekt.
skapa först ett nytt projekt i HALCoGen, välj utvecklingspaketet’ RM57Lx ’ och sedan ser du en lista över dess varianter till höger om skärmen. I det här fallet finns det bara en variant: RM57L843ZWT. Välj det och namnge ditt projekt ’PWM’ som visas nedan. Ange projektets sökväg i fältet Plats, anteckna det och klicka på OK. Vi lagrar vårt CCS-projekt i samma katalog. Ditt PWM-projekt ska placeras i en mapp med namnet PWM, under din arbetskatalog, som vi kommer att namnge RM57L.
skapa ett nytt projekt som heter’ PWM ’ i HALCoGen. Det är här du konfigurerar ADC-och HET-modulerna.
för att bygga en PWM-fläktkontroll måste du ställa in timers som kommer att svänga en liten elektrisk på och av och ställa in frekvensen.
aktivera sedan adc1-och HET1-drivrutinerna genom att välja fliken ’Driver Enable’ och markera rutorna som visas nedan. Analog till digital omvandlare (ADC) kommer att användas för att konvertera den analoga temperatursensoravläsningen till ett digitalt värde som vi kan använda för att bestämma temperaturen, vilket gör det möjligt för fläktregulatorn att justera fläkthastigheten i enlighet därmed. High-end timer (HET) kommer att användas för att generera vår PWM-signal, som kommer att användas för att styra en enkel BJT-transistor.
jag rekommenderar att du avmarkerar resten av drivrutinerna för att spara systemresurser (till exempel: RAM och flashminne).
aktivera HET1-och ADC1-drivrutinerna i HALCoGen.
det är nu dags att konfigurera vår PWM fan controller analog till digital omvandlare (som är inbyggd i Launchpad RM57L MCU). Gå till fliken ADC1 och ställ in FiFo-storleken på 1, eftersom det är allt vi behöver för det här projektet. Välj också aktivera stift 7, eftersom det är vad vi kommer att ansluta temperatursensorn till. Pin 7 är märkt ’AI1_7’ på undersidan av din Launchpad development kit.
hur Analog till Digital konvertering fungerar
fortsätt till fliken HET1 där du konfigurerar vår fläktkontrollers PWM-timer (inbyggd i rm57l-utvecklingssatsen) och HET-stiftet som styr transistorn som driver fläkten och gör följande som visas i nästa skärmdump.
välj fliken Pwm 0-7, Ställ in Tullfältet för PWM 0 till 0. Det ställer in PWM-signalens arbetscykel till 0, vilket ställer in arbetscykeln för fläkten du kontrollerar till 0. En arbetscykel på 0 betyder helt enkelt att fläkten kommer att vara avstängd. Ett annat sätt att uttrycka det är: procentandelen av tiden som strömmen kommer att vara på är 0.
vi kommer att börja med en arbetscykel på 0 i detta projekt eftersom vi kommer att programmatiskt justera arbetscykeln (och därmed fläktens hastighet) på ett sådant sätt att det följer temperaturen på kylflänsen som temperaturgivaren är ansluten till. När arbetscykeln är inställd på 0 stänger fläktregulatorn av fläkten (0 motsvarar 0%). Markera sedan kryssrutorna ’aktivera’ precis till vänster om fältet’ Pin’. Det möjliggör PWM-signalen. Ange 2 i fältet ’Pin’, vilket är HET port 1, stift 2, märkt ’HET1_2’ på undersidan av din startplatta. Slutligen: ange 10 000 (utan kommatecken) i fältet Period.
enheten som används i detta fält är mikrosekund. En mikrosekund är en miljonedel av en sekund. Om du ställer in detta fält till 10 000 kommer HET-timern att slå på och stänga av strömmen var 10 000 mikrosekunder (var 0: e.01 sekunder). På grund av denna snabba växling kommer du inte att märka att strömmen slås på och av, vilket resulterar i en jämn, kontinuerlig drift av fläkten.
aktivera timern ’PWM 0’.
för att avsluta HALCoGen-konfigurationen, välj fliken Pin 0-7. Det är här du konfigurerar rm57l-stiftet som transistorns bas kommer att anslutas till (Via 12 kOhm-motståndet, förstås). Markera kryssrutan DIR i avsnittet ’Bit 2′ som visas nedan för att ställa in bit 2 till utgångsriktningen. Detta gör att vi kan slå på fläkten. En stift kan kallas en bit, så’ Bit 2 ’ i detta fall innebär HET Stift 2.
Vad Är Ett Motstånd?
utgångsvärdet (märkt DOUT i skärmdumpen nedan) är stiftets tillstånd, som kan vara antingen på (1) eller av (0). Se till att den är inställd på 0, så att den är avstängd när MCU startar initialt.
Ställ in HET1, Stift 2 i utgångsriktningen.
välj Arkiv > Spara projekt och sedan Arkiv > generera kod (eller tryck på F5). Titta på’ Output ’ rutan längst ner tills det står att kodgenerering är klar. Nu kan du gå vidare till CCS-konfigurationen, och när du är klar kan du äntligen samla delarna och bygga fläktkontrollen.
Låt oss koda!
starta CCS och välj / Skapa en katalog med namnet RM57L som din arbetsyta som visas nedan. Skapa ett nytt projekt i Code Composer Studio som heter PWM, som sparas i roten till PWM-katalogen där du kommer att se PWM.hcg-fil. PWM.hcg är din HALCoGen project-fil. Som jag sa ovan ska CCS-och HALCoGen-projektfilerna vara i samma katalog för denna övning.
Anslut din Launchpad rm57l development kit med den medföljande USB-kabeln.
till höger väljer du ’RM57L8x’ i rullgardinsmenyn, eftersom det är vad vi ska använda. Välj sedan XDS110 USB debug-sonden från rullgardinsmenyn under den. Slutligen väljer du ’tomt projekt’ och klickar på Slutför.
högerklicka på PWM-projektet i Project Explorer-fönstret (det är till vänster på skärmen) och lägg sedan till mappen HALCoGen /includes från din PWM-projektkatalog till ditt CCS-projekt genom att klicka på knappen inringad nedan. Dessa RM57L inkluderar filer består av bibliotek och drivrutiner som gör det mycket lättare att skriva program för MCU.
navigera till HL_sys_main.C-fil i fönstret Project Explorer till vänster under/PWM/source/. Klistra in RM57L – kodexemplet nedan i den filen.
källkoden (Hercules Rm57l kodexempel)
följande rm57l exempelkod kan laddas upp till din Launchpad via USB med Code Composer Studio. Så här ska din källfil se ut:
temperaturavläsningar är i kub 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 är välkommen att distribuera denna rm57l kod, förutsatt att du inkluderar en länk tillbaka till denna sida.
placera alltid din kod mellan /* USER CODE BEGIN */ och /* USER CODE END */ kommentarer, så att HALCoGen inte tar bort den efter att ha gjort ändringar i ditt projekt.
kom alltid ihåg att kylflänsens temperatur kommer att vara lägre än CPU-temperaturen eller vilken enhet den kyler. Detta innebär att om kylflänsen är 70 2CG C, är CPU-enheten ännu varmare än så. Du kan också designa denna PWM-fläktregulator för att direkt mäta CPU-temperaturen och placera termistorn på den. Detta är mer exakt, eftersom kylflänsens temperatur långsamt ligger bakom CPU-temperaturen.
var och en av ADC-värdena är digitala representationer av fläktregulatorns temperaturavläsningar, och varje värdeområde representerar ett temperaturområde som kräver en viss mängd luftflöde för att kyla det. I fallet med denna termistor motsvarar ett lägre ADC-värde en högre temperatur och vice versa. Koden har nu uppdaterats för att konvertera de analoga till digitala omvandlarvärdena till temperaturavläsningar i grader Celsius.
exempel scenario: Ett ADC-värdeintervall på 310 till 320 kan vara tillräckligt högt för att motivera att fläkten vrids hela vägen upp till 80%, eftersom det indikerar att vårt testämne (kylflänsen och därmed CPU) blir varm. Men om kylflänsen/fläkten är tillräckligt stor bör denna hastighet inte vara nödvändig för det mesta. Detta är ett fall där du kanske vill kapitalisera på en större kylfläns.
å andra sidan kan ett ADC-värdeintervall på 340 till 350 indikera att kylflänsen bara är lite varm och endast kräver att fläkten arbetar med en mycket låg inställning (20%), så det blir mycket tystare vid denna inställning. Jag ställer in arbetscykeln baserat på ADC-värdeområdena, istället för de exakta ADC-värdena för att undvika frekventa hastighetsvariationer. Jag rekommenderar starkt att du implementerar en UART-rutin som överför analog-till-digital-omvandlaravläsningarna till din dator så att du kan se allt som händer i realtid. Det gör felsökning lättare, och det är också informativt.
användbara applikationer för PWM inkluderar, men är inte begränsade till:
- luftkonditionering och kylskåp kompressor varvtalsreglering för förbättrad effektivitet och minskade ljudnivåer.
- LED-lampa dimning.
- hev/elektriska fordon hastighetsreglering.
- Ventilationsfläktsregulatorer.
- Radiatorfläktregulatorer, som kan spara el, gas och minska bullerföroreningar orsakade av bilar på vägarna. Brusreduceringen kan till och med hjälpa människor att sova bättre på natten i vissa fall.
tänk på att alla applikationer ovan kräver en fläkt som stöder PWM. Tyvärr är inte alla fans byggda för detta.
Maskinvaruinställning
som jag sa i början var den här artikeln skriven med antagandet att du vet hur man använder en transistor och hur man ansluter sensorn till startplattan på ett säkert sätt.
Anslut termistorn till ADC port 1 stift 7, och transistorn till HET port 1 stift 2 på rm57l utvecklingssats, med användning av de tre motstånden i dellistan enlighet. Om du använder en CPU-kylare (kylfläns + inbyggd fläktkombination), sätt sedan in temperatursensorn i kylflänsen (se till att ingen av sensorterminalerna kommer i kontakt med kylflänsen, som kan vara elektriskt ledande). Anslut kylflänsen till regulatorn. Handledningarna som länkas nedan hjälper dig att lära dig hur du ställer in fläkten, ADC-stiftet och transistorn.
Sparkfun förklarar analog till digital konvertering och ett grundläggande exempel på en ADC-sensoranslutning här (vilket är vad jag använde för detta projekt, förutom att min sensor har två ledningar, snarare än de tre som deras potentiometer gör). De förklarar också transistorer här.
när du har behärskat det kan du få din fläktkontroll igång på nolltid!
Sensor
ADC i rm57l MCU development kit omvandlar de analoga spänningsfluktuationer som orsakas av termistorn (eller vilken temperaturgivare du använder) till digitala värden lagrade i värdevariabeln ovan. På grund av att ADC-värden är beroende av sensorn du använder måste du använda specifikationerna i sensorns dokumentation för att konvertera temperaturavläsningarna till grader.
sensorn som användes för detta projekt var en uxcell 3435b 10 kOhm termistor. En termistor är ett motstånd som är utformat för att variera sitt motstånd med temperatur (mycket mer än ett vanligt motstånd). Om en termistor är klassad till 10 kOhm betyder det att det är motstånd är 10 kOhm vid 25 kcal C.
OBS: motståndet hos en given termistor varierar inte linjärt med temperaturen, varför termistortillverkare kommer att tillhandahålla ett temperatur vs-motståndsschema och (ibland) A -, B-och C-värdena för användning i Steinhart-Hart-ekvationen, som tar upp detta problem.
kod testad framgångsrikt med CCS-versioner: