PWM: duke imituar kunjat analoge me bordin tuaj Arduino

Sinjalet PWM

Me kunjat dixhitalë dhe analogë, të cilët mund të përdorni në bordin tuaj Arduino, ju mund të merrni ose dërgoni sinjale elektrike për të kontrolluar ose për të marrë të dhëna nga projektet tuaja elektronike. Përveç kësaj, ka sinjale të tjerë shumë interesantë në këtë lloj pllake, dhe ato janë ato PWM, që mund të imitojë një sinjal analog pa qenë realisht analog. Kjo është, ato janë kunja dixhitale që mund të veprojnë në një mënyrë të ngjashme (jo të njëjtë) si një sinjal analog.

Këto lloje të sinjaleve janë shumë praktike kur nuk dëshironi të përdorni vetëm sinjale dixhitalë të LART and dhe të ULOWT, pra 1 ose 0, ON dhe OFF, por ju doni të shkoni më tej dhe të përshkruani sinjale disi më komplekse. Për shembull, është e mundur të modulohet shpejtësia e a Motor DC, ose intensiteti i dritës së një drite, për një solenoid, etj.

Sistemi analog vs dixhital

Sinjali analog vs dixhital

Qarqet elektronike mund të ndahen në dy familje ose kategori të mëdha: dixhital dhe analog. Kur flasim për elektronikën dixhitale, ne po përdorim sasi me vlera diskrete, domethënë një sistem binar të përfaqësuar nga sinjale elektrike të një tensioni të ulët ose të lartë për të interpretuar gjendjen e atyre bitëve që trajtohen. Nga ana tjetër, kur bëhet fjalë për një qark analog, po përdoren sasi me vlera të vazhdueshme.

Brenda sistemeve dixhitale mund të gjenden nga ana e tyre ato të tipit kombinues dhe ato të tipit sekuencial. Kjo do të thotë, të parët janë ato në të cilat dalja e sistemit varet vetëm nga gjendja e inputeve. Nga ana tjetër, në ato sekuenciale, përfshihen elementet e kujtesës, dhe dalja do të varet nga gjendja aktuale e hyrjeve dhe gjendja e mëparshme e ruajtur.

Në rastin e analogëve nuk ka këto dy grupe ose variante të mëdha, pasi këtu ato janë sinjale të vazhdueshme që gjithmonë do të varen nga sinjalin sistemi aktual. Për shembull, në një altoparlant, sinjali që furnizoni varet nga tingulli që dëshironi të riprodhoni. E njëjta gjë me një mikrofon, i cili do të gjenerojë një sinjal analog në varësi të tingullit që po merr. Me siguri ju e keni parë atë me shumë sensorë të tjerë që ne kemi përshkruar në këtë blog dhe që veprojnë me sinjale analoge (dhe për këtë arsye, një formulë duhej të krijohej në mënyrë që më vonë vlerat të llogariteshin ose të kushtëzoheshin në skicat Arduino IDE ) ...

Këto karakteristika të njërës dhe tjetrës bëjnë që disa të kenë të vetat avantazhet dhe disavantazhet, si zakonisht në pothuajse gjithçka. Për shembull, ato dixhitale priren të jenë më të lira, më të shpejta, më të lehta për tu zhvilluar, informacioni mund të ruhet më lehtë, kanë saktësi më të madhe, mund të programohen, nuk janë aq të prekshëm nga efektet e zhurmës, etj. Por është gjithashtu e vërtetë që me analogët mund të funksiononi me sinjale më komplekse.

Por Ejemplo, një sensor dixhital i efektit Hall mund të zbulojë vetëm praninë ose mungesën e një fushe magnetike aty pranë. Në vend të kësaj, një sensor analog i efektit Hall mund ta bëjë këtë dhe gjithashtu të përcaktojë dendësinë e fushës magnetike të përmendur në sajë të një sinjali analog që gjeneron në daljen e tij. Duke ditur se si të interpretohet mirë ai sinjal i tensionit të lartë ose të ulët, ju lehtë mund ta dini atë madhësi. Ju keni shembuj të tjerë në një mori madhësish të natyrës që mund t'i matni në mënyrë sasiore me një sistem analog, të tilla si temperatura, koha, presioni, distanca, tingulli, etj.

Sinjali analog vs dixhital

Kjo u tha, a sinjali analog Do të jetë një tension ose rrymë elektrike që ndryshon me kohën dhe vazhdimisht. Nëse grafikohet, sinjali analog do të jetë një valë sinusit me një frekuencë të vetme.

Si sinjal dixhital, është një tension që ndryshon në një mënyrë hap pas hapi në lidhje me kohën. Kjo do të thotë, nëse përfaqësohet në një grafik, do të jetë një sinjal hapi që nuk ndryshon vazhdimisht, por ndryshon në hapa ose rritje diskrete.

Duhet ta dini se ka qarqe për të kaluar nga një sinjal analog në një dixhital ose anasjelltas. Këto konvertuesit ato njihen si DAC (Konvertuesi dixhital në analog) dhe ADC (konvertuesi analog në dixhital). Dhe ato janë shumë të zakonshme në shumë pajisje që ne përdorim sot, të tilla si TV, kompjutera, etj. Me to mund të shndërroni sinjalet dixhitale të përdorura nga këto pajisje në një nivel elektronik për të punuar me pajisje të tjera periferike ose pjesë që punojnë në mënyrë analoge.

Por Ejemplo, një altoparlant ose mikrofon me sinjale analoge që punon me një kartë zanore, ose karta grafike dixhitale që kishin çipin e famshëm RAMDAC për portat e monitorit analoge ... Në Arduino ky lloj konvertuesish përdoret gjithashtu për shumë projekte, siç do të shohim. ..

Çfarë është PWM?

cikli grafik i detyrave

Megjithëse PWM (Modulimi i Gjerësisë së Pulsit), ose modulimi i gjerësisë së impulsit, ka një bazë dixhitale, forma e sinjalit të saj i ngjan një sinjali analog disi "katror". Kjo lejon që me anë të impulseve dixhitale të ndryshojnë sinjalin për të imituar një sistem analog siç kam komentuar më parë. Në fakt, nëse shikoni emrin, ai tashmë ju jep të dhëna se çfarë bën, përmes gjerësisë së impulseve dixhitale.

Kjo është e dobishme për Arduino meqenëse ka shumë automatizma ose përbërës elektronikë që mund t’i shtoni në projektet tuaja dhe atë nuk janë të aftë të sigurojnë një sinjal të vërtetë analoge, por ata e përdorin këtë PWM për të vepruar. As nuk mund të përdorin një sinjal analog të diskretizuar, domethënë, që shkon në kërcime të tensionit për t'u ngjajtur me një dixhital. Ajo që ata mund të bëjnë është të përdorin një dalje dixhitale -Vcc ose Vcc të një lloji dixhital për të gjeneruar këtë sinjal të veçantë ...

Prandaj, PWM është një lloj "truku" me të cilin Arduino dhe sistemet e tjerë mund të ndërveprojnë me këtë lloj sinjali që ato nuk janë mjaft analoge dhe as nuk janë dixhitale konvencionale. Për ta bërë të mundur, ata mbajnë një dalje dixhitale aktive për një kohë të caktuar ose jashtë, në varësi të interesit në çdo kohë. Ky është larg asaj që do të ishte një orë dixhitale ose sinjal i kodit binar, impulset e të cilit kanë të njëjtën gjerësi.

Në projektet tuaja me Arduino mund të kontrolloni këtë lloj sinjalesh PWM në të cilat një frekuencë konstante e nxitësve të impulsit ruhet me kalimin e kohës, por gjerësia e këtyre impulseve është e larmishme. Në fakt, quhet Cikli i Detyrës kur një sinjal mbahet i lartë në lidhje me totalin e ciklit. Prandaj, Cikli i Detyrës jepet në%.

Mos harroni se në një PWM nuk punoni si në një sinjal analog, midis disa vlerave të tensionit dhe luhatet midis tyre. Në rastin e PWM është një sinjal katror në stilin dixhital dhe vlera maksimale e të cilit është Vcc. Për shembull, nëse punoni me një furnizim me energji 3V, mund të jepni impulse 3V ose 0V, por jo 1V ose ndonjë vlerë tjetër të ndërmjetme siç do të ndodhte në një analog të vërtetë. Ajo që do të ndryshonte në atë rast është gjerësia e pulsit, të cilën ne mund ta mbajmë 30% në atë vlerë të lartë të Vcc, ose 60% për t'i dhënë asaj më shumë energji, etj.

Por kini kujdes, sepse nëse një pajisje mbështet një kufi të Vcc dhe tejkalohet me PWM, mund të dëmtohet. Kështu që gjithmonë do të ishte e nevojshme të respektojmë vlerat e fletëve të të dhënave të dhëna nga prodhuesit. Gjithashtu, në disa pajisje të tilla si motorët DC, stafetë, elektromagnet, etj., tërheqja e tensionit pas një Cikli Detyre mund të nënkuptojë që ngarkesat induktive mund të shkaktojnë dëme. Kjo është arsyeja pse mbrojtje në kohë

PWM në Arduino

Autobusi Arduino I2C

Tani që e dini se si funksionon, le të shohim rastin specifik të PWM brenda botës Arduino ...

PWM: pinout në Arduino

Në bordet Arduino mund të gjeni disa kunja që implementojnë harduerin PWM. Ju mund t'i identifikoni ato në vetë PCB sepse ato kanë një simbol ~ (kokë e vogël) së bashku me numërimin e kunjave. Mund të bëhet gjithashtu nga softueri në kodin Arduino, por kjo do të mbingarkonte mikrokontrolluesin me punë, diçka absurde kur mund të bëhet në vendlindje dhe me pajisje ...

  • Arduino UNO, Mini dhe Nano- Keni 6 dalje 8-bitëshe PWM në kunjat 3, 5, 6, 9, 10 dhe 11, të cilat do ta kenë atë ~ përpara numrit.
  • Mega Arduino- Në këtë bord më të fuqishëm Arduino keni 15 rezultate 8-bit PWM. Ata janë në kunjat 2 deri në 13 dhe 44 deri në 46.
  • Duet Arduino: në këtë rast ka 13 dalje 8-bit PWM. Ato janë në kunjat 2 deri në 13, plus dy dalje të tjera analoge të diskretizuara nga DAC me rezolucion 12-bit.

Kur flisni për një rezolucion prej 8 bit ose 12 bit, etj., Në këtë lloj të daljeve PWM, ju i referoheni hapësirës për manovër që keni. Me 8 bit kanë 256 nivele Midis të cilave ju mund të ndryshoni, dhe 12 bitët shkojnë deri në 4096 nivele.

Kontrolloni me kohëmatës

Për kontrollin e pajisjeve PWM, Arduino do të përdorin kohëmatësit për atë. Çdo kohëmatës aktual mund të shërbejë 2 ose 3 rezultate PWM. Një regjistër krahasimi për secilin prodhim plotëson këtë sistem në mënyrë që kur koha të arrijë vlerën e regjistrit, gjendja ose vlera e prodhimit të ndryshohet për të ndaluar ato Ciklet e Detyrës. Megjithëse ekzistojnë dy rezultate të kontrolluara nga i njëjti Kohëmatës, të dy mund të kenë Cikle Detyre të ndryshme, megjithëse ndajnë të njëjtën frekuencë.

Në rastin e Timerëve të lidhur me secilin pin PWM, ai do të ndryshojë në varësi të llojit të bordit Arduino që ti ke:

  • Arduino UNO, Mini dhe Nano:
    • Kohëmatësi0 - 5 dhe 6
    • Kohëmatësi1 - 9 dhe 10
    • Kohëmatësi2 - 3 dhe 11
  • Mega Arduino:
    • Kohëmatësi0 - 4 dhe 13
    • Kohëmatësi1 - 11 dhe 12
    • Kohëmatësi2 - 9 dhe 10
    • Kohëmatësi3 - 2, 3 dhe 5
    • Kohëmatësi4 - 6, 7 dhe 8
    • Kohëmatësi5 - 44, 45 dhe 46

Regjistri i preskaluar do të ndajë kohën me një numër të plotë dhe kohëmatësi bën pjesën tjetër për të kontrolluar secilin prej rezultateve shoqëruese të PWM. Modifikimi i vlerës së regjistrit mund të ndryshojë frekuencën. frekuencë Ata gjithashtu do të jenë të ndryshëm në varësi të Kohëmatësit dhe pllakës:

  • Arduino UNO, Mini dhe Nano:
    • Timer0: lejon parashkallëzimin e 1, 8, 64, 256 dhe 1024. Frekuenca është 62.5 Khz.
    • Timer1: me paravendosje prej 1, 8, 64, 256 dhe 1024. Me një frekuencë prej 31.25 Khz.
    • Kohëmatësi2: i barabartë me Kohëmatësi1, vetëm se ai gjithashtu shton një parashkallëzim prej 32 dhe 128 përveç atyre të mëparshëm.
  • Mega Arduino:
    • Kohëmatësi0, 1, 2: njëlloj si më sipër.
    • Kohëmatësi3, 4 dhe 5: me frekuencë 31.25 Khz dhe preskaluar prej 1, 8, 64, 256 dhe 1024.

Papajtueshmëritë dhe konfliktet

Kohëmatësi e lidhur me rezultatet nuk është vetëm për atë funksion, përdoret gjithashtu nga të tjerët. Prandaj, nëse ato po përdoren nga një funksion tjetër, duhet të zgjidhni midis njërit ose tjetrit, nuk mund t'i përdorni të dy në të njëjtën kohë. Për shembull, këto janë disa nga papajtueshmëritë që mund të gjeni në projektet tuaja:

  • Biblioteka servo: Kur përdorni ndihmës motorë, kohëmatësit përdoren intensivisht, gjë që mund të çojë në konflikte. Në mënyrë të veçantë përdorni Timer1 për UNO, Nano dhe Mini, domethënë nuk mund të përdorni kunjat 9 dhe 10 ndërsa jeni duke përdorur një skicë me atë bibliotekë. Në Mega do të varet nga numri i shërbimeve ...
  • SPI: Nëse përdoret komunikimi SPI në bordin Arduino, po përdoret pin 11 për funksionin MOSI. Kjo është arsyeja pse ajo pin PWM nuk mund të përdoret.
  • Ton: ky funksion përdor Timer2 për të vepruar. Pra, nëse përdoret, ju po i bëni kunjat 3 dhe 11 (ose 9 dhe 10 për Mega) të padobishme.

Provë praktike me Arduino

Skema skematike Arduino PWM me LED

Nëse dëshironi të shihni në vend se si funksionon PWM në Arduino, gjëja më e mirë që mund të bëni është të lidhni drejtuesit e matjes së një voltmetër ose multimetër (në funksion për të matur tensionin) midis kunjit PWM që keni zgjedhur të përdorni dhe kunjit tokësor ose GND të bordit Arduino. Në këtë mënyrë, në ekranin e pajisjes matëse do të mund të shihni se si voltazhi po ndryshon me një dalje dixhitale falë këtij mashtrimi PWM.

Ju mund ta zëvendësoni voltmetrin / multimetrin me një LED për të parë se si ndryshon intensiteti i dritës, me një motor DC ose me ndonjë element tjetër që dëshironi. Unë e kam thjeshtuar atë në diagramin me Fritzing me një LED pa më shumë, por dije se ai gjithashtu mund të përfaqësojë majat e një multimetër ...

Nëse përdorni një LED, mos harroni rezistencën në katodë dhe GND.

kodin burimor Për të kontrolluar mikrokontrolluesin e bordit Arduino për të bërë që gjithçka të funksionojë, duhet ta fusni këtë në Arduino IDE (në këtë rast unë kam përdorur PWM pin 6 të 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  
   } 
} 
Unë ju këshilloj të luani me vlerat dhe të shihni rezultatet në dritë ose voltmetër. Programi mund të marrë vlera nga 0 në 9 kështu që ju mund të shihni se si gjithçka ndryshon. Për më shumë informacion, unë ju këshilloj kursi arduino që kemi në shkarkim falas ...

Një koment, lëre tuajën

Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: Miguel Ángel Gatón
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.

  1.   Jose dijo

    Pershendetje dite e mire Së pari dua t'ju falënderoj për kohën e kushtuar këtij shpjegimi për më të rejat.
    Do të doja të të bëja një pyetje. Po përpiqem të ekzekutoj kodin në një emulator të proteus 8 për Arguino Mega. Unë lidh një voltmetër në pin 6, Proteus është i lidhur me një port serik, por nuk e di se si dhe çfarë të ndryshojë në mënyrë që të dalin tensione të ndryshme. Unë duhej të bëja rregullime të vogla në kod për ta bërë atë përpilues. Ju falënderoj shumë për ndihmën tuaj