PWM: analoge pinnen emuleren met je Arduino-bord

PWM-signalen

Met de digitale en analoge pinnen, die u op uw Arduino-bord kunt gebruiken, kunt u elektrische signalen ontvangen of verzenden om gegevens van uw elektronische projecten te besturen of te verkrijgen. Daarnaast zitten er nog andere zeer interessante signalen in dit type plaat, en dat zijn de PWM dat een analoog signaal kan emuleren zonder daadwerkelijk analoog te zijn. Dat wil zeggen, het zijn digitale pinnen die op een vergelijkbare manier (niet hetzelfde) kunnen werken als een analoog signaal.

Dit soort signalen is erg praktisch als je niet alleen digitale HIGH en LOW signalen wilt gebruiken, dat wil zeggen 1 of 0, AAN en UIT, maar je wilt verder gaan en beschrijven iets complexere signalen. Het is bijvoorbeeld mogelijk om de snelheid van a te moduleren motor gelijkstroom, of de lichtintensiteit van een lamp, voor een solenoïde, enz.

Analoog versus digitaal systeem

Analoog versus digitaal signaal

Elektronische circuits kunnen worden onderverdeeld in twee grote families of categorieën: digitaal en analoog. Als we het hebben over digitale elektronica, gebruiken we grootheden met discrete waarden, dat wil zeggen een binair systeem dat wordt weergegeven door elektrische signalen van een lage of hoge spanning om de toestand van de bits die worden verwerkt te interpreteren. Aan de andere kant, als het gaat om een ​​analoog circuit, worden grootheden met continue waarden gebruikt.

Binnen digitale systemen zijn op hun beurt te vinden die van het combinatietype en die van het sequentiële type. Dat wil zeggen, de eerste zijn die waarin de output van het systeem alleen afhangt van de status van de inputs. Aan de andere kant, in de opeenvolgende, zijn geheugenelementen opgenomen, en de output zal afhangen van de huidige status van de inputs en de vorige opgeslagen status.

In het geval van analogen zijn er niet deze twee grote groepen of varianten, omdat het hier continue signalen zijn die altijd afhankelijk zullen zijn van het signaal huidige systeem. In een luidspreker is het signaal dat je levert bijvoorbeeld afhankelijk van het geluid dat je wilt reproduceren. Hetzelfde geldt voor een microfoon, die een analoog signaal genereert, afhankelijk van het ontvangen geluid. Je hebt het vast ook gezien met veel andere sensoren die we in deze blog hebben beschreven en die werken met analoge signalen (en daarom moest er een formule worden gemaakt zodat later de waarden konden worden berekend of geconditioneerd in de Arduino IDE-schetsen ) ...

Deze kenmerken van de een en de ander zorgen ervoor dat sommige hun eigen hebben voor-en nadelen, zoals gebruikelijk in bijna alles. Digitale zijn bijvoorbeeld meestal goedkoper, sneller, gemakkelijker te ontwikkelen, informatie kan gemakkelijker worden opgeslagen, ze zijn nauwkeuriger, ze kunnen worden geprogrammeerd, ze zijn niet zo kwetsbaar voor de effecten van ruis, enz. Maar het is ook waar dat je met analogen kunt werken met complexere signalen.

door voorbeeld bekijkenkan een digitale Hall-effectsensor alleen de aan- of afwezigheid van een magnetisch veld in de buurt detecteren. In plaats daarvan kan een analoge Hall-effectsensor dat doen en ook de dichtheid van het magnetische veld bepalen dankzij een analoog signaal dat het aan zijn uitgang genereert. Als u weet hoe u dat signaal met een hogere of lagere spanning goed moet interpreteren, kunt u die omvang gemakkelijk kennen. Je hebt andere voorbeelden in een veelheid van natuurgrootten die je kwantitatief kunt meten met een analoog systeem, zoals temperatuur, tijd, druk, afstand, geluid, etc.

Analoog versus digitaal signaal

Dat gezegd hebbende, een analoog signaal Het zal een spanning of elektrische stroom zijn die in de tijd en continu varieert. Als het in een grafiek wordt weergegeven, zou het analoge signaal een sinusgolf met enkele frequentie zijn.

De digitaal signaal, is een spanning die stapsgewijs varieert in de tijd. Dat wil zeggen, als het wordt weergegeven in een grafiek, zal het een stapsignaal zijn dat niet continu varieert, maar verandert in stappen of discrete incrementen.

U moet weten dat er circuits zijn om van een analoog signaal naar een digitaal signaal te gaan of omgekeerd. Deze converters ze staan ​​bekend als DAC (Digital-to-Analog Converter) en ADC (Analog-to-Digital Converter). En ze komen heel vaak voor op veel apparaten die we tegenwoordig gebruiken, zoals tv, computers, enz. Hiermee kunt u de digitale signalen die door deze apparatuur worden gebruikt, converteren naar een elektronisch niveau om te werken met andere randapparatuur of onderdelen die analoog werken.

door voorbeeld bekijken, een luidspreker of microfoon met analoge signalen die werkt met een geluidskaart, of digitale grafische kaarten die de beroemde RAMDAC-chip hadden voor de analoge monitorpoorten ... In Arduino worden dit type converters ook voor meerdere projecten gebruikt, zoals we zullen zien ...

Wat is PWM?

grafische duty cycle

Hoewel PWM (Pulse-Width Modulation), of pulsbreedtemodulatie, heeft een digitale basis, de vorm van het signaal lijkt op een enigszins "vierkant" analoog signaal. Het maakt het mogelijk om door middel van digitale pulsen het signaal te variëren om een ​​analoog systeem te emuleren, zoals ik al eerder heb opgemerkt. Als je naar de naam kijkt, geeft het je eigenlijk al aanwijzingen van wat het doet, door de breedte van de digitale pulsen.

Dit is gunstig voor Arduino aangezien er veel automatismen of elektronische componenten zijn die u aan uw projecten kunt toevoegen en zo zijn niet in staat om een ​​echt analoog signaal te leveren, maar ze gebruiken deze PWM om te opereren. Ze kunnen ook geen gediscretiseerd analoog signaal gebruiken, dat wil zeggen dat spanningssprongen worden gebruikt om op een digitaal signaal te lijken. Wat ze kunnen doen is een digitale output -Vcc of Vcc van een digitaal type gebruiken om dit eigenaardige signaal te genereren ...

Daarom is PWM een soort "truc" waarmee Arduino en andere systemen kunnen samenwerken met dit soort signalen die ze zijn niet helemaal analoog en ook niet conventioneel digitaal. Om dit mogelijk te maken, houden ze een digitale uitgang een bepaalde tijd actief of uitgeschakeld, afhankelijk van de interesse te allen tijde. Dit is verre van wat een digitale klok of een binair codesignaal zou zijn, waarvan de pulsen dezelfde breedte hebben.

In uw projecten met Arduino kunt u dit type PWM-signalen controleren waarbij een constante frequentie van pulstriggers in de loop van de tijd wordt gehandhaafd, maar de breedte van deze pulsen is gevarieerd. In feite wordt het Duty Cycle genoemd wanneer een signaal hoog wordt gehouden met betrekking tot het totaal van de cyclus. Daarom wordt Duty Cycle gegeven in%.

Onthoud dat je in een PWM niet werkt zoals in een analoog signaal, tussen verschillende spanningswaarden en het fluctueert daartussen. In het geval van PWM is het een vierkant signaal in de digitale stijl en waarvan de maximale waarde Vcc is. Als u bijvoorbeeld met een 3V-voeding werkt, kunt u pulsen van 3V of 0V geven, maar geen 1V of een andere tussenwaarde zoals bij een echte analoog. Wat in dat geval zou variëren, is de pulsbreedte, die we 30% op die hoge Vcc-waarde kunnen houden, of 60% om hem meer vermogen te geven, enz.

Maar wees voorzichtig, want als een apparaat een Vcc-limiet ondersteunt en wordt overschreden met PWM, kan het beschadigd raken. Het zou dus altijd nodig zijn om de waarden van de gegevensbladen van de fabrikanten te respecteren. In sommige apparaten, zoals DC-motoren, relaiselektromagneten, enz. kan een spanningsafname na een inschakelduur betekenen dat inductieve belastingen schade kunnen veroorzaken. Dat is waarom de beveiligingen tijdig.

PWM op Arduino

Arduino I2C-bus

Nu je weet hoe het werkt, laten we eens kijken naar het specifieke geval van PWM in de Arduino-wereld ...

PWM: pinout op Arduino

Op Arduino-boards vind je verschillende pinnen die hardware PWM implementeren. U kunt ze op de print zelf identificeren omdat ze een symbool ~ (klein hoofd) samen met de pincode. Het zou ook kunnen worden gedaan door software in de Arduino-code, maar dat zou de microcontroller overbelasten, iets absurds als het native en door hardware kan worden gedaan ...

  • Arduino UNO, Mini en Nano- Je hebt 6 8-bit PWM-uitgangen op pinnen 3, 5, 6, 9, 10 en 11, die ~ recht voor het nummer zullen hebben.
  • Arduino mega- Op dit krachtigste Arduino-bord heb je 15 8-bit PWM-uitgangen. Ze staan ​​op pinnen 2 t / m 13 en 44 t / m 46.
  • Arduino Duet: in dit geval zijn er 13 8-bit PWM-uitgangen. Ze bevinden zich op pinnen 2 tot 13, plus twee andere analoge uitgangen die worden gediscretiseerd door DAC met 12-bits resolutie.

Als je het hebt over een 8-bits of 12-bits resolutie, enz., In dit type PWM-uitgangen, dan heb je het over de manoeuvreerruimte die je hebt. Met 8 bits hebben 256 niveaus Waartussen u kunt variëren, en de 12 bits gaan tot 4096 niveaus.

Controle met timers

Voor hardware PWM-besturing, Arduino zal de timers gebruiken ervoor. Elke huidige timer kan 2 of 3 PWM-uitgangen bedienen. Een vergelijkingsregister voor elke uitvoer vult dit systeem aan, zodat wanneer de tijd de waarde van het register bereikt, de toestand of waarde van de uitvoer wordt gewijzigd om die Duty Cycles te stoppen. Hoewel er twee uitgangen zijn die worden bestuurd door dezelfde timer, kunnen beide verschillende inschakelduren hebben, hoewel ze dezelfde frequentie delen.

In het geval van de timers die aan elke PWM-pin zijn gekoppeld, zal deze variëren afhankelijk van het type Arduino-bord dat je hebt:

  • Arduino UNO, Mini en Nano:
    • Timer 0 - 5 en 6
    • Timer 1 - 9 en 10
    • Timer 2 - 3 en 11
  • Arduino mega:
    • Timer 0 - 4 en 13
    • Timer 1 - 11 en 12
    • Timer 2 - 9 en 10
    • Timer3 - 2, 3 en 5
    • Timer4 - 6, 7 en 8
    • Timer5 - 44, 45 en 46

Het vooraf ingeschaalde register deelt de tijd door een geheel getal en de timer doet de rest om elk van de bijbehorende PWM-uitgangen te besturen. Het wijzigen van de registerwaarde kan de frequentie wijzigen. De frequentie Ze zullen ook verschillen, afhankelijk van de timer en de plaat:

  • Arduino UNO, Mini en Nano:
    • Timer0: maakt voorinstelling mogelijk van 1, 8, 64, 256 en 1024. De frequentie is 62.5 Khz.
    • Timer1: met voorinstellingen van 1, 8, 64, 256 en 1024. Met een frequentie van 31.25 Khz.
    • Timer2: gelijk aan Timer1, maar voegt naast de voorgaande een voorinstelling van 32 en 128 toe.
  • Arduino mega:
    • Timer0, 1, 2: hetzelfde als hierboven.
    • Timer3, 4 en 5: met een frequentie van 31.25 Khz en vooraf ingesteld op 1, 8, 64, 256 en 1024.

Onverenigbaarheden en conflicten

De timer geassocieerd met de uitgangen is niet alleen voor die functie, wordt ook door anderen gebruikt. Daarom moet u, als ze door een andere functie worden gebruikt, kiezen tussen de ene of de andere, u kunt niet beide tegelijk gebruiken. Dit zijn bijvoorbeeld enkele van de onverenigbaarheden die u in uw projecten kunt vinden:

  • Servo bibliotheek: Wanneer u servomotoren gebruikt, worden timers intensief gebruikt, wat tot conflicten kan leiden. Gebruik specifiek Timer1 voor UNO, Nano en Mini, dat wil zeggen dat u pinnen 9 en 10 niet kunt gebruiken terwijl u een schets met die bibliotheek gebruikt. In Mega hangt het af van het aantal servo's ...
  • SPI: Als SPI-communicatie wordt gebruikt op het Arduino-bord, wordt pin 11 gebruikt voor de MOSI-functie. Daarom kan die PWM-pin niet worden gebruikt.
  • Toon: deze functie gebruikt Timer2 om te werken. Dus als het wordt gebruikt, maakt u pinnen 3 en 11 (of 9 en 10 voor Mega) onbruikbaar.

Praktische test met Arduino

Arduino PWM-schema met LED

Als je ter plaatse wilt zien hoe PWM werkt op Arduino, kun je het beste de meetsnoeren van een voltmeter of multimeter (in functie om spanning te meten) tussen de PWM-pin die je hebt gekozen om te gebruiken en de aardingspin of GND van het Arduino-bord. Op deze manier kun je op het scherm van het meetapparaat zien hoe de spanning verandert met een output die digitaal is dankzij deze PWM-truc.

U kunt de voltmeter / multimeter vervangen door een LED om te zien hoe de intensiteit van het licht varieert, met een DC-motor of met een ander element dat u maar wilt. Ik heb het in het diagram vereenvoudigd met Fritzing met een LED zonder meer, maar weet dat het ook de uiteinden van een multimeter kan vertegenwoordigen ...

Als u een LED gebruikt, onthoud dan de weerstand bij de kathode en GND.

naar de broncode Om de microcontroller van het Arduino-bord te besturen om alles te laten werken, moet je deze in Arduino IDE invoegen (in dit geval heb ik PWM-pin 6 van Arduino UNO):

const int analogOutPin = 6;
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);        
   pinMode(ledPIN , OUTPUT); 
 
   bitSet(DDRB, 5);       // LED o voltímetro
   bitSet(PCICR, PCIE0);       
   bitSet(PCMSK0, PCINT3);     
}
 
void loop() 
{
   if (Serial.available()>0)  
   {
      if(outputValue >= '0' && outputValue <= '9')
      {
         outputValue = Serial.read();   // Leemos la opción
         outputValue -= '0';      // Restamos '0' para convertir a un número
         outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
         analogWrite(ledPIN , outputValue);
      }
   }
}  
 
ISR(PCINT0_vect)
{
   if(bitRead(PINB, 3))
   { 
      bitSet(PORTB, 5);   // LED on 
   }
   else
   { 
      bitClear(PORTB, 5); // LED off  
   } 
} 
Ik raad je aan om met de waarden te spelen en te zien de resultaten op het licht of de voltmeter. Het programma kan waarden van 0 tot 9 ontvangen, zodat u kunt zien hoe alles varieert. Voor meer informatie adviseer ik je de arduino-cursus die we in gratis download hebben ...

Een opmerking, laat de jouwe achter

Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   Jose zei

    Hallo goedendag. Allereerst wil ik u bedanken voor de tijd die is besteed aan deze uitleg voor het nieuwste.
    Ik zou u een vraag willen stellen. Ik probeer de code uit te voeren op een proteus 8-emulator voor Arguino Mega. Ik sluit een voltmeter aan op pin 6, Proteus is verbonden met een seriële poort, maar ik weet niet hoe of wat ik moet variëren, zodat verschillende voltages worden uitgevoerd. Ik moest kleine aanpassingen aan de code maken om deze te laten compileren. Heel erg bedankt voor je hulp