PWM: emulace analogových pinů s vaší deskou Arduino

PWM signály

S digitálními a analogovými piny, které můžete použít na desce Arduino, můžete přijímat nebo odesílat elektrické signály pro ovládání nebo získávání dat z vašich elektronických projektů. Kromě toho existují u tohoto typu desky další velmi zajímavé signály, a to jsou PWM, které mohou emulovat analogový signál, aniž by byly analogické. To znamená, že se jedná o digitální piny, které mohou fungovat podobně (ne stejně) jako analogový signál.

Tyto typy signálů jsou velmi praktické, když chcete nejen používat digitální VYSOKÉ a NÍZKÉ signály, tj. 1 nebo 0, ZAPNUTO a VYPNUTO, ale chcete jít dále a popsat poněkud složitější signály. Například je možné modulovat rychlost a stejnosměrný motornebo intenzita světla pro solenoid atd.

Analogový vs digitální systém

Analogový vs digitální signál

Elektronické obvody lze rozdělit do dvou velkých skupin nebo kategorií: digitální a analogové. Když mluvíme o digitální elektronice, používáme veličiny s diskrétními hodnotami, tj. Binární systém představovaný elektrickými signály nízkého nebo vysokého napětí k interpretaci stavu těch bitů, se kterými se pracuje. Na druhou stranu, pokud jde o analogový obvod, používají se veličiny se spojitými hodnotami.

V rámci digitálních systémů lze postupně nalézt kombinační a sekvenční. To znamená, že první jsou ty, ve kterých výstup systému závisí pouze na stavu vstupů. Na druhou stranu v sekvenčních jsou zahrnuty paměťové prvky a výstup bude záviset na aktuálním stavu vstupů a na předchozím uloženém stavu.

V případě analogů neexistují tyto dvě velké skupiny nebo varianty, protože zde se jedná o spojité signály, na kterých bude vždy záviset signál současný systém. Například v reproduktoru závisí dodávaný signál na zvuku, který chcete reprodukovat. Totéž s mikrofonem, který bude generovat analogový signál v závislosti na přijímaném zvuku. Určitě jste to také viděli u mnoha dalších senzorů, které jsme popsali v tomto blogu a které fungují s analogovými signály (a proto musel být vytvořen vzorec, aby bylo možné později vypočítat nebo upravit hodnoty v náčrtech Arduino IDE ) ...

Tyto vlastnosti jednoho a druhého způsobují, že některé mají své výhody a nevýhody, jak je obvyklé téměř ve všem. Například digitální jsou obvykle levnější, rychlejší, snáze se vyvíjejí, informace lze snáze ukládat, mají větší přesnost, lze je programovat, nejsou tak zranitelní vůči účinkům hluku atd. Je ale také pravda, že s analogy můžete pracovat se složitějšími signály.

Por ejemplo, snímač Hallova jevu digitálního typu dokáže detekovat pouze přítomnost nebo nepřítomnost blízkého magnetického pole. Místo toho to může udělat analogový snímač Hallova jevu a také určit hustotu uvedeného magnetického pole díky analogovému signálu, který generuje na svém výstupu. Když budete vědět, jak dobře interpretovat tento signál většího nebo menšího napětí, můžete tuto velikost snadno poznat. Máte další příklady z mnoha přírodních veličin, které můžete kvantitativně měřit pomocí analogového systému, jako je teplota, čas, tlak, vzdálenost, zvuk atd.

Analogový vs digitální signál

Jak již bylo řečeno, a analogový signál Bude to napětí nebo elektrický proud, který se mění s časem a nepřetržitě. Pokud by byl graf znázorněn, analogovým signálem by byla jednofrekvenční sinusová vlna.

Vzhledem k tomu, digitální signál, je napětí, které se mění v závislosti na čase. To znamená, že pokud je znázorněn v grafu, bude to krokový signál, který se nemění nepřetržitě, ale změny v krocích nebo diskrétních přírůstcích.

Měli byste vědět, že existují obvody pro přechod z analogového signálu na digitální nebo naopak. Tyto převodníky oni jsou známí jako DAC (Digital-to-Analog Converter) a ADC (Analog-to-Digital Converter). A jsou velmi běžné v mnoha zařízeních, která dnes používáme, jako je televize, počítače atd. S nimi můžete převádět digitální signály používané tímto zařízením na elektronickou úroveň pro práci s jinými periferními zařízeními nebo částmi, které pracují analogově.

Por ejemplo, reproduktor nebo mikrofon s analogovými signály, které fungují se zvukovou kartou, nebo digitální grafické karty, které měly slavný čip RAMDAC pro analogové porty monitoru ... V Arduinu se tento typ převaděčů používá také pro více projektů, jak uvidíme ...

Co je PWM?

grafický pracovní cyklus

Ačkoli PWM (Pulse-Width Modulation) nebo pulsně šířková modulace, má digitální základnu, tvar jejího signálu připomíná poněkud "čtvercový" analogový signál. Umožňuje to pomocí digitálních pulzů měnit signál tak, aby emuloval analogový systém, jak jsem již dříve komentoval. Ve skutečnosti, pokud se podíváte na jméno, již vám dává informace o tom, co dělá, a to přes šířku digitálních pulzů.

To je výhodné pro Arduino protože existuje mnoho automatismů nebo elektronických součástek, které můžete přidat do svých projektů a podobně nejsou schopny poskytovat skutečný analogový signál, ale používají tento PWM k provozu. Nemohou také použít diskretizovaný analogový signál, to znamená, že jde k napěťovým skokům, aby se podobal digitálnímu. Mohou použít digitální výstup - Vcc nebo Vcc digitálního typu ke generování tohoto zvláštního signálu ...

Proto je PWM jakýmsi „trikem“, s nímž může Arduino a další systémy spolupracovat s tímto typem signálů, které nestávají se zcela analogovými nebo konvenčními digitálními. Aby to bylo možné, udržují digitální výstup aktivní po určitou dobu nebo vypnutý, vždy podle zájmu. To je daleko od toho, co by byly digitální hodiny nebo binární kódový signál, jehož impulsy mají stejnou šířku.

Ve vašich projektech s Arduino můžete zkontrolovat tento typ signálů PWM, u nichž je v průběhu času udržována konstantní frekvence pulzních spouštěčů, ale šířka těchto pulzů se mění. Ve skutečnosti se tomu říká pracovní cyklus, když je signál udržován na vysoké hodnotě vzhledem k celkovému cyklu. Pracovní cyklus je proto uveden v%.

Nezapomeňte, že v PWM nepracujete jako v analogovém signálu, mezi různými hodnotami napětí a mezi nimi kolísá. V případě PWM se jedná o čtvercový signál v digitálním stylu a jehož maximální hodnota je Vcc. Například pokud pracujete s napájecím zdrojem 3 V, můžete dávat impulsy 3 V nebo 0 V, ale ne 1 V nebo jakoukoli jinou mezilehlou hodnotu, jaká by se vyskytovala ve skutečném analogu. V tomto případě by se lišila šířka impulzu, kterou můžeme udržet 30% při této vysoké hodnotě Vcc, nebo 60%, abychom jí dodali více energie atd.

Buďte ale opatrní, protože pokud zařízení podporuje limit Vcc a je překročeno pomocí PWM, může dojít k jeho poškození. Vždy by tedy bylo nutné respektovat hodnoty datových listů poskytovaných výrobci. U některých zařízení, jako jsou stejnosměrné motory, relé, elektromagnety atd., odpojení napětí po pracovním cyklu může znamenat, že indukční zátěž může způsobit poškození. Proto ochrany včas.

PWM na Arduinu

Sběrnice Arduino I2C

Nyní, když víte, jak to funguje, se podívejme na konkrétní případ PWM ve světě Arduino ...

PWM: pinout na Arduinu

Na deskách Arduino najdete několik pinů, které implementují hardwarové PWM. Můžete je identifikovat na samotné desce plošných spojů, protože mají a symbol ~ (malá hlava) spolu s číslováním kolíků. Mohlo by to být také provedeno softwarem v kódu Arduino, ale to by přetížilo mikrokontrolér prací, což je něco absurdního, když to lze provést nativně a hardwarem ...

  • Arduino UNO, Mini a Nano- Máte 6 8bitových PWM výstupů na pinech 3, 5, 6, 9, 10 a 11, které budou mít ~ přímo před číslem.
  • Arduino Mega- Na této nejvýkonnější desce Arduino máte 15 8bitových PWM výstupů. Jsou na pinech 2 až 13 a 44 až 46.
  • Arduino splatné: v tomto případě existuje 13 8bitových PWM výstupů. Jsou na pinech 2 až 13 plus dva další analogové výstupy diskretizované DAC s 12bitovým rozlišením.

Když hovoříte o rozlišení 8 bitů nebo 12 bitů atd., U tohoto typu PWM výstupů máte na mysli manévrovací prostor, který máte. S 8 bitů má 256 úrovní Mezi kterými se můžete měnit a 12 bitů jde až na 4096 úrovní.

Ovládání pomocí časovačů

Pro hardwarové ovládání PWM, Arduino použije časovače pro to. Každý přítomný časovač může obsluhovat 2 nebo 3 PWM výstupy. Porovnávací registr pro každý výstup doplňuje tento systém, takže když čas dosáhne hodnoty registru, změní se stav nebo hodnota výstupu, aby se zastavily tyto pracovní cykly. Ačkoli existují dva výstupy řízené stejným časovačem, oba mohou mít různé pracovní cykly, i když sdílejí stejnou frekvenci.

V případě časovačů spojených s každým pinem PWM se to bude lišit v závislosti na typu desky Arduino že máte:

  • Arduino UNO, Mini a Nano:
    • Časovač 0-5 a 6
    • Časovač 1-9 a 10
    • Časovač 2-3 a 11
  • Arduino Mega:
    • Časovač 0-4 a 13
    • Časovač 1-11 a 12
    • Časovač 2-9 a 10
    • Časovač 3 - 2, 3 a 5
    • Časovač 4 - 6, 7 a 8
    • Časovač 5 - 44, 45 a 46

Přednastavený registr vydělí čas celým číslem a časovač provede zbytek pro ovládání každého z přidružených PWM výstupů. Úpravou hodnoty registru lze změnit frekvenci. The frekvence Budou se také lišit v závislosti na časovači a štítku:

  • Arduino UNO, Mini a Nano:
    • Timer0: umožňuje přednastavení 1, 8, 64, 256 a 1024. Frekvence je 62.5 Khz.
    • Timer1: s přednastavenými 1, 8, 64, 256 a 1024. S frekvencí 31.25 Khz.
    • Timer2: stejné jako Timer1, pouze přidá předřazení 32 a 128 kromě předchozích.
  • Arduino Mega:
    • Timer0, 1, 2: stejné jako výše.
    • Timer3, 4 a 5: s frekvencí 31.25 Khz a přednastavenou na 1, 8, 64, 256 a 1024.

Neslučitelnost a konflikty

Časovač spojený s výstupy není jen pro tuto funkci, používají také ostatní. Proto, pokud jsou používány jinou funkcí, musíte si vybrat mezi jedním nebo druhým, nemůžete používat oba současně. Jedná se například o některé nekompatibility, které najdete ve svých projektech:

  • Servo knihovna: Pokud používáte servomotory, časovače se používají intenzivně, což by mohlo vést ke konfliktům. Konkrétně použijte Timer1 pro UNO, Nano a Mini, to znamená, že nemůžete použít piny 9 a 10, když používáte skicu s touto knihovnou. V Mega to bude záviset na počtu serv ...
  • SPI: Pokud se na desce Arduino používá komunikace SPI, použije se pro funkci MOSI pin 11. Proto tento pin PWM nelze použít.
  • Tón: tato funkce používá k ovládání Timer2. Pokud se tedy použije, uděláte špendlíky 3 a 11 (nebo 9 a 10 pro Mega) k ničemu.

Praktický test s Arduinem

Schéma Arduino PWM s LED

Pokud chcete vidět na místě, jak PWM funguje na Arduinu, nejlepší věc, kterou můžete udělat, je připojit měřicí kabely voltmetr nebo multimetr (ve funkci pro měření napětí) mezi pinem PWM, který jste se rozhodli použít, a zemním pinem nebo GND desky Arduino. Tímto způsobem na obrazovce měřicího zařízení uvidíte, jak se mění napětí s digitálním výstupem díky tomuto triku PWM.

Voltmetr / multimetr můžete nahradit LED, abyste viděli, jak se mění intenzita světla, stejnosměrným motorem nebo jakýmkoli jiným požadovaným prvkem. Zjednodušil jsem to v diagramu s Fritzingem s LED bez dalších, ale vím, že to může také představovat špičky multimetru ...

Pokud používáte LED, nezapomeňte na odpor na katodě a GND.

na zdrojový kód Chcete-li ovládat mikrokontrolér desky Arduino, aby vše fungovalo, měli byste to vložit do Arduino IDE (v tomto případě jsem použil PWM pin 6 z 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  
   } 
} 
Doporučuji vám hrát si s hodnotami a vidět výsledky na světle nebo voltmetru. Program může přijímat hodnoty od 0 do 9, takže můžete vidět, jak se vše mění. Pro více informací vám radím kurz Arduino které máme ke stažení zdarma ...

Obsah článku se řídí našimi zásadami redakční etika. Chcete-li nahlásit chybu, klikněte zde.

Komentář, nechte svůj

Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   Jose řekl

    Ahoj pěkný den. Nejprve vám chci poděkovat za čas věnovaný tomuto vysvětlení pro nejnovější.
    Rád bych vám položil dotaz. Snažím se spustit kód na emulátoru proteus 8 pro Arguino Mega. Připojuji voltmetr na pin 6, Proteus je připojen k sériovému portu, ale nevím, jak nebo co se má lišit, aby na výstupu byla různá napětí. Musel jsem provést drobné úpravy kódu, aby byl kompilován. Moc děkuji za Vaši pomoc