PWM: emulerer analoge pinner med Arduino-kortet

PWM-signaler

Med de digitale og analoge pinnene, som du kan bruke på Arduino-kortet, kan du motta eller sende elektriske signaler for å kontrollere eller innhente data fra dine elektroniske prosjekter. I tillegg er det andre veldig interessante signaler i denne typen plate, og det er de PWM, som kan etterligne et analogt signal uten å være analogt. Det vil si at de er digitale pinner som kan fungere på en lignende måte (ikke det samme) som et analogt signal.

Disse typer signaler er veldig praktiske for når du ikke bare vil bruke digitale HØYE og LAVE signaler, det vil si 1 eller 0, PÅ og AV, men du vil gå videre og beskrive noe mer komplekse signaler. For eksempel er det mulig å modulere hastigheten til a DC-motor, eller lysintensiteten til et lys, for en solenoid, etc.

Analog vs digitalt system

Analog mot digitalt signal

Elektroniske kretser kan deles inn i to store familier eller kategorier: digital og analog. Når vi snakker om digital elektronikk, bruker vi mengder med diskrete verdier, det vil si et binært system representert av elektriske signaler med lav eller høy spenning for å tolke tilstanden til de bitene som håndteres. På den annen side, når det gjelder en analog krets, brukes mengder med kontinuerlige verdier.

Innenfor digitale systemer kan du finne igjen de av kombinasjonstype og de av sekvensiell type. Det vil si at førstnevnte er de der utgangen fra systemet bare avhenger av tilstanden til inngangene. På den annen side, i de sekvensielle, er minneelementer inkludert, og utgangen vil avhenge av den nåværende tilstanden til inngangene og den tidligere lagrede tilstanden.

Når det gjelder analoger, er det ikke disse to store gruppene eller variantene, siden de her er kontinuerlige signaler som alltid vil avhenge av signalet nåværende system. For eksempel, i en høyttaler, vil signalet som blir levert til den avhenge av lyden du vil gjengi. Det samme med en mikrofon, som vil generere et analogt signal avhengig av lyden den mottar. Du har sikkert også sett det med mange andre sensorer som vi har beskrevet i denne bloggen, og som fungerer med analoge signaler (og derfor måtte det opprettes en formel slik at verdiene senere kunne beregnes eller betinges i Arduino IDE-skissene ) ...

Disse egenskapene til det ene og det andre gjør at noen har sine egne fordeler og ulemper, som vanlig i nesten alt. For eksempel er digitale vanligvis billigere, raskere, lettere å utvikle, informasjon kan lagres lettere, de har større nøyaktighet, de kan programmeres, de er ikke like sårbare for effekten av støy, etc. Men det er også sant at med analoger kan du operere med mer komplekse signaler.

av ejemplo, en digital Hall-effektsensor kan bare oppdage nærvær eller fravær av et nærliggende magnetfelt. I stedet kan en analog Hall-effektsensor gjøre det og også bestemme tettheten til nevnte magnetfelt takket være et analogt signal som den genererer ved utgangen. Å vite hvordan du skal tolke signalet med større eller mindre spenning godt, kan du enkelt vite den størrelsen. Du har andre eksempler i et mangfold av naturstørrelser som du kan måle kvantitativt med et analogt system, som temperatur, tid, trykk, avstand, lyd osv.

Analog mot digitalt signal

Når det er sagt, a analogt signal Det vil være en spenning eller elektrisk strøm som varierer med tiden og kontinuerlig. Hvis det er tegnet graf, vil det analoge signalet være en sinusbølge med en frekvens.

Som digitalt signal, er en spenning som varierer trinnvis med hensyn til tid. Det vil si at hvis det er representert i en graf, vil det være et trinnsignal som ikke varierer kontinuerlig, men endres i trinn eller diskrete trinn.

Du bør vite at det er kretser å gå fra et analogt signal til et digitalt signal eller omvendt. Disse omformere de er kjent som DAC (Digital-til-Analog Converter) og ADC (Analog-til-Digital Converter). Og de er veldig vanlige i mange enheter som vi bruker i dag, som TV, datamaskiner osv. Med dem kan du konvertere de digitale signalene som brukes av dette utstyret til et elektronisk nivå for å jobbe med andre eksterne enheter eller deler som fungerer analogt.

av ejemplo, en høyttaler eller mikrofon med analoge signaler som fungerer med et lydkort, eller digitale grafikkort som hadde den berømte RAMDAC-brikken for analoge skjermporter ... I Arduino brukes denne typen omformere også til flere prosjekter, som vi vil se. ..

Hva er PWM?

grafisk driftssyklus

Selv PWM (Pulse-Width Modulation), eller pulsbreddemodulasjon, har en digital base, formen på signalet ligner på et noe "firkantet" analogt signal. Det gjør det mulig ved hjelp av digitale pulser å variere signalet for å etterligne et analogt system som jeg allerede har kommentert tidligere. Faktisk, hvis du ser på navnet, gir det deg allerede ledetråder om hva det gjør, gjennom bredden på de digitale pulser.

Dette er gunstig for Arduino siden det er mange automatismer eller elektroniske komponenter som du kan legge til i prosjektene dine og det ikke er i stand til å gi et ekte analogt signal, men de bruker denne PWM til å operere. De kan heller ikke bruke et diskretisert analogt signal, det vil si som går til spenningshopp for å ligne et digitalt. Det de kan gjøre er å bruke en digital utgang -Vcc eller Vcc av en digital type for å generere dette særegne signalet ...

Derfor er PWM et slags "triks" som Arduino og andre systemer kan samhandle med denne typen signaler som de er ikke helt analoge og heller ikke konvensjonelle digitale. For å gjøre det mulig holder de en digital utgang aktiv i en bestemt tid eller av, avhengig av interessen til enhver tid. Dette er langt fra det som ville være et digitalt klokke- eller binært kodesignal, hvis pulser har samme bredde.

I prosjektene dine med Arduino kan du sjekke denne typen PWM-signaler der en konstant frekvens av pulsutløsere opprettholdes over tid, men bredden på disse pulser er variert. Faktisk kalles det Duty Cycle når et signal holdes høyt i forhold til totalsyklusen. Derfor er driftssyklus gitt i%.

Husk at i en PWM fungerer du ikke som i et analogt signal, mellom flere spenningsverdier, og det svinger mellom dem. I tilfelle av PWM er det et kvadratisk signal i digital stil og hvis maksimale verdi er Vcc. For eksempel, hvis du jobber med en 3V strømforsyning, kan du gi 3V eller 0V pulser, men ikke 1V eller noen annen mellomverdi som ville oppstå i en ekte analog. Det som vil variere i så fall er pulsbredden, som vi kan holde 30% ved den høye Vcc-verdien, eller 60% for å gi den mer kraft osv.

Men vær forsiktig, for hvis en enhet støtter en Vcc-grense og overskrides med PWM, kan den bli skadet. Så det vil alltid være nødvendig å respektere verdiene til databladene som er gitt av produsentene. I noen enheter som DC-motorer, stafetter, elektromagneter osv., kan en spenningsuttak etter en driftssyklus bety at induktive belastninger kan forårsake skade. Det er derfor beskyttelse betimelig.

PWM på Arduino

Arduino I2C buss

Nå som du vet hvordan det fungerer, la oss se det spesifikke tilfellet av PWM i Arduino-verdenen ...

PWM: pinout på Arduino

På Arduino-kort kan du finne flere pinner som implementerer maskinvare PWM. Du kan identifisere dem på PCB-en selv fordi de har en symbol ~ (lite hode) sammen med pin-nummereringen. Det kan også gjøres av programvare i Arduino-koden, men det vil overbelaste mikrokontrolleren med arbeid, noe absurd når det kan gjøres naturlig og med maskinvare ...

  • Arduino UNO, Mini og Nano- Du har 6 8-bits PWM-utganger på pinnene 3, 5, 6, 9, 10 og 11, som vil ha den ~ rett foran nummeret.
  • arduino mega- På dette kraftigste Arduino-kortet har du 15 8-bit PWM-utganger. De er på pinnene 2 til 13 og 44 til 46.
  • Arduino duett: i dette tilfellet er det 13 8-biters PWM-utganger. De er på pinnene 2 til 13, pluss to andre analoge utganger diskretisert av DAC med 12-biters oppløsning.

Når du snakker om en oppløsning på 8 bits eller 12 bits osv., I denne typen PWM-utganger, viser du til handlingsrommet du har. Med 8 bits har 256 nivåer Mellom hvilke du kan variere, og de 12 bitene går opp til 4096 nivåer.

Kontroll med tidtakere

For maskinvare PWM-kontroll, Arduino vil bruke tidtakerne for det. Hver nåværende timer kan tjene 2 eller 3 PWM-utganger. Et sammenligningsregister for hver utgang utfyller dette systemet slik at når tiden når verdien av registeret, blir tilstanden eller verdien til utgangen endret for å stoppe disse driftssyklusene. Selv om det er to utganger som styres av samme timer, kan begge ha forskjellige driftssykluser, selv om de har samme frekvens.

For timere som er tilknyttet hver PWM-pin, vil den variere avhengig av typen Arduino-kort det har du:

  • Arduino UNO, Mini og Nano:
    • Tidtaker0 - 5 og 6
    • Tidtaker1 - 9 og 10
    • Tidtaker2 - 3 og 11
  • arduino mega:
    • Tidtaker0 - 4 og 13
    • Tidtaker1 - 11 og 12
    • Tidtaker2 - 9 og 10
    • Timer3 - 2, 3 og 5
    • Timer4 - 6, 7 og 8
    • Timer5 - 44, 45 og 46

Det forhåndskalkede registeret vil dele tiden med et helt tall, og timeren gjør resten for å kontrollere hver av de tilknyttede PWM-utgangene. Endring av registerverdien kan endre frekvensen. De frekvens De vil også være forskjellige, avhengig av timer og plate:

  • Arduino UNO, Mini og Nano:
    • Timer0: tillater forhåndsskalering av 1, 8, 64, 256 og 1024. Frekvensen er 62.5 Khz.
    • Timer1: med forhåndsinnstillinger på 1, 8, 64, 256 og 1024. Med en frekvens på 31.25 Khz.
    • Timer2: lik Timer1, bare den legger til en forhåndsskalering på 32 og 128 i tillegg til de forrige.
  • arduino mega:
    • Timer0, 1, 2: samme som ovenfor.
    • Timer3, 4 og 5: med frekvens på 31.25 kHz og forhåndskalkulert på 1, 8, 64, 256 og 1024.

Uforenligheter og konflikter

Timeren tilknyttet utgangene er ikke bare for den funksjonen, brukes også av andre. Derfor, hvis de blir brukt av en annen funksjon, må du velge mellom den ene eller den andre, du kan ikke bruke begge samtidig. Dette er for eksempel noen av inkompatibilitetene du kan finne i prosjektene dine:

  • Servobibliotek: Når du bruker servomotorer, brukes tidtakere intensivt, slik at det kan generere konflikter. Bruk spesielt Timer1 for UNO, Nano og Mini, det vil si at du ikke kan bruke pinne 9 og 10 mens du bruker en skisse med det biblioteket. I Mega vil det avhenge av antall servoer ...
  • SPI: Hvis SPI-kommunikasjon brukes på Arduino-kortet, brukes pin 11 til MOSI-funksjonen. Det er derfor den PWM-pinnen ikke kan brukes.
  • Tone: denne funksjonen bruker Timer2 for å betjene. Så hvis den brukes, lager du pinn 3 og 11 (eller 9 og 10 for Mega) ubrukelig.

Praktisk test med Arduino

Arduino PWM-skjema med LED

Hvis du vil se på plass hvordan PWM fungerer på Arduino, er det beste du kan gjøre å koble til måleledningene til en voltmeter eller multimeter (i funksjon for å måle spenning) mellom PWM-pinnen du har valgt å bruke og jordpinnen eller GND på Arduino-kortet. På denne måten vil du på skjermen til måleenheten kunne se hvordan spenningen endres med en utgang som er digital takket være dette PWM-trikset.

Du kan erstatte voltmeter / multimeter med en LED for å se hvordan intensiteten på lyset varierer, med en DC-motor eller med et hvilket som helst annet element du vil ha. Jeg har forenklet det i diagrammet med Fritzing med en LED uten mer, men du vet at det også kan representere tipsene til et multimeter ...

Hvis du bruker en LED, må du huske motstanden ved katoden og GND.

Til kildekoden For å kontrollere mikrokontrolleren på Arduino-kortet for å få alt til å fungere, bør du sette dette inn i Arduino IDE (i dette tilfellet har jeg brukt PWM pin 6 av 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  
   } 
} 
Jeg anbefaler deg å leke med verdiene og se resultatene på lyset eller voltmeteret. Programmet kan motta verdier fra 0 til 9 slik at du kan se hvordan alt varierer. For mer informasjon, anbefaler jeg deg arduino-kurset som vi har i gratis nedlasting ...

En kommentar, legg igjen din

Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   Jose sa

    Hei, god dag. Først og fremst vil jeg takke deg for tiden som er viet til denne forklaringen for den nyeste.
    Jeg vil gjerne gjøre deg et spørsmål. Jeg prøver å kjøre koden på en proteus 8-emulator for Arguino Mega. Jeg kobler et voltmeter til pin 6, Proteus er koblet til en seriell port, men jeg vet ikke hvordan eller hva jeg skal variere slik at forskjellige spenninger kommer ut. Jeg måtte gjøre mindre justeringer av koden for å få den til å kompilere. Tusen takk for hjelpen