Met die digitale en analoge penne wat u op u Arduino-bord kan gebruik, kan u elektriese seine ontvang of stuur om data van u elektroniese projekte te beheer of te verkry. Daarbenewens is daar ander baie interessante seine in hierdie tipe plaat, en dit is die PWM, wat 'n analoog sein kan navolg sonder om eintlik analoog te wees. Dit wil sê, dit is digitale penne wat op 'n soortgelyke manier kan optree (nie dieselfde nie) as 'n analoog sein.
Hierdie tipe seine is baie prakties as u nie net digitale HIGH en LOW seine wil gebruik nie, dit wil sê 1 of 0, AAN en UIT, maar u verder wil gaan en beskryf ietwat ingewikkelder seine. Dit is byvoorbeeld moontlik om die spoed van a te moduleer GS-motor, of die ligintensiteit van 'n lig, vir 'n solenoïde, ens.
Index
Analoog teenoor digitale stelsel
Elektroniese stroombane kan in twee groot gesinne of kategorieë verdeel word: digitaal en analoog. As ons van digitale elektronika praat, gebruik ons hoeveelhede met diskrete waardes, dit wil sê 'n binêre stelsel wat deur elektriese seine van lae of hoë spanning voorgestel word om die toestand van die stukkies wat hanteer word te interpreteer. Aan die ander kant, wanneer dit by 'n analoog stroombaan kom, word hoeveelhede met deurlopende waardes gebruik.
Binne digitale stelsels kan op hul beurt gevind word dié van kombinasietipe en dié van opeenvolgende tipe. Eersgenoemde is dus dié waarin die uitset van die stelsel slegs afhang van die toestand van die insette. Aan die ander kant, in die opeenvolgende, word geheue-elemente ingesluit, en die uitvoer sal afhang van die huidige toestand van die insette en die vorige toestand wat gestoor is.
In die geval van analoë is daar nie hierdie twee groot groepe of variante nie, want hier is dit deurlopende seine wat altyd sal afhang van die sein huidige stelsel. Byvoorbeeld, in 'n luidspreker sal die sein wat daaraan verskaf word afhang van die geluid wat u wil weergee. Dieselfde met 'n mikrofoon, wat 'n analoog sein sal genereer afhangend van die geluid wat hy ontvang. U het dit sekerlik ook gesien met baie ander sensors wat ons in hierdie blog beskryf het en wat met analoog seine werk (en daarom moes 'n formule geskep word sodat die waardes later in die Arduino IDE-sketse kon bereken of gekondisioneer word) ) ...
Hierdie eienskappe van die een en die ander laat sommige hul eie voordele en nadele, soos gewoonlik in byna alles. Byvoorbeeld, digitale is gewoonlik goedkoper, vinniger, makliker om te ontwikkel, inligting kan makliker gestoor word, hulle het 'n groter akkuraatheid, dit kan geprogrammeer word, is nie so kwesbaar vir die gevolge van geraas nie, ens. Maar dit is ook waar dat met analoë u met meer komplekse seine kan werk.
Por ejemplo, 'n digitale Hall-effeksensor kan slegs die teenwoordigheid of afwesigheid van 'n nabygeleë magnetiese veld opspoor. In plaas daarvan kan 'n analoog Hall-effekteksensor dit doen en ook die digtheid van die magnetiese veld bepaal danksy 'n analoog sein wat dit by die uitset genereer. Om te weet hoe om die sein van hoër of laer spanning goed te interpreteer, kan u maklik weet hoe groot dit is. U het ander voorbeelde in 'n menigte groottes van die natuur wat u kwantitatief met 'n analoogstelsel kan meet, soos temperatuur, tyd, druk, afstand, geluid, ens.
Analoog teenoor digitale sein
Dit gesê, a analoog sein Dit sal 'n spanning of elektriese stroom wees wat met tyd en deurlopend wissel. As 'n grafiek aangebied word, is die analoog sein 'n sinusgolf met 'n enkele frekwensie.
As die digitale sein, is 'n spanning wat stapsgewys wissel ten opsigte van tyd. Dit wil sê, as dit in 'n grafiek voorgestel word, sal dit 'n stapsignaal wees wat nie aanhoudend wissel nie, maar veranderings in stappe of afsonderlike inkremente.
U moet weet dat daar stroombane is om van 'n analoog sein na 'n digitale sein te gaan, of andersom. Hierdie omsetters dit staan bekend as DAC (Digital-to-Analog Converter) en ADC (Analog-to-Digital Converter). En dit kom baie voor in baie toestelle wat ons vandag gebruik, soos TV, rekenaars, ens. Hiermee kan u die digitale seine wat hierdie toerusting gebruik, omskakel na 'n elektroniese vlak om saam te werk met ander randapparatuur of onderdele wat analoog werk.
Por ejemplo, 'n luidspreker of mikrofoon met analoog seine wat met 'n klankkaart werk, of digitale grafiese kaarte met die beroemde RAMDAC-skyf vir die analoge monitorpoorte ... In Arduino word hierdie tipe omsetters ook gebruik vir verskeie projekte, soos ons sal sien ...
Wat is PWM?
Alhoewel PWM (pulswydte-modulasie), of pulswydte-modulasie, het 'n digitale basis, die vorm van die sein lyk soos 'n ietwat 'vierkantige' analoog sein. Dit laat toe om deur middel van digitale pulse die sein te varieer om 'n analoogstelsel te emuleer soos ek reeds genoem het. As u na die naam kyk, gee dit u alreeds leidrade oor wat dit doen, deur die breedte van die digitale pulse.
Dit is voordelig vir Arduino aangesien daar baie outomatisme of elektroniese komponente is wat u by u projekte kan voeg en dit nie 'n ware analoog sein kan lewer nie, maar hulle gebruik hierdie PWM om te funksioneer. Hulle kan ook nie 'n diskretiese analoog sein gebruik nie, dit wil sê, wat na spanning spring om na 'n digitale een te lyk. Wat hulle kan doen is om 'n digitale uitset -Vcc of Vcc van 'n digitale tipe te gebruik om hierdie eienaardige sein te genereer ...
Daarom is PWM 'n soort 'truuk' waarmee Arduino en ander stelsels met hierdie tipe seine kan saamwerk hulle is nie heeltemal analoog nie en ook nie konvensioneel nie. Om dit moontlik te maak, hou hulle 'n digitale uitset vir 'n spesifieke tyd of af, afhangend van die belangstelling te alle tye. Dit is ver van 'n digitale horlosie of 'n binêre kodesein waarvan die pulse dieselfde breedte het.
In u projekte met Arduino kan u hierdie tipe PWM-seine nagaan waarin 'n konstante frekwensie van polssnellers oor tyd gehandhaaf word, maar die breedte van hierdie pulse wissel. In werklikheid word dit dienssiklus genoem as 'n sein hoog gehou word ten opsigte van die totaal van die siklus. Daarom word dienssiklus in% gegee.
Onthou dat u in 'n PWM nie werk soos in 'n analoog sein nie, tussen verskillende spanningswaardes en wisselend tussen hulle. In die geval van PWM is dit 'n vierkantige sein in die digitale styl en waarvan die maksimum waarde Vcc is. As u byvoorbeeld met 'n 3V-kragbron werk, kan u 3V- of 0V-pulse gee, maar nie 1V of enige ander tussenwaarde soos wat in 'n ware analoog sou voorkom nie. Wat in daardie geval sou verskil, is die breedte van die pols, wat ons 30% op die hoë Vcc-waarde kan hou, of 60% om dit meer krag te gee, ens.
Maar wees versigtig, want as 'n toestel 'n Vcc-limiet ondersteun en met PWM oorskry word, kan dit beskadig word. Dit sal dus altyd nodig wees om die waardes van die datablaaie wat deur die vervaardigers verskaf word, te respekteer. Ook in sommige toestelle soos GS-motors, aflosse, elektromagnete, ens., kan 'n onttrekking van spanning na 'n dienssiklus beteken dat induktiewe vragte skade kan veroorsaak. Dit is waarom die beskerming tydig.
PWM op Arduino
Noudat u weet hoe dit werk, kom ons kyk na die spesifieke geval van PWM binne die Arduino-wêreld ...
PWM: uitsoek op Arduino
Op Arduino-borde kan u verskeie penne vind wat PWM vir hardeware implementeer. U kan dit op die PCB self identifiseer omdat dit 'n simbool ~ (klein kop) saam met die pen nommer. Dit kan ook gedoen word deur sagteware in die Arduino-kode, maar dit sal die mikrobeheerder oorlaai met werk, iets absurd as dit natuurlik en hardeware gedoen kan word ...
- Arduino UNO, Mini en Nano- U het 6 8-bis PWM-uitgange op pen 3, 5, 6, 9, 10 en 11, wat ~ voor die nommer sal hê.
- Mega Arduino- Op hierdie kragtigste Arduino-bord het u 15 8-bis PWM-uitvoer. Dit is op penne 2 tot 13 en 44 tot 46.
- Arduino Duet: in hierdie geval is daar 13 8-bis PWM-uitsette. Dit is op die penne 2 tot 13, plus twee ander analoog-uitgange wat deur DAC met 'n 12-bis-resolusie diskretiseer word.
As u in hierdie tipe PWM-uitsette praat van 8-bis of 12-bit resolusie, verwys u na die beweegruimte wat u het. Met 8 bisse het 256 vlakke Tussen wat u kan wissel, en die 12 bisse styg tot 4096 vlakke.
Beheer met timer
Vir hardeware PWM-beheer, Arduino die tydopnemers sal gebruik vir dit. Elke huidige timer kan 2 of 3 PWM-uitsette bedien. 'N Vergelykingsregister vir elke afvoer vul hierdie stelsel aan, sodat wanneer die tyd die waarde van die register bereik, die toestand of waarde van die uitset verander word om daardie dienssiklusse te stop. Alhoewel daar twee uitsette is wat deur dieselfde timer beheer word, kan albei verskillende dienssiklusse hê, alhoewel hulle dieselfde frekwensie het.
In die geval van die timer wat met elke PWM-pen geassosieer word, sal dit wissel afhangende van die tipe Arduino-bord wat jy het:
- Arduino UNO, Mini en Nano:
- Timer0 - 5 en 6
- Timer1 - 9 en 10
- Timer2 - 3 en 11
- Mega Arduino:
- Timer0 - 4 en 13
- Timer1 - 11 en 12
- Timer2 - 9 en 10
- Timer3 - 2, 3 en 5
- Timer4 - 6, 7 en 8
- Timer5 - 44, 45 en 46
Die voorafbepaalde register sal die tyd deur 'n heelgetal verdeel en die Timer doen die res om elk van die gepaardgaande PWM-uitsette te beheer. As u die registerwaarde verander, kan dit die frekwensie verander. Die frekwensie Dit sal ook verskil, afhangende van die timer en die plaat:
- Arduino UNO, Mini en Nano:
- Timer0: laat voorskaling van 1, 8, 64, 256 en 1024 toe. Die frekwensie is 62.5 Khz.
- Timer1: met presets van 1, 8, 64, 256 en 1024. Met 'n frekwensie van 31.25 Khz.
- Timer2: gelyk aan Timer1, net dit voeg 'n voorskaling van 32 en 128 by, behalwe die vorige.
- Mega Arduino:
- Timer0, 1, 2: dieselfde as hierbo.
- Timer3, 4 en 5: met 'n frekwensie van 31.25 KHz en voorgeskaal van 1, 8, 64, 256 en 1024.
Onversoenbaarheid en konflik
Die timer geassosieer met die uitsette is nie net vir daardie funksie nie, word ook deur ander gebruik. Daarom, as u dit deur 'n ander funksie gebruik, moet u kies tussen die een of die ander; u kan nie albei gelyktydig gebruik nie. Dit is byvoorbeeld enkele van die onverenigbaarheid wat u in u projekte kan vind:
- Servobiblioteek: As u 'n servomotor gebruik, gebruik dit Timers intensief, wat konflik kan veroorsaak. Gebruik Timer1 spesifiek vir UNO, Nano en Mini, dit wil sê, u kan nie pen 9 en 10 gebruik terwyl u 'n skets by die biblioteek gebruik nie. In Mega sal dit afhang van die aantal servo's ...
- SPI: As SPI-kommunikasie op die Arduino-bord gebruik word, word pen 11 gebruik vir die MOSI-funksie. Daarom kan daardie PWM-pen nie gebruik word nie.
- Toon: hierdie funksie gebruik Timer2 om te werk. As dit dus gebruik word, maak u pen 3 en 11 (of 9 en 10 vir Mega) nutteloos.
Praktiese toets met Arduino
As u ter plaatse wil sien hoe PWM op Arduino werk, is die beste ding om die meetsnoere van 'n voltmeter of multimeter (in funksie om spanning te meet) tussen die PWM-pen wat u gekies het en die grondpen of GND van die Arduino-bord. Op hierdie manier sal u op die skerm van die meettoestel kan sien hoe die spanning verander met 'n digitale uitset danksy hierdie PWM-truuk.
U kan die voltmeter / multimeter vervang deur 'n LED om te sien hoe die intensiteit van die lig wissel, deur 'n GS-motor of met enige ander element wat u wil hê. Ek het dit in die diagram met Fritzing met 'n LED sonder meer vereenvoudig, maar weet dat dit ook die punte van 'n multimeter kan voorstel ...
As u 'n LED gebruik, moet u die weerstand by die katode en GND onthou.
om die bronkode Om die Arduino-kaart-mikrobeheerder te beheer om alles te laat werk, moet u dit in Arduino IDE invoeg (in hierdie geval het ek PWM-pen 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 } }
'N Opmerking, los joune
Hallo Goeiedag. In die eerste plek wil ek u bedank vir die tyd wat aan die nuutste verduideliking toegewy is.
Ek wil graag vir u 'n navraag doen. Ek probeer om die kode op 'n proteus 8-emulator vir Arguino Mega uit te voer. Ek koppel 'n voltmeter aan pen 6, Proteus is gekoppel aan 'n seriële poort, maar ek weet nie hoe of wat om te wissel nie, sodat verskillende spannings uitgevoer word. Ek moes die kode klein aanpassings maak om dit te laat saamstel. Baie dankie vir jou hulp