januari 27, 2022

Hoe maak je een PWM Fan Controller met variabele snelheid

in dit artikel zal ik je laten zien hoe je een PWM fan controller (DC) bouwt met behulp van een kort C programma, en een paar onderdelen waaronder de Launchpad rm57l microcontroller development kit. Het stelt gebruikers in staat om de snelheid van PWM-ventilatoren efficiënt te variëren om het geluidsniveau en het stroomverbruik te verminderen. Dit project bewaakt automatisch de temperatuur van het object waaraan de temperatuursensor is bevestigd (in dit geval een CPU-koellichaam dat wordt gebruikt om een kleine thermo-elektrische module te koelen) en regelt de ventilatorsnelheid dienovereenkomstig om de geluidsproductie en het stroomverbruik te minimaliseren. Hieronder is een demo van de fan controller in gebruik op een desktop CPU koeler.

Video: Kompulsa.

voordat u leert hoe u een ventilatorsnelheidsregelaar bouwt, leert u hoe de verschillende snelheidsregelmethoden werken. Ik zal twee belangrijke technologieën uitleggen: Resistive speed controllers en PWM fan controllers.

resistieve Toerentalregelaars

resistieve toerentalregelaars regelen het toerental van een ventilatormotor door weerstand te bieden aan de stroomstroom van de energiebron naar de motor. Dit kan worden gedaan met behulp van een combinatie van een potentiometer en transistor, of een andere varistor circuit. De eerste technologie is zeer eenvoudig te bouwen, maar zorgt ervoor dat de transistor om een groot deel van de stroom die er doorheen te branden. Daarom is het inefficiënt. PWM daarentegen, pulseert de volledige stroom vele malen per seconde aan en uit. De transistor zal nog steeds wat elektriciteit verspillen, maar niet zoveel.

PWM Toerentalregelaars

pulsbreedtemodulatie is een veel complexere, superieure en steeds vaker voorkomende stroomregelmethode die de regeling van motortoerentallen, lamphelderheid, onder andere op een energie-efficiënte manier vergemakkelijkt. De belangrijkste redenen voor PWM-motorregelaars zijn het verbeteren van de efficiëntie van apparaten en het verminderen van geluidsniveaus door ze waar mogelijk bij lage snelheden te bedienen.

ik gebruikte de ti Launchpad RM57L MCU development kit om deze fan controller te construeren (dankzij TI voor het verzenden), maar deze code kan eenvoudig worden aangepast om te draaien op de goedkopere Launchpad TMS57012, of de Launchpad TMS57004 Launchpads ook.

wanneer je leert hoe je een PWM fan controller construeert, helpt het om de verschillende technologieën/methoden en hun voor-en nadelen te begrijpen of te leren toepassen. Op deze manier weet je precies welke te gebruiken, en wanneer.

dit artikel gaat ervan uit dat u enige ervaring hebt met elektrotechniek en weet hoe u de transistor, sensor en alle andere genoemde apparatuur veilig kunt aansluiten. Probeer dit project op eigen risico.

Inhoudsopgave

  1. Onderdelenlijst.
  2. Voorbereiding Van De Ontwikkelomgeving.
  3. laten we beginnen met coderen!

deze diavoorstelling vereist JavaScript.

onderdelenlijst

Alle prijzen zijn in USD.

  1. 2n6284G NPN Darlington BJT Transistor. BJT betekent bipolaire junction transistor (handig omdat het een DC-stroomaanwinst van 750 heeft).
  2. drie weerstanden van 12 kOhm 1/2 watt.
  3. aansluitdoos met schroefaansluitingen of staafaansluitingen.
  4. Texas Instruments Launchpad rm57l MCU (RM57L843) development kit.
  5. 10 kOhm NTC-Thermistor met een B-waarde van 3435. ‘NTC’ betekent dat de weerstand afneemt wanneer de temperatuur stijgt.
  6. 40mm x 40mm (of groter, als u die maat niet kunt vinden) koellichaam voor de transistor.
  7. Verbindingsdraad/pin pluggen om de pinnen van de ontwikkelingskit aan te sluiten op de transistor, en om de transistor aan te sluiten op de voedingsbron (tenzij u een breadboard gebruikt). Deze zijn meestal in de $ 3-6 bereik.
  8. 12 of 5 volt stroombron.
  9. 12 volt CPU fan, of een 5 volt laptop fan (dit project is bedoeld voor drie of vier-draads ventilatoren die PWM ondersteunen). Deze zijn meestal in de$10- $ 20 bereik.
  10. CPU-koeler (inclusief koellichaam en ventilator) of een andere combinatie van een ventilator en een warm object dat ermee kan worden gekoeld. Dit stelt u in staat om te kijken naar de ventilator controller automatisch afkoelen zelf uit, en zet de ventilator uit. Ik gebruikte een CPU koeler met een ingebouwde ventilator. Het is de ultieme test!

ik zou aanraden om een koellichaam aan de transistor te bevestigen als je grote ventilatoren gaat voeden (groter dan de kleine 80mm ventilatoren die gewoonlijk worden gebruikt voor desktop CPU koeling). Het zal een aanzienlijke hoeveelheid warmte genereren.

Prepare Your Development Environment

de rm57l843 development kit is het hart van deze PWM fan controller (de manier waarop deze microcontrollers werken is niet veel anders dan een Arduino, dus wees niet geïntimideerd!). Onze eerste stap om deze PWM-fancontroller te bouwen is om onze ontwikkelingsomgeving op te zetten die we zullen gebruiken om de MCU te programmeren/te flitsen.

sluit de Launchpad rm57l development kit aan op de USB-poort van uw computer met behulp van de meegeleverde kabel, en maak vervolgens een Texas Instruments account aan zodat u de CCS IDE kunt downloaden. We zullen ook Halcogeen gebruiken voor deze oefening. HALCoGen is een hal codegenerator waarmee u uw MCU eenvoudig kunt configureren met behulp van een GUI. In dit geval zullen we het gebruiken om de analoog-naar-digitaal converter (de MibADC) en de timer module te configureren.

Download HALCoGen en CCS (zorg ervoor dat u bent ingelogd op uw TI-account voor CCS), en volg de onderstaande instructies om uw HALCoGen-project aan te maken.

maak eerst een nieuw project aan in HALCoGen, selecteer de’ RM57Lx ‘ ontwikkelkit, en dan zie je een lijst met varianten rechts op het scherm. In dit geval is er slechts één variant: de RM57L843ZWT. Selecteer dat en noem uw project ‘ PWM ‘ zoals hieronder getoond. Voer het pad van het project in in het veld ‘Locatie’, noteer het en klik op OK. We slaan ons CCS-project op in dezelfde directory. Uw PWM-project moet zich bevinden in een map met de naam PWM, onder uw werkmap, die we RM57L zullen noemen.

een schermafdruk van het scherm' nieuw project 'in HALCoGen

Maak een nieuw project genaamd’ PWM ‘ aan in HALCoGen. Hier configureer je de ADC en HET modules.

om een PWM-ventilatorcontroller te bouwen, moet u timers instellen die een kleine elektrische aan en uit oscilleren, en hun frequentie instellen.

schakel vervolgens de adc1-en HET1-stuurprogramma ’s in door het tabblad’ Driver Enable ‘ te selecteren en de onderstaande vakjes aan te vinken. De analoog naar digitaal converter (ADC) zal worden gebruikt om de Analoge temperatuursensor te converteren naar een digitale waarde die we kunnen gebruiken om de temperatuur te bepalen, waardoor de ventilatorcontroller de ventilatorsnelheid dienovereenkomstig kan aanpassen. De high-end timer (HET) zal worden gebruikt om ons PWM signaal te genereren, die zal worden gebruikt om een eenvoudige BJT transistor te besturen.

Ik adviseer de rest van de drivers uit te schakelen om systeembronnen te besparen (bijvoorbeeld: RAM en flashgeheugen).

enable-adc-and-het-drivers

Enable the het1 and ADC1 drivers in HALCoGen.

het is nu tijd om de analoog naar digitaal converter van onze PWM-fancontroller te configureren (die is ingebouwd in de Launchpad RM57L MCU). Ga naar het tabblad ADC1 en stel de FiFo-grootte in op 1, want dat is alles wat we nodig hebben voor dit project. Selecteer ook laat Speld 7 toe, aangezien dat is wat wij de temperatuursensor zullen verbinden. Pin 7 is gemarkeerd met ‘AI1_7’ aan de onderkant van uw Launchpad development kit.

Hoe werkt analoog naar digitaal conversie

Screenshot van adc1 configuratie

Ga naar het tabblad HET1 waar u de PWM timer van onze fan controller configureert (ingebouwd in de rm57l development kit), en de HET-pin die de transistor aanstuurt die de ventilator voedt en doe het volgende zoals getoond in de volgende screenshot.

Selecteer het tabblad PWM 0-7, stel het taakveld in voor PWM 0 op 0. Dat stelt de duty cycle van het PWM signaal op 0, dus het instellen van de duty cycle van de ventilator die u controleert op 0. Een duty cycle van 0 betekent gewoon dat de ventilator uit zal zijn. Een andere manier om het te zeggen is: het percentage van de tijd dat de stroom aan zal staan is 0.

we beginnen met een duty cycle van 0 in dit project omdat we de duty cycle (en dus de snelheid van de ventilator) programmatisch gaan aanpassen op een manier die de temperatuur volgt van het koellichaam waaraan de temperatuursensor is bevestigd. Wanneer de inschakelcyclus op 0 is ingesteld, schakelt de ventilatorcontroller de ventilator uit (0 komt overeen met 0%). Volgende, controleer het paar ‘Enable’ checkboxes net aan de linkerkant van de’ Pin ‘ veld. Dat schakelt het PWM signaal in. Voer 2 in het veld ‘Pin’ in, dat is het Poort 1, Pin 2, gemarkeerd met ‘HET1_2’ aan de onderkant van uw Launchpad. Tenslotte: voer 10.000 (zonder komma) in het veld periode in.

de in dit veld gebruikte eenheid is de microseconde. Een microseconde is een miljoenste van een seconde. Als u dit veld op 10.000 zet, wordt de timercyclus elke 10.000 microseconden (elke 0) ingeschakeld en uitgeschakeld.01 seconden). Door deze snelle schakeling, zult u niet merken dat de stroom wordt in-en uitgeschakeld, wat resulteert in een soepele, continue werking van de ventilator.

het PWM-Configuratiescherm.

Schakel de timer ‘PWM 0’in.

om Halcogeenconfiguratie af te ronden, selecteert u het tabblad Pin 0-7. Hier configureer je de rm57l pin waar de basis van de transistor mee verbonden wordt (via de 12 kOhm weerstand natuurlijk). Vink het keuzevakje DIR aan in de sectie’ Bit 2 ‘ zoals hieronder getoond om bit 2 in de uitvoerrichting in te stellen. Dit stelt ons in staat om de ventilator aan te zetten. Een pin kan worden aangeduid als een bit, dus ‘Bit 2’ betekent in dit geval de Pin 2.

Wat Is Een Weerstand?

de uitvoerwaarde (gemarkeerd als DOUT in de schermafbeelding hieronder) is de toestand van de pin, die ofwel aan (1), ofwel uit (0) kan zijn. Zorg ervoor dat het is ingesteld op 0, dus zijn uit wanneer de MCU in eerste instantie opstart.

het timerconfiguratiescherm

stel HET1, Pin 2 in op de uitgangsrichting.

Selecteer bestand > project opslaan en vervolgens Bestand > Genereer Code (of druk op F5). Bekijk het’ Output ‘ venster onderaan totdat het zegt dat de code generatie is voltooid. Nu kun je naar de CCS configuratie gaan, en als je klaar bent, kun je eindelijk de onderdelen verzamelen en de fan controller bouwen.

laten we Code!

start CCS en selecteer / Maak een map met de naam RM57L als uw werkruimte zoals hieronder getoond. Maak een nieuw project aan in Code Composer Studio genaamd PWM, dat zal worden opgeslagen in de root van de PWM directory waar je de PWM zult zien.hcg bestand. PWM.hcg is uw HALCoGen projectbestand. Zoals ik hierboven al zei, de CCS en HALCoGen projecten bestanden moeten in dezelfde directory voor deze oefening.

Sluit uw Launchpad rm57l-ontwikkelkit aan met behulp van de meegeleverde USB-kabel.

aan uw rechterkant, selecteer ‘RM57L8x’ uit de dropdown box, want dat is wat we gaan gebruiken. Selecteer vervolgens de xds110 USB debug probe uit de dropdown box eronder. Selecteer tenslotte ‘leeg Project’ en klik op Voltooien.

maak CCS-Project

Klik met de rechtermuisknop op het PWM-project in het deelvenster Projectverkenner (het bevindt zich aan de linkerkant van het scherm), voeg vervolgens de HALCoGen /includes-map van uw PWM-project-map toe aan uw CCS-project door op de onderstaande knop te klikken. Deze rm57l inclusief bestanden bestaan uit bibliotheken en drivers die het veel gemakkelijker maken om programma ‘ s voor de MCU te schrijven.

add Include Directory

Navigeer naar de HL_sys_main.c bestand in het Projectverkenner paneel links onder /PWM / source/. In dat bestand, plak de rm57l code Monster hieronder.

de broncode (Hercules RM57L Code Sample)

de volgende rm57l sample code kan worden geüpload naar uw Launchpad via USB met behulp van Code Composer Studio. Zo moet uw bronbestand er uitzien:

Temperatuurmetingen zijn in °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 */}

u bent van harte welkom om deze rm57l code te herdistribueren, mits u een link terug naar deze pagina opneemt.

plaats uw code altijd tussen de / * USER CODE BEGIN * / en / * USER CODE END * / comments, zodat HALCoGen het niet zal verwijderen na het maken van wijzigingen aan uw project.

onthoud altijd dat de temperatuur van het koellichaam lager zal zijn dan de temperatuur van de CPU of het apparaat dat het koelt. Dit betekent dat als het koellichaam 70 °C is, dan is de CPU nog heter dan dat. U kunt deze PWM-ventilatorcontroller ook ontwerpen om direct de CPU-temperatuur te meten en de thermistor erop te plaatsen. Dit is nauwkeuriger, omdat de temperatuur van het koellichaam langzaam achterblijft bij de CPU-temperatuur.

elk van de ADC-waarden is een digitale weergave van de temperatuurmetingen van de ventilatorregelaar, en elk waardebereik vertegenwoordigt een temperatuurbereik dat een bepaalde hoeveelheid luchtstroom vereist om het af te koelen. Bij deze thermistor komt een lagere ADC-waarde overeen met een hogere temperatuur en omgekeerd. De code is nu bijgewerkt om de analoge naar digitale converter waarden om te zetten in temperatuurmetingen in graden Celsius.

voorbeeldscenario: Een ADC-waardebereik van 310 tot 320 kan hoog genoeg zijn om de ventilator helemaal tot 80% te laten aanzwengelen, omdat het aangeeft dat onze proefpersoon (het koellichaam, en dus CPU) heet wordt. Als de koellichaam / ventilator groot genoeg is, is deze snelheid meestal niet nodig. Dit is een geval waarin u misschien wilt profiteren van een grotere koellichaam.

daarentegen kan een ADC-waardebereik van 340 tot 350 erop wijzen dat het koellichaam slechts een beetje warm is en dat de ventilator slechts op een zeer lage stand (20%) moet werken, zodat het bij deze stand veel stiller zal zijn. Ik stel de duty cycle in op basis van de ADC-waardebereiken, in plaats van de EXACTE ADC-waarden om frequente snelheidsschommelingen te voorkomen. Ik zou het ten zeerste aanbevelen om een UART-routine te implementeren die de analoog-naar-digitaal converter-metingen naar uw computer verzendt, zodat u alles in real-time kunt zien gebeuren. Het maakt debuggen gemakkelijker, en het is ook informatief.

nuttige toepassingen voor PWM omvatten, maar zijn niet beperkt tot:

  1. airco en koelkast compressor snelheidsregeling voor verbeterde efficiëntie en verminderde geluidsniveaus.
  2. dimlicht.
  3. snelheidsregeling HEV/elektrisch voertuig.
  4. regelaars voor Ventilatieventilatoren.
  5. radiatorventilatorregelaars, die elektriciteit, gas kunnen besparen en geluidsoverlast door auto ‘ s op de weg kunnen verminderen. De geluidsreductie kan in sommige gevallen zelfs mensen helpen beter te slapen ‘ s nachts.

houd er rekening mee dat Voor alle bovenstaande toepassingen een ventilator nodig is die PWM ondersteunt. Helaas zijn niet alle fans hiervoor gebouwd.

Hardware Setup

zoals ik in het begin al zei, is dit artikel geschreven met de veronderstelling dat je weet hoe je een transistor moet gebruiken, en hoe je de sensor veilig op het Launchpad moet aansluiten.

sluit de thermistor aan op ADC-poort 1 pin 7, en de transistor op het-Poort 1 pin 2 van uw rm57l-ontwikkelingskit, gebruik de drie weerstanden in de onderdelenlijst dienovereenkomstig. Als u gebruik maakt van een CPU-koeler (heatsink + ingebouwde ventilator combo), plaats dan de temperatuursensor in de koellichaam (zorg ervoor dat geen van de sensor terminals in contact komen met de koellichaam, die elektrisch geleidend kan zijn). Sluit de koellichaam ventilator aan op de controller. De tutorials hieronder gekoppeld zal u helpen leren hoe u het opzetten van de ventilator, ADC pin, en transistor.

Sparkfun verklaart analoog naar digitaal conversie, en een basis voorbeeld van een ADC sensor verbinding hier (dat is wat ik gebruikte voor dit project, behalve mijn sensor heeft twee leads, in plaats van de drie die hun potentiometer doet). Ze verklaren hier ook transistors.

als je dat eenmaal onder de knie hebt, kun je je fan controller in een mum van tijd operationeel hebben!

Sensor

de ADC in de RM57L MCU development kit zet de analoge spanningsschommelingen veroorzaakt door de thermistor (of welke temperatuursensor u gebruikt) om in digitale waarden opgeslagen in de waarde variabele hierboven. Omdat ADC-waarden afhankelijk zijn van de sensor die u gebruikt, moet u de specificaties in de documentatie van uw sensor gebruiken om de temperatuurmetingen om te zetten in graden.

de sensor die voor dit project werd gebruikt was een UXCELL 3435B 10 kOhm thermistor. Een thermistor is een weerstand die is ontworpen om de weerstand te variëren met de temperatuur (veel meer dan een gewone weerstand). Als een thermistor wordt gewaardeerd op 10 kOhm, betekent dit dat de weerstand 10 kOhm is bij 25 °C.

NB: de weerstand van een bepaalde thermistor zal niet lineair variëren met de temperatuur, daarom geven thermistorfabrikanten een temperatuur vs weerstandskaart, en (soms) de A -, B-en C-waarden voor gebruik in de Steinhart-Hart-vergelijking, die dit probleem aanpakt.

code succesvol getest met CCS-versies:

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.