PWM: gumagaya ng mga analog na pin sa iyong Arduino board

Mga signal ng PWM

Gamit ang mga digital at analog na pin, na maaari mong gamitin sa iyong Arduino board, maaari kang makatanggap o magpadala ng mga signal ng elektrisidad upang makontrol o makakuha ng data mula sa iyong mga elektronikong proyekto. Bilang karagdagan, may iba pang mga kawili-wiling mga signal sa ganitong uri ng plato, at iyon ang PWM, na maaaring gayahin ang isang analog signal nang hindi tunay na analog. Iyon ay, ang mga ito ay mga digital na pin na maaaring kumilos sa isang katulad na paraan (hindi pareho) bilang isang analog signal.

Ang mga uri ng signal na ito ay napaka praktikal para sa kung hindi mo nais na gumamit ng mga digital na HIGH at LOW signal, iyon ay, 1 o 0, ON at OFF, ngunit nais mong pumunta sa karagdagang at ilarawan medyo mas kumplikadong mga signal. Halimbawa, ang bilis ng a DC motor, o ang tindi ng ilaw ng isang ilaw, para sa isang solenoid, atbp.

Analog vs digital system

Analog vs digital signal

Ang mga electronic circuit ay maaaring nahahati sa dalawang malalaking pamilya o kategorya: digital at analog. Kapag pinag-uusapan ang tungkol sa mga digital electronics, gumagamit kami ng mga dami na may mga discrete na halaga, iyon ay, isang sistemang binary na kinakatawan ng mga de-koryenteng signal ng isang mababa o mataas na boltahe upang bigyang kahulugan ang estado ng mga piraso na pinangangasiwaan. Sa kabilang banda, pagdating sa isang analog circuit, ginagamit ang mga dami na may tuloy-tuloy na halaga.

Sa loob ng mga digital na system ay matatagpuan sa pagliko yaong sa uri ng kombinasyon at ng mga sunud-sunod na uri. Iyon ay, ang una ay ang mga kung saan ang output ng system ay nakasalalay lamang sa estado ng mga input. Sa kabilang banda, sa mga sunud-sunod, ang mga elemento ng memorya ay kasama, at ang output ay nakasalalay sa kasalukuyang estado ng mga input at sa dating estado na nakaimbak.

Sa kaso ng mga analog ay hindi ang dalawang malalaking pangkat o iba, dahil dito sila ay tuloy-tuloy na signal na palaging maaasahan ang signal kasalukuyang sistema. Halimbawa, sa isang loudspeaker, ang signal na ibinibigay dito ay nakasalalay sa tunog na nais mong muling gawin. Pareho sa isang mikropono, na makakabuo ng isang analog signal depende sa tunog na natatanggap. Tiyak na nakita mo rin ito sa maraming iba pang mga sensor na inilarawan namin sa blog na ito at kumikilos na may mga analog signal (at samakatuwid, ang isang pormula ay kailangang likhain upang sa paglaon ang mga halaga ay maaaring makalkula o makondisyon sa mga sketch ng Arduino IDE ) ...

Ang mga katangiang ito ng isa at ng iba pa ay may ilan sa kanila kalamangan at dehado, tulad ng dati sa halos lahat. Halimbawa Ngunit totoo rin na sa mga analog na maaari kang gumana ng mas kumplikadong mga signal.

Por ejemplo, ang isang digital na uri ng Hall effect sensor ay makakakita lamang ng pagkakaroon o kawalan ng isang kalapit na magnetic field. Sa halip, maaaring gawin iyon ng isang sensor ng sensor ng Hall Hall at matutukoy din ang density ng nasabing magnetic field salamat sa isang analog signal na bumubuo sa output nito. Alam kung paano mabibigyang kahulugan ang senyas na iyon ng mas malaki o mas kaunting boltahe nang mahusay, madali mong malalaman ang lakas na iyon. Ang iba pang mga halimbawa mayroon ka sa maraming mga magnitude ng kalikasan na maaari mong sukatin ang dami sa isang analog system, tulad ng temperatura, oras, presyon, distansya, tunog, atbp.

Analog vs digital signal

Sinasabi na, a signal ng analog Ito ay magiging isang boltahe o kuryente na kasalukuyang nag-iiba-iba sa oras at tuloy-tuloy. Kung graphed, ang analog signal ay magiging isang solong dalas ng alon ng sine.

Bilang ang digital signal, ay isang boltahe na nag-iiba sa isang hakbang na pamamaraan na may paggalang sa oras. Iyon ay, kung ito ay kinakatawan sa isang graph, ito ay magiging isang signal ng hakbang na hindi patuloy na nag-iiba, ngunit ang mga pagbabago sa mga hakbang o discrete na pagtaas.

Dapat mong malaman na may mga circuit na dapat pumunta mula sa isang analog signal sa isang digital o kabaligtaran. Ang mga ito mga converter kilala sila bilang DAC (Digital-to-Analog Converter) at ADC (Analog-to-Digital Converter). At karaniwan ang mga ito sa maraming mga aparato na ginagamit namin ngayon, tulad ng TV, computer, atbp. Sa kanila maaari mong mai-convert ang mga digital signal na ginagamit ng mga kagamitang ito sa isang elektronikong antas upang gumana sa iba pang mga peripheral o bahagi na gumagana sa analog.

Por ejemplo, isang speaker o mikropono na may mga analog signal na gumagana sa isang sound card, o mga digital graphics card na may sikat na RAMDAC chip para sa mga analog monitor port ... Sa Arduino ang ganitong uri ng mga converter ay ginagamit din para sa maraming mga proyekto, tulad ng makikita natin ...

Ano ang PWM?

siklo ng graphic duty

Bagaman PWM (Pulse-Width Modulation), o modulate ng lapad ng pulso, ay may isang digital base, ang hugis ng signal nito ay kahawig ng isang medyo "parisukat" na analog signal. Pinapayagan nito sa pamamagitan ng mga digital na pulso na iba-iba ang signal upang tularan ang isang analog system tulad ng nag-puna na ako dati. Sa katunayan, kung titingnan mo ang pangalan, bibigyan ka nito ng mga pahiwatig ng kung ano ang ginagawa nito, sa pamamagitan ng lapad ng mga digital na pulso.

Ito ay kapaki-pakinabang para sa Arduino dahil maraming mga automatismo o elektronikong sangkap na maaari mong idagdag sa iyong mga proyekto at iyon ay hindi kayang magbigay ng isang totoong analog signal, ngunit ginagamit nila ang PWM na ito upang gumana. Hindi rin sila makakagamit ng isang diskretong analog signal, iyon ay, na papunta sa boltahe na tumalon upang maging katulad ng isang digital. Ang magagawa nila ay ang paggamit ng isang digital output -Vcc o Vcc ng isang digital na uri upang makabuo ng kakaibang signal ...

Samakatuwid, ang PWM ay isang uri ng "trick" kung saan ang Arduino at iba pang mga system ay maaaring makipagtulungan sa ganitong uri ng mga signal na ang mga ito ay hindi masyadong analogue o hindi rin sila maginoo digital. Upang gawing posible, pinapanatili nilang aktibo ang isang digital output para sa isang tukoy na oras o off, depende sa interes sa lahat ng oras. Malayo ito sa kung ano ang magiging isang digital na orasan o signal ng binary code, na ang mga pulso ay may parehong lapad.

Sa iyong mga proyekto sa Arduino maaari mong suriin ang ganitong uri ng mga signal ng PWM kung saan ang isang pare-pareho na dalas ng mga pag-trigger ng pulso ay pinananatili sa paglipas ng panahon, ngunit ang lapad ng mga pulso na ito ay iba-iba. Sa katunayan, ito ay tinatawag na Duty Cycle kapag ang isang senyas ay pinananatiling mataas na patungkol sa kabuuan ng cycle. Samakatuwid, ang Duty Cycle ay ibinibigay sa%.

Tandaan na sa isang PWM hindi ka gagana tulad ng sa isang analog signal, sa pagitan ng maraming mga halaga ng boltahe at nagbabagu-bago ito sa pagitan nila. Sa kaso ng PWM ito ay isang parisukat na signal sa digital na istilo at na ang maximum na halaga ay Vcc. Halimbawa, kung nagtatrabaho ka sa isang 3V power supply, maaari kang magbigay ng 3V o 0V na mga pulso, ngunit hindi 1V o anumang iba pang intermediate na halaga na magaganap sa isang tunay na analog. Ang mag-iiba sa kasong iyon ay ang lapad ng pulso, na maaari naming panatilihin ang 30% sa mataas na halagang Vcc, o 60% upang bigyan ito ng higit na lakas, atbp.

Ngunit mag-ingat, dahil kung sinusuportahan ng isang aparato ang isang limitasyon ng Vcc at lumampas sa PWM, maaari itong masira. Kaya't ang mga halaga ng mga datasheet na ibinigay ng mga tagagawa ay dapat laging igalang. Gayundin, sa ilang mga aparato tulad ng DC motors, relay, electromagnets, atbp., isang pag-withdraw ng boltahe pagkatapos ng isang Duty Cycle ay maaaring mangahulugan na ang mga inductive load ay maaaring maging sanhi ng pinsala. Iyon ang dahilan kung bakit ang mga proteksyon napapanahon

PWM kay Arduino

Arduino I2C bus

Ngayon na alam mo kung paano ito gumagana, tingnan natin ang tukoy na kaso ng PWM sa loob ng Arduino mundo ...

PWM: pinout kay Arduino

Sa mga board ng Arduino maaari kang makahanap ng maraming mga pin na nagpapatupad ng hardware PWM. Maaari mong makilala ang mga ito sa mismong PCB dahil mayroon silang simbolo ~ (maliit na ulo) kasama ang pagnunumero ng pin. Maaari rin itong magawa ng software sa Arduino code, ngunit i-o-overload ang microcontroller sa trabaho, isang bagay na walang katotohanan kung magagawa ito nang natural at ng hardware ...

  • Arduino UNO, Mini at Nano- Mayroon kang 6 8-bit na output ng PWM sa mga pin 3, 5, 6, 9, 10, at 11, na magkakaroon nito ~ sa harap mismo ng numero.
  • arduino mega- Sa pinakamakapangyarihang board na Arduino mayroon kang 15 8-bit na output ng PWM. Ang mga ito ay nasa pin 2 hanggang 13 at 44 hanggang 46.
  • Arduino Dahil: sa kasong ito mayroong 13 8-bit na output ng PWM. Ang mga ito ay nasa mga pin 2 hanggang 13, kasama ang dalawang iba pang mga analog output na na-discretize ng DAC na may 12-bit na resolusyon.

Kapag pinag-uusapan mo ang tungkol sa 8-bit o 12-bit na resolusyon, atbp., Sa ganitong uri ng mga output ng PWM, tumutukoy ka sa silid para sa pagmamaniobra na mayroon ka. Kasama si Ang 8 bit ay mayroong 256 na antas Sa pagitan ng kung saan maaari kang mag-iba, at ang 12 bits ay umakyat sa 4096 na mga antas.

Kontrolin sa Mga Timer

Para sa kontrol ng hardware PWM, Arduino gagamitin ang mga timer para rito. Ang bawat kasalukuyang Timer ay maaaring maghatid ng 2 o 3 mga output ng PWM. Ang isang pagrehistro sa paghahambing para sa bawat output ay nakakumpleto sa sistemang ito upang sa oras na maabot ang halaga ng rehistro, ang estado o halaga ng output ay binago upang ihinto ang mga Duty Cycle. Bagaman mayroong dalawang output na kinokontrol ng parehong Timer, kapwa maaaring magkaroon ng magkakaibang Mga Siklo ng Tungkulin, kahit na nagbabahagi sila ng parehong dalas.

Sa kaso ng Mga Timer na nauugnay sa bawat PWM pin, magkakaiba ito depende sa uri ng board ng Arduino na mayroon ka:

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

Hahatiin ng prescaled register ang oras sa isang integer at gagawin ng Timer ang natitira upang makontrol ang bawat isa sa mga nauugnay na output ng PWM. Ang pagbabago ng halaga ng pagpapatala ay maaaring baguhin ang dalas. Ang mga dalas Mag-iiba din ang mga ito depende sa Timer at plate:

  • Arduino UNO, Mini at Nano:
    • Timer0: pinapayagan ang prescaling ng 1, 8, 64, 256 at 1024. Ang dalas ay 62.5 Khz.
    • Timer1: na may mga preset na 1, 8, 64, 256 at 1024. Na may dalas na 31.25 Khz.
    • Timer2: katumbas ng Timer1, nagdaragdag lamang ito ng prescaling na 32 at 128 bilang karagdagan sa mga nauna.
  • arduino mega:
    • Timer0, 1, 2: pareho sa itaas.
    • Timer3, 4, at 5: na may dalas na 31.25 Khz at prescaled ng 1, 8, 64, 256 at 1024.

Mga hindi pagkakatugma at salungatan

Ang Timer na nauugnay sa mga output ay hindi lamang para sa pagpapaandar na iyon, ginagamit din ng iba. Samakatuwid, kung ginagamit ang mga ito ng ibang pag-andar, dapat kang pumili sa pagitan ng isa o ng iba pa, hindi mo maaaring gamitin ang pareho nang sabay. Halimbawa, ito ang ilan sa mga hindi pagkakatugma na maaari mong makita sa iyong mga proyekto:

  • Servo library: Kapag gumamit ka ng mga motor na servo, gumagawa ito ng masinsinang paggamit ng Mga Timer, kaya maaari itong makabuo ng mga salungatan. Partikular na ginagamit ang Timer1 para sa UNO, Nano at Mini, iyon ay, hindi mo maaaring gamitin ang mga pin na 9 at 10 habang gumagamit ka ng sketch sa library na iyon. Sa Mega ito ay depende sa bilang ng mga ...
  • SPI: Kung ang komunikasyon ng SPI ay ginagamit sa Arduino board, ginagamit ang pin 11 para sa pagpapaandar ng MOSI. Iyon ang dahilan kung bakit hindi maaaring gamitin ang PWM pin na iyon.
  • Tono: ang pagpapaandar na ito ay gumagamit ng Timer2 upang mapatakbo. Kaya kung ginamit ito, ginagawa mong walang silbi ang mga pin na 3 at 11 (o 9 at 10 para sa Mega).

Ang hands-on na pagsubok kasama si Arduino

Arduino PWM eskematiko na may LED

Kung nais mong makita on-site kung paano gumagana ang PWM sa Arduino, ang pinakamagandang bagay na maaari mong gawin ay ikonekta ang mga lead sa pagsukat ng isang voltmeter o multimeter (sa pagpapaandar upang masukat ang boltahe) sa pagitan ng PWM pin na pinili mong gamitin at ang ground pin o GND ng Arduino board. Sa ganitong paraan, sa screen ng sumusukat na aparato magagawa mong makita kung paano nagbabago ang boltahe sa isang output na digital salamat sa trick na PWM na ito.

Maaari mong palitan ang voltmeter / multimeter ng isang LED upang makita kung paano nag-iiba ang tindi ng ilaw, sa isang DC motor, o sa anumang iba pang elemento na gusto mo. Pinasimple ko ito sa diagram na may Fritzing na may isang LED nang walang higit pa, ngunit alam na maaari rin itong kumatawan sa mga tip ng isang multimeter ...

Kung gumagamit ka ng isang LED, tandaan ang paglaban sa cathode at GND.

Sa ang source code Upang makontrol ang Arduino board microcontroller upang gumana ang lahat, dapat mong ipasok ito sa Arduino IDE (sa kasong ito ay ginamit ko ang PWM pin 6 ng 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  
   } 
} 
Pinapayuhan ko kayong laruin ang mga halaga at tingnan ang mga resulta sa ilaw o voltmeter. Ang programa ay maaaring makatanggap ng mga halaga mula 0 hanggang 9 upang makita mo kung paano nag-iiba ang lahat. Para sa karagdagang impormasyon, pinapayuhan ko kayo ang kurso ng arduino mayroon kaming libreng pag-download ...

Isang komento, iwan mo na

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   Jose dijo

    Hello magandang araw Una sa lahat nais kong pasalamatan ka sa oras na nakatuon sa paliwanag na ito para sa pinakabago.
    Nais kong gawin kang isang query. Sinusubukan kong patakbuhin ang code sa isang proteus 8 emulator para sa Arguino Mega. Ikonekta ko ang isang voltmeter sa pin 6, ang Proteus ay konektado sa isang serial port, ngunit hindi ko alam kung paano o kung ano ang mag-iiba upang ang iba't ibang mga voltages ay output. Kinailangan kong gumawa ng mga menor de edad na pagsasaayos sa code upang maisama ito. Maraming salamat sa iyong tulong