PWM: emulering af analoge ben med dit Arduino-kort

PWM-signaler

Med de digitale og analoge stifter, som du kan bruge på dit Arduino-kort, kan du modtage eller sende elektriske signaler for at kontrollere eller hente data fra dine elektroniske projekter. Derudover er der andre meget interessante signaler i denne type plader, og de er de PWM, der kan efterligne et analogt signal uden faktisk at være analogt. Det vil sige, de er digitale ben, der kan virke på samme måde (ikke det samme) som et analogt signal.

Disse typer signaler er meget praktiske, når du ikke kun vil bruge digitale HIGH og LOW signaler, det vil sige 1 eller 0, ON og OFF, men du vil gå videre og beskrive noget mere komplekse signaler. For eksempel er det muligt at modulere hastigheden på a DC-motor, eller lysets intensitet til en solenoid osv.

Analog vs digitalt system

Analog versus digitalt signal

Elektroniske kredsløb kan opdeles i to store familier eller kategorier: digital og analog. Når vi taler om digital elektronik, bruger vi mængder med diskrete værdier, det vil sige et binært system repræsenteret af elektriske signaler med lav eller høj spænding til at fortolke tilstanden for de bit, der håndteres. På den anden side, når det kommer til et analogt kredsløb, anvendes mængder med kontinuerlige værdier.

Inden for digitale systemer kan man finde igen de af kombinationstype og de af sekventiel type. Det vil sige, førstnævnte er dem, hvor output fra systemet kun afhænger af tilstanden af ​​input. På den anden side er i hukommelseselementerne inkluderet hukommelseselementer, og udgangen afhænger af den aktuelle tilstand for indgangene og den tidligere lagrede tilstand.

I tilfælde af analoger er der ikke disse to store grupper eller varianter, da de her er kontinuerlige signaler, der altid vil afhænge af signalet nuværende system. For eksempel afhænger signalet, der tilføres i en højttaler, af den lyd, du vil gengive. Det samme med en mikrofon, der genererer et analogt signal afhængigt af den lyd, den modtager. Du har helt sikkert også set det med mange andre sensorer, som vi har beskrevet i denne blog, og som fungerer med analoge signaler (og derfor skulle der oprettes en formel, så værdierne senere kunne beregnes eller konditioneres i Arduino IDE-skitser ) ...

Disse egenskaber ved den ene og den anden får nogle til at have deres egne fordele og ulempersom normalt i næsten alt. For eksempel er digitale normalt billigere, hurtigere, lettere at udvikle, information kan gemmes lettere, de har større nøjagtighed, de kan programmeres, de er ikke så sårbare over for støjeffekter osv. Men det er også rigtigt, at med analoger kan du betjene med mere komplekse signaler.

Ved ejemplo, kan en digital Hall-effektføler kun registrere tilstedeværelsen eller fraværet af et nærliggende magnetfelt. I stedet kan en analog Hall-effektsensor gøre det og også bestemme densiteten af ​​magnetfeltet takket være et analogt signal, som det genererer ved dets output. At vide, hvordan man fortolker signalet med større eller mindre spænding godt, kan du let kende den størrelsesorden. Du har andre eksempler i en lang række naturstørrelser, som du kan måle kvantitativt med et analogt system, såsom temperatur, tid, tryk, afstand, lyd osv.

Analog versus digitalt signal

Når det er sagt, a analogt signal Det vil være en spænding eller elektrisk strøm, der varierer med tiden og kontinuerligt. Hvis der tegnes graf, ville det analoge signal være en sinusbølge med en enkelt frekvens.

Som for digitalt signal, er en spænding, der varierer trinvis med hensyn til tid. Det vil sige, at hvis det er repræsenteret på en graf, vil det være et trin signal, der ikke varierer kontinuerligt, men ændringer i trin eller diskrete intervaller.

Du skal vide, at der er kredsløb, der skal gå fra et analogt signal til et digitalt signal eller omvendt. Disse konvertere de er kendt som DAC (Digital-til-Analog Converter) og ADC (Analog-til-Digital Converter). Og de er meget almindelige i mange enheder, som vi bruger i dag, såsom tv, computere osv. Med dem kan du konvertere de digitale signaler, der bruges af dette udstyr, til et elektronisk niveau for at arbejde med andet perifert udstyr eller dele, der fungerer analogt.

Ved ejemplo, en højttaler eller mikrofon med analoge signaler, der fungerer med et lydkort eller digitale grafikkort, der havde den berømte RAMDAC-chip til de analoge skærmporte ... I Arduino bruges denne type konvertere også til flere projekter, som vi vil se ...

Hvad er PWM?

grafisk driftscyklus

Skønt PWM (pulsbreddemodulation) eller pulsbreddemodulation, har en digital base, formen på signalet ligner et noget "firkantet" analogt signal. Det giver mulighed for ved hjælp af digitale impulser at variere signalet for at emulere et analogt system, som jeg allerede har kommenteret tidligere. Faktisk, hvis du ser på navnet, giver det dig allerede spor af, hvad det gør gennem bredden af ​​de digitale impulser.

Dette er gavnligt for Arduino da der er mange automatismer eller elektroniske komponenter, som du kan tilføje til dine projekter og det ikke er i stand til at levere et ægte analogt signal, men de bruger denne PWM til at fungere. De kan heller ikke bruge et diskretiseret analogt signal, det vil sige, der går til spændingsspring for at ligne et digitalt signal. Hvad de kan gøre er at bruge et digitalt output -Vcc eller Vcc af en digital type til at generere dette ejendommelige signal ...

Derfor er PWM et slags "trick", hvormed Arduino og andre systemer kan interagere med denne type signaler, der de er ikke helt analoge og heller ikke konventionelle digitale. For at gøre det muligt holder de et digitalt output aktivt i en bestemt tid eller slukket, afhængigt af interessen til enhver tid. Dette er langt fra hvad der ville være et digitalt ur eller binært kodesignal, hvis impulser har samme bredde.

I dine projekter med Arduino kan du kontrollere denne type PWM-signaler, hvor en konstant frekvens af pulsudløsere opretholdes over tid, men bredden af ​​disse impulser varieres. Faktisk kaldes det Duty Cycle, når et signal holdes højt i forhold til den samlede cyklus. Derfor er toldcyklus angivet i%.

Husk, at i en PWM fungerer du ikke som i et analogt signal mellem flere spændingsværdier, og det svinger mellem dem. I tilfælde af PWM er det et firkantet signal i digital stil og hvis maksimale værdi er Vcc. For eksempel, hvis du arbejder med en 3V strømforsyning, kan du give 3V eller 0V impulser, men ikke 1V eller nogen anden mellemværdi, som ville forekomme i en reel analog. Hvad der i så fald vil variere er pulsbredden, som vi kan holde 30% ved den høje Vcc-værdi eller 60% for at give den mere strøm osv.

Men vær forsigtig, for hvis en enhed understøtter en Vcc-grænse og overskrides med PWM, kan den blive beskadiget. Så det ville altid være nødvendigt at respektere værdierne for databladene, der leveres af producenterne. Også i nogle enheder såsom jævnstrømsmotorer, relæer, elektromagneter osv., kan en spændingsafbrydelse efter en driftscyklus betyde, at induktive belastninger kan forårsage skader. Det er derfor beskyttelser rettidigt.

PWM på Arduino

Arduino I2C bus

Nu hvor du ved, hvordan det fungerer, lad os se det specifikke tilfælde af PWM inden for Arduino-verdenen ...

PWM: pinout på Arduino

På Arduino-kort kan du finde flere ben, der implementerer hardware PWM. Du kan identificere dem på selve printkortet, fordi de har en symbol ~ (lille hoved) sammen med pin nummerering. Det kunne også gøres med software i Arduino-koden, men det ville overbelaste mikrocontrolleren, noget absurd, når det kan gøres indbygget og med hardware ...

  • Arduino UNO, Mini og Nano- Du har 6 8-bit PWM-udgange på ben 3, 5, 6, 9, 10 og 11, som har den ~ lige foran nummeret.
  • Mega Arduino- På dette mest kraftfulde Arduino-kort har du 15 8-bit PWM-udgange. De er på ben 2 til 13 og 44 til 46.
  • Arduino Duet: i dette tilfælde er der 13 8-bit PWM-udgange. De er på ben 2 til 13 plus to andre analoge udgange diskretiseret af DAC med 12-bit opløsning.

Når du taler om en opløsning på 8 bit eller 12 bit osv. I denne type PWM-udgange henviser du til det manøvrerum, du har. Med 8 bits har 256 niveauer Mellem hvilken du kan variere, og de 12 bits går op til 4096 niveauer.

Kontrol med timere

For hardware PWM-kontrol, Arduino bruger timerne for det. Hver nuværende timer kan tjene 2 eller 3 PWM-udgange. Et sammenligningsregister for hvert output supplerer dette system, så når tiden når værdien af ​​registret, ændres output eller tilstand for output for at stoppe disse driftscyklusser. Selvom der er to udgange, der styres af den samme timer, kan begge have forskellige driftscyklusser, selvom de deler den samme frekvens.

I tilfælde af timere, der er knyttet til hver PWM-pin, vil den variere afhængigt af typen af ​​Arduino-kort at du har:

  • Arduino UNO, Mini og Nano:
    • Timer0 - 5 og 6
    • Timer1 - 9 og 10
    • Timer2 - 3 og 11
  • Mega Arduino:
    • Timer0 - 4 og 13
    • Timer1 - 11 og 12
    • Timer2 - 9 og 10
    • Timer3 - 2, 3 og 5
    • Timer4 - 6, 7 og 8
    • Timer5 - 44, 45 og 46

Det forudskalrede register opdeler tiden med et heltal, og timeren gør resten for at kontrollere hver af de tilknyttede PWM-udgange. Ændring af registreringsværdien kan ændre frekvensen. Det frekvens De vil også være forskellige afhængigt af timeren og pladen:

  • Arduino UNO, Mini og Nano:
    • Timer0: tillader forudskalning af 1, 8, 64, 256 og 1024. Frekvensen er 62.5 Khz.
    • Timer1: med forudskaleret 1, 8, 64, 256 og 1024. Med en frekvens på 31.25 Khz.
    • Timer2: svarer til Timer1, kun den tilføjer en forskalning på 32 og 128 ud over de foregående.
  • Mega Arduino:
    • Timer0, 1, 2: samme som ovenfor.
    • Timer3, 4 og 5: med frekvens på 31.25 Khz og forudskalret til 1, 8, 64, 256 og 1024.

Uforeneligheder og konflikter

Timeren forbundet med udgangene er ikke kun for den funktion, bruges også af andre. Derfor, hvis de bruges af en anden funktion, skal du vælge mellem den ene eller den anden, du kan ikke bruge begge på samme tid. For eksempel er dette nogle af de inkompatibiliteter, du kan finde i dine projekter:

  • Servobibliotek: Når du bruger servomotorer, bruges timere intensivt, så det kan generere konflikter. Brug specifikt Timer1 til UNO, Nano og Mini, det vil sige, du kan ikke bruge ben 9 og 10, mens du bruger en skitse med dette bibliotek. I Mega vil det afhænge af antallet af servoer ...
  • SPI: Hvis der bruges SPI-kommunikation på Arduino-kortet, bruges ben 11 til MOSI-funktionen. Derfor kan denne PWM-pin ikke bruges.
  • Tone: denne funktion bruger Timer2 til at betjene. Så hvis det bruges, gør du ben 3 og 11 (eller 9 og 10 for Mega) ubrugelige.

Praktisk test med Arduino

Arduino PWM-skema med LED

Hvis du vil se på stedet, hvordan PWM fungerer på Arduino, er det bedste, du kan gøre, at forbinde målekablerne til en voltmeter eller multimeter (i funktion til måling af spænding) mellem PWM-stiften, som du har valgt at bruge, og jordstiften eller GND på Arduino-kortet. På denne måde vil du på måleenhedens skærm kunne se, hvordan spændingen ændrer sig med et output, der er digitalt takket være dette PWM-trick.

Du kan udskifte voltmeter / multimeter med en LED for at se, hvordan lysets intensitet varierer, med en jævnstrømsmotor eller med ethvert andet element, du ønsker. Jeg har forenklet det i diagrammet med Fritzing med en LED uden mere, men ved, at det også kan repræsentere spidserne på et multimeter ...

Hvis du bruger en LED, skal du huske modstanden ved katoden og GND.

til kildekoden For at kontrollere Arduino-kortets mikrocontroller for at få alt til at fungere, skal du indsætte dette i Arduino IDE (i dette tilfælde har jeg brugt PWM pin 6 af 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 råder dig til at lege med værdierne og se resultaterne på lyset eller voltmeteret. Programmet kan modtage værdier fra 0 til 9, så du kan se, hvordan alt varierer. For mere information, anbefaler jeg dig Arduino kurset som vi har i gratis download ...

En kommentar, lad din

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   Jose sagde han

    Hej Goddag. Først og fremmest vil jeg takke dig for den tid, der er afsat til denne forklaring for den nyeste.
    Jeg vil gerne stille dig en forespørgsel. Jeg prøver at køre koden på en proteus 8-emulator til Arguino Mega. Jeg forbinder et voltmeter til pin 6, Proteus er forbundet til en seriel port, men jeg ved ikke, hvordan eller hvad jeg skal variere, så forskellige spændinger udsendes. Jeg var nødt til at foretage mindre justeringer af koden for at få den til at kompilere. Mange tak for din hjælp