Arduino PWM frekvensinställning. Ändra frekvensen för PWM (PWM) Arduino

Och låt oss försöka göra ny uppgift. Jag tror att alla har sett nyårsdisplaygirlanger, där lysdioderna blinkar mjukt. Låt oss säga att vi vill göra något liknande.
Vi har redan tittat på digitalWrite()-funktionen och vi vet att värdet den skriver kan vara av två alternativ - hög eller låg nivå. PÅ det här fallet funktionen analogWrite() hjälper oss. "Formuleringar" av funktioner skiljer sig endast i initiala prefix, så de är lätta att komma ihåg.

Funktionen analogWrite() innehåller, liksom digitalWrite(), två argument inom parentes och fungerar enligt samma verbala princip: "var, vad." Den största skillnaden är förmågan att skriva ett brett spektrum av värden istället för det vanliga LÅG eller HÖG. Detta gör att vi kan justera ljusstyrkan på lysdioden. Den viktigaste anmärkningen att ta hänsyn till är att given funktion fungerar bara på vissa kontakter. Dessa stift är markerade med ett "~". Denna symbol betyder att detta är en PWM-kontakt. PWM (pulsbreddsmodulering) låter som PWM på ryska ( pulsbreddsmodulering). Funktionsprincipen är baserad på att ändra pulslängden. Grafiskt kan detta representeras enligt följande:

Låt oss försöka förstå hur det fungerar genom att titta på ett enkelt exempel. För att göra detta måste du ansluta lysdioden till PWM-kontakten genom ett 150 ohm motstånd och "sy" ett enkelt program i Arduino. Anslutningsschemat och skisskoden visas nedan:


void setup()
{
pinMode(led,OUTPUT);
}

void loop()
{
for(int i=0; i<=255; i++)
{
analogWrite(led,i);
fördröjning(10);
}
for(int i=255; i>=0; i--)
{
analogWrite(led,i);
fördröjning(10);
}
}


Jag tror att koden i allmänhet är tydlig, men du måste vara lite uppmärksam för slinga(). Det finns något sådant som tillstånd. Eftersom vi arbetar med 8-bitars upplösning (detta kommer att diskuteras lite senare) kommer minimivärdet att vara 0 och maxvärdet blir 255. I slutet av varje iteration ställer vi in ​​tidsfördröjningen till 10ms.

Låt oss gå tillbaka till diagrammet från föregående lektion och försöka göra en liknande krans med funktionen analogWrite().


int knappPin = 2;
int pins = (3,5,6,9,10,11);

boolean lastButton = LÅG;
boolean currentButton = LÅG;
boolesk aktivera=falskt;

void setup()
{
pinMode(buttonPin, INPUT);
for(int mode = 0; mode<= 5; mode++) pinMode(pins, OUTPUT);
}

boolesk debounce(boolesk sista)
{
boolesk ström = digitalRead(buttonPin);
if(senaste != aktuell)
{
fördröjning(5);
aktuell = digitalRead(buttonPin);
}
returström;
}

void loop()
{
currentButton = debounce(lastButton);
if(lastButton == LOW && currentButton == HÖG)
{
aktivera = !aktivera;
}

Om (aktivera == sant)
{
för (int i=0; i<=5; i++)
{
för (int ljusstyrka = 0; ljusstyrka<= 255; brightness++)
{
fördröjning(1);
}
fördröjning(40);
}
för (int i=0; i<=5; i++)
{
för (int ljusstyrka = 255; ljusstyrka >= 0; ljusstyrka--)
{
analogWrite(stift[i], ljusstyrka);
fördröjning(1);
}
fördröjning(40);
}
}

Om(aktivera == falskt)
{
for(int i = 0; i<= 5; i++) digitalWrite(pins[i], LOW);
}

LastButton = currentButton;
}


Visuellt har skissen blivit något mer komplicerad. Faktum är att allt är enkelt här och låt oss ta reda på det. Vi måste identifiera alla anslutna lysdioder, men istället för den vanliga int-led, använder vi en array, vars varje element är ett PWM-stift på Arduino. I kroppen av void setup()-funktionen agerade vi också på ett knepigt sätt. Vi anförtrodde "uppräkningen" av alla kontakter till for ()-loopen, med varje iteration som motsvarande kontakt konfigureras på OUTPUT. Låt oss gå vidare till void loop()-funktionen. Funktionen debounce() och det initiala if()-villkoret förblir oförändrade. Vi kontrollerar fortfarande nivåerna för två variabler: det föregående värdet (inledningsvis LÅG) och knappens nuvarande tillstånd. När dessa villkor är uppfyllda inverteras värdet på aktiveringsvariabeln. Med det i åtanke har vi lagt till ytterligare två enkla if()-villkor. Om aktivera = sant, så slås kransen på, vars jämnhet av "flödet" styrs av for ()-slingan. Om aktivera = falskt är alla lysdioder släckta. I slutet av villkoren tar variabeln lastButton det aktuella tillståndet för knappen.
När vi testade vårt program märkte vi att allt inte fungerar som det ska. Kom ihåg att vi i förra lektionen gjorde ett tillägg om att med ett stort värde av tidsfördröjningen, fungerar knappen efter att den har gått ut? I föregående exempel, med kransen påslagen, var den totala fördröjningen i kroppen av void loop()-funktionen 85ms. Detta gav oss möjlighet att hinna "få" under en viss tidsperiod. I denna skiss, under samma villkor, skiljer sig fördröjningen flera gånger. Kanske, om du vill stänga av kransen, föreslår ordet "avbryta" sig själv. Detta kommer att vara lösningen på detta problem!

Jag hoppas att den här artikeln var användbar för dig. I nästa lektion kommer vi att titta på avbrott i Arduino och uppnå önskat resultat.

Till exempel);

  • ett motstånd med ett nominellt värde på 190 ... 240 Ohm (här är en utmärkt uppsättning motstånd med de vanligaste betygen);
  • persondator med Arduino IDE-utvecklingsmiljön.
  • Instruktioner för att använda PWM i Arduino

    1 Allmän information om pulsbreddsmodulering

    Arduino digitala stift kan bara mata ut två värden: logisk 0 (LÅG, låg) och logisk 1 (HÖG, hög). Det är därför de är digitala. Men Arduino har "speciella" slutsatser, som anges PWM. De är ibland betecknade med en vågig linje "~" eller inringade eller på annat sätt särskiljda från andra. PWM står för Pulsbreddsmodulering eller pulsbreddsmodulering, PWM.

    En pulsbreddsmodulerad signal är en pulsad signal med konstant frekvens, men variabel arbetscykel(förhållandet mellan pulsens varaktighet och perioden för dess upprepning). På grund av det faktum att de flesta fysiska processer i naturen har tröghet, kommer plötsliga spänningsfall från 1 till 0 att jämnas ut och anta ett medelvärde. Genom att ställa in arbetscykeln kan du ändra medelspänningen vid PWM-utgången.

    Om arbetscykeln är 100 % kommer den digitala utgången på Arduino hela tiden att ha en logisk spänning på "1" eller 5 volt. Om du ställer in arbetscykeln till 50%, kommer halva tiden att vara logisk "1" och halva tiden - logisk "0", och medelspänningen kommer att vara 2,5 volt. Tja, och så vidare.


    I programmet är arbetscykeln inte satt som en procentsats, utan som ett tal från 0 till 255. Exempelvis kommandot analogWrite(10, 64) säger åt mikrokontrollern att applicera en signal med en arbetscykel på 25 % till digital PWM-utgång # 10.

    Arduino PWM-stift fungerar vid cirka 500Hz. Detta innebär att pulsrepetitionsperioden är cirka 2 millisekunder, vilket mäts av de gröna vertikala slagen i figuren.

    Det visar sig att vi kan simulera en analog signal på en digital utgång! Intressant, eller hur?!

    Hur kan vi använda PWM? Många ansökningar! Kontrollera till exempel ljusstyrkan på lysdioden, motorns hastighet, transistorns ström, ljudet från piezoemittern, etc.…

    2 Schematisk för demonstration Pulsbreddsmodulering i Arduino

    Låt oss titta på det mest grundläggande exemplet - styra ljusstyrkan på en LED med PWM. Låt oss ta ett klassiskt mönster.


    3 Skissexempel med PWM

    Låt oss öppna skissen "Tona" från exemplen: Filexempel 01.Basics Tona.


    Låt oss ändra det lite och ladda det i Arduino-minnet.

    Int ledPin = 3; // deklarera ett stift som styr lysdioden int ljusstyrka = 0; // variabel för inställning av ljusstyrka int fadeAmount = 5; // ljusstyrka steg void setup()( pinMode(ledPin, OUTPUT); } void loop() ( analogWrite(ledPin, ljusstyrka); // ställ in ljusstyrka ljusstyrka på ledPin pin ljusstyrka += fadeAmount; // ändra ljusstyrkavärdet /* när gränserna för 0 eller 255 nås, ändra riktningen för ljusstyrkeändringen */ if (ljusstyrka == 0 || ljusstyrka == 255) ( fadeAmount = -fadeAmount; // ändra stegtecken) delay(30); // fördröjning för bättre synlighet av effekten }

    4 LED ljusstyrka kontroll använder PWM och Arduino

    Vi sätter på strömmen. Lysdioden ökar gradvis i ljusstyrka och minskar sedan gradvis. Vi simulerade en analog signal vid en digital utgång med hjälp av pulsbreddsmodulering.


    Se de bifogade filmerna, som tydligt visar förändringen i ljusstyrkan på lysdioden, på det anslutna oscilloskopet kan du se hur signalen från Arduino ändras.

    Puls Width Modulation (PWM) Arduino UNO och NANO fungerar på analoga utgångar 3, 5, 6, 9, 10, 11 med en frekvens på 488,28 Hz. AnalogWrite-funktionen ändrar PWM-frekvensen från 0 till 255 och motsvarar en arbetscykel på 0 till 100 %. För många enheter är Arduino NANO PWM-frekvensen för låg, så den måste ökas. Låt oss se hur man gör det rätt.

    Arduino Pulse Width Modulation

    PWM, på engelska Pulse-Width Modulation (PWM) är styrning av effekt vid belastningen genom att ändra pulsernas arbetscykel (bredd) vid en konstant frekvens och signalamplitud. Följande graf visar att med olika värden i analogWrite-funktionen förblir amplituden på pulserna konstant, men pulsernas bredd ändras. Signalstyrkan bestämmer pulsens arbetscykel.

    Schema. Signalparametrar, PWM-driftcykel

    Det finns två tillämpningsområden för pulsbreddsmodulering:

    1. PWM används i strömförsörjning, strömregulatorer, etc. Användningen av PWM på Arduino Nano gör det mycket lättare att kontrollera ljusstyrkan hos ljuskällor (LED, LED-remsor) och motorernas rotationshastighet.

    2. PWM används för att ta emot en analog signal. Digital-till-analog-omvandlaren (DAC) på Arduino är lätt att implementera, eftersom den kräver ett minimum av radioelement - bara en RC-kedja av ett motstånd och en kondensator räcker.

    Ändra Arduino PWM-frekvens (bitdjup)

    Arduino Uno- och Arduino Nano-korten baserade på ATmega168/328 har 6 hårdvaru-PWM-modulatorer på analoga portar 3, 5, 6, 9, 10, 11. PWM-signalen styrs med hjälp av analogWrite-funktionen, som genererar en analog signal vid ut och ställer in arbetscykelimpulsen. Arduino ställer in stiften till en frekvens på 488,28 Hz och en upplösning på 8 bitar (från 0 till 255).


    Schema. Pulsbreddsmodulering för dummies

    Den ATmega168/328-baserade Arduino använder tre timers för PWM:

    Timer 0- slutsatser 5 och 6
    Timer 1- slutsatser 9 och 10
    Timer 2- slutsatserna 3 och 11

    Arduinos PWM definieras av integrerade komponenter som kallas timers. Varje timer i Arduino Uno- och Nano-korten baserade på ATmega168/328-mikrokontrollern har två kanaler anslutna till utgångarna. För att ändra frekvensen för PWM-signalen måste du ändra timern som den är ansluten till. I detta fall kommer PWM också att ändras på de analoga utgångarna som är parallellkopplade med samma timer.

    Hur man ökar frekvensen och bitdjupet för PWM Arduino

    Det finns inget sätt att ändra Arduino PWM-frekvensen utan direkt minneskontroll på låg nivå. Låt oss överväga ytterligare hur man ändrar timerdriftläget för att öka Arduino PWM-frekvensen. Timer 0 används för att beräkna tid, dvs. fördröjning och millis funktioner. Att öka frekvensen med Timer 0 kommer att bryta mot tidsbesparande funktioner som kan användas i skissen.

    För att öka Arduino-bitdjupet vid 9 och 10 analoga utgångar, ändra frekvensen Timer 1 utan bibliotek. Den maximala PWM-frekvensen kan nås på Arduino Uno- och Nano-kort - 62 500 Hz. För att göra detta, i proceduren void setup() måste du lägga till lämpligt kommando från tabellen nedan.

    Lov PWM-frekvens Kommandon för lägesinställning
    8 bitar 62 500 Hz TCCR1A = TCCR1A & 0xe0 | ett;
    TCCR1B = TCCR1B & 0xe0 | 0x09;
    7812,5 Hz TCCR1A = TCCR1A & 0xe0 | ett;
    TCCR1B = TCCR1B & 0xe0 | 0x0a;
    976,56 Hz TCCR1A = TCCR1A & 0xe0 | ett;
    TCCR1B = TCCR1B & 0xe0 | 0x0b;
    244,14 Hz TCCR1A = TCCR1A & 0xe0 | ett;
    TCCR1B = TCCR1B & 0xe0 | 0x0c;
    61,04 Hz TCCR1A = TCCR1A & 0xe0 | ett;
    TCCR1B = TCCR1B & 0xe0 | 0x0d;

    Den maximala PWM-frekvensen för Arduino (Arduino PWM Frequency) är 62 500 Hz.

    Pulse Width Modulation, förkortat PWM, kan implementeras på Arduino på flera sätt. Den här artikeln förklarar enkla PWM-tekniker, samt metoder för att använda dessa register för exakt kontroll över arbetscykel och frekvens.

    Pulsbreddsmodulering innebär att pulsbredden sker strikt i en fyrkantsvåg.

    Detta förbättrar motorkontrollen. Istället för en ren DC-signal till motorn används en serie pulser. De kan vara på maximal spänning, men bara för en bråkdel av en sekund. Om du utför upprepade åtgärder kommer motorn att börja rotera. Detta gör att du kan kontrollera hastigheten mer bekvämt. Att bara applicera en DC-signal kommer inte att övervinna friktionen i motorn och växlarna, istället kommer den att starta abrupt vid låg hastighet.

    Genom att öka frekvensen av PWM-pulserna på Arduino kan du utföra operationer i hög hastighet.

    Dekodern genererar denna signal för att styra motorn. Detta är samma koncept som pulseffektfunktionerna som finns på DC-nätaggregat.

    Tänk på de viktigaste fördelarna med att använda Arduino PWM:

    1. Effekteffektivitet: Induktionen av rotorlindningarna kommer att utjämna strömmen (induktorer motstår strömförändringar). Transistorer har låg impedans med lågt spänningsfall och effektförlust. Motståndet avleder mer effekt (I2R) som värme.
    2. Hastighetskontroll: Motorn kommer att se en lågimpedanskälla även om den ständigt växlar mellan hög och låg spänning. Resultatet är uppenbart - motorn accelererar. Serieresistans kommer att få motorn att uppleva låg spänning, så den stannar lätt vid rätt ögonblick.
    3. Styrkrets: Det är mycket lätt för digital elektronik (t.ex. mikrokontroller) att slå på eller stänga av spänningen med transistorer. En analog utgång (antingen elektroniskt eller mekaniskt styrd) kräver fler komponenter och ökar effektförlusten. Detta kommer att vara det dyrare alternativet när det gäller elektronik och effektkrav.

    Du kan skapa en pulsbreddsmodulator på esp8266 shim, på Arduino UNO och Arduino Nano shim. Det vill säga, vilken modell som helst av den beskrivna mikrokontrollern är lämplig för design.

    Analog signalkonditionering

    AnalogReadär en funktion som används för att läsa analoga värden från analoga PWM-stift på Arduino. Arduino UNO-kortet har en 6-kanals, 10-bitars analog-till-digital-omvandlare (ADC). Detta innebär att ADC:n kommer att mappa inspänningar från 0 till 5V till ett heltalsvärde från 0 till 1023.

    Därför returnerar analogRead-funktionen valfritt värde mellan 0 och 1023. Funktionssyntax analogLäsanalogRead (analog utgång nr).

    Eftersom vi läser analoga spänningar från potentiometern på stift A0 måste vi skriva analogRead(A0) i skissen. När den returnerar ett heltalsvärde skapas en temporär heltalsdatatypvariabel med den. Nästa funktion är analogWrite. Detta är en funktion som används för att ställa in arbetscykeln för PWM-signalen för ett givet PWM-stift.

    Syntaxen för analogWrite-funktionen är − analogWrite(slutsatsPWM nej, värde).

    Värdet anger arbetscykeln och måste vara ett värde mellan 0 (0V) och 255 (5V).

    Låt oss gå vidare till den faktiska skissen av kontrollkretsen för LED-ljusstyrka. Den slutliga skissen visas i följande figur.

    Från skissen ovan kan vi enkelt förstå att värdet som returneras av analogRead-funktionen lagras i tempvariabeln. Detta värde kommer att användas för att styra arbetscykeln för PWM-signalen med hjälp av analogWrite-funktionen.

    Men intervallet för värden som accepteras av analogWrite-funktionen är mellan 0 och 255. Därför måste vi göra lite matte för att lägga in det lämpliga värdet i analogWrite-funktionen.

    Slutligen läggs det beräknade värdet in i analogWrite-funktionen tillsammans med PWM-stiftet för att ta emot PWM-signalen.

    När kretsen är byggd och skissen laddas in i Arduino ser vi att genom att ändra positionen på potentiometern kan vi också ändra ljusstyrkan på LED:n.

    En annan version av skissen för Arduino:

    Int ledPin = 3; // deklarera ett stift som styr lysdioden int ljusstyrka = 0; // variabel för inställning av ljusstyrka int fadeAmount = 5; // ljusstyrka ändra steg void setup() ( pinMode(ledPin, OUTPUT); ) void loop() ( analogWrite(ledPin, ljusstyrka); // ställ in ljusstyrka på ledPin pin ljusstyrka += fadeAmount; // ändra ljusstyrka värde /* när gränserna för 0 eller 255 nås, ändra riktningen för ljusstyrkeändringen */ if (ljusstyrka == 0 || ljusstyrka == 255) ( fadeAmount = -fadeAmount; // ändra tecknet för steget ) delay(30) ; // fördröjning för bättre synlighet av effekten)

    Pulsbreddsmodulatorer i Arduino

    För att använda frekvens PWM på är allt du behöver göra att ställa in ett av PWM-stiften som en utgång, anropa sedan analogWrite-kommandot och ställa in nivån. Frekvensen är inställd på runt 500Hz så det finns ingen anledning att oroa sig för den delen.

    Vi väljer pin nummer 3, ställer in den som utgång och analogSkriv ett värde för den. När vi väljer en utgång har vi 256 nivåer att välja mellan. Duty cycle nivån kan ställas in mellan siffrorna 0 och 255, där 0 är 0 % puls och 255 är 100 % puls.

    Det sista mikrokontrollerstiftet på Arduino Uno-kortet är 5 V. För att ställa in lysdioden vi valde till full ljusstyrka måste vi lägga på 3,3 V och 15 mA ström. För att göra detta sänker vi spänningen över 100 ohm-motståndet.

    Ökar frekvensen och bitdjupet för PWM Arduino

    För att ändra PWM-frekvensen för Arduino uppåt, måste du hänvisa till följande instruktioner.

    När en högfrekvent PWM-signal filtreras kommer en liten komponent av den alltid att passera genom filtret. Detta beror på att kondensatorn är för liten för att helt filtrera den. Man skulle kunna välja en stor kombination av kondensatorer och motstånd, men då kommer det att ta lång tid att nå rätt utspänning när kondensatorn är laddad.

    Detta skulle avsevärt begränsa hur snabbt signalen kan ändras och vara synlig vid utgången. Därför måste du välja ett rimligt värde på rippelspänningen. En populär applikation skulle vara att ändra spänningen MOSFET. Eftersom MOSFETs är spänningsstyrda enheter kan de enkelt styras med vår PWM-mikrokontroller med lågpassfilter. Utgången kommer att ha valfri rippelspänning vid ingången.


    I det här exemplet, låt oss anta att MOSFET kommer att driva en icke-kritisk belastning såsom en högeffekts LED. I det här fallet behöver vi bara hålla oss inom rimliga gränser, så toppströmmen i lysdioden kommer inte att överskridas. I detta fall skulle en krusning på 0,1 volt vara mer än tillräckligt.

    Exempel på användning av PWM på Arduino

    Bredbandspulsbreddsmodulering är en metod för att koda spänning på en fast bärvågsfrekvens. Det används ofta för radiostyrda enheter. Varje typ av moduleringsschema har sina fördelar och nackdelar.

    AM-modulering var den första typen av modulering som användes för radiosändningar. Det enklaste moduleringsschemat kräver bara en enda transistor eller vakuumrörsförstärkare att implementera, vilket gjordes i radions tidiga dagar.

    Med behovet av digital kommunikation uppfanns en ny moduleringsmetod, PWM. Denna metod har samma brusimmunitet som radiovågor. Den största skillnaden är moduleringens enkelhet och digitala karaktär. Istället för att ändra moduleringsfrekvensen med spänning slås utgången helt enkelt på och av med en fast frekvens. Procentandelen på tid är proportionell mot signalspänningen.