Obsah:

Super rychlé analogové napětí z Arduina: 10 kroků (s obrázky)
Super rychlé analogové napětí z Arduina: 10 kroků (s obrázky)

Video: Super rychlé analogové napětí z Arduina: 10 kroků (s obrázky)

Video: Super rychlé analogové napětí z Arduina: 10 kroků (s obrázky)
Video: iOS 06 - Programování HW periferií v iOS, P. Kutálek (mDevCamp 2012) 2024, Červenec
Anonim
Image
Image

Tento Instructable ukazuje, jak generovat super rychlé změny analogového napětí z Arduina a jednoduchého páru rezistoru a kondenzátoru. Jednou z aplikací, kde je to užitečné, je generování grafiky na osciloskopu. Existuje několik dalších projektů, které to provedly. Johngineer ukazuje jednoduchý vánoční strom pomocí pulzně šířkové modulace (PWM). Jiní se na tomto projektu zdokonalili pomocí odporového žebříku nebo pomocí vyhrazeného čipu převodníku digitálního signálu na analogový.

Použití PWM způsobuje velké blikání, zatímco použití odporového žebříku nebo převodníku digitálního signálu na analogový vyžaduje více výstupních pinů a komponent, které nemusí být snadno dostupné. Obvod, který používám, je stejný mrtvý jednoduchý odporový a kondenzátorový pár, jaký byl použit v ukázce vánočního stromu, ale pracuje s výrazně menším blikáním.

Nejprve vás provedu procesem budování obvodu. Pak vás naučím, jak přidat svůj vlastní obrázek. Nakonec uvedu teorii o tom, co je rychlejší.

Pokud se vám tento Instructable líbil, zvažte prosím jeho hlasování!:)

Krok 1: Budování obvodu

Budování okruhu
Budování okruhu

K vybudování obvodu budete potřebovat následující:

a) Arduino založené na Atmel 16MHz ATmega328P, jako je Arduino Uno nebo Arduino Nano.

b) Dva odpory o hodnotě R, která je alespoň 150Ω.

c) Dva kondenzátory o hodnotě C takové, že C = 0,0015 / R, příklady:

  • R = 150Ω a C = 10 µ
  • R = 1,5 kΩ a C = 1 µ
  • R = 15 kΩ a C = 100 nF
  • R = 150 kΩ a C = 10 nF

Důvody pro výběr těchto hodnot jsou dvojí. Primárně chceme udržet proud na pinech Arduina pod maximálním jmenovitým proudem 40mA. Použití hodnoty 150Ω omezuje proud na 30mA při použití s napájecím napětím Arduino 5V. Větší hodnoty R sníží proud, a proto jsou přijatelné.

Druhým omezením je, že chceme zachovat časovou konstantu, která je součinem R a C, přibližně 1,5 ms. Software byl speciálně vyladěn pro tuto časovou konstantu. I když je možné upravit hodnoty R a C v softwaru, existuje úzký rozsah, kolem kterého to bude fungovat, takže vybírejte komponenty co nejblíže navrhovanému poměru.

Důkladnější vysvětlení, proč je RC konstanta důležitá, bude poskytnuto v teoretické části poté, co jsem vám ukázal, jak sestavit demonstrační obvod.

Krok 2: Nastavení osciloskopu

Nastavení osciloskopu
Nastavení osciloskopu

Demonstrace vyžaduje osciloskop nastavený na režim X/Y. Testovací vodiče je třeba zapojit podle schémat. Váš osciloskop se bude lišit od mého, ale projdu kroky nezbytné k nastavení režimu X/Y na mé jednotce:

a) Nastavte horizontální tažení tak, aby bylo ovládáno kanálem B (osa X).

b) Nastavte osciloskop na dvoukanálový režim.

c) Nastavte napětí/div na obou kanálech tak, aby mohlo zobrazovat napětí od 0V do 5V. Moje jsem nastavil na 0,5V/div.

d) Nastavte režim spojky na DC na obou kanálech.

e) Upravte polohu X a Y tak, aby byla tečka v levém dolním rohu obrazovky, když je Arduino vypnuté.

Krok 3: Stáhněte a spusťte software

Image
Image

Stáhněte si software z úložiště Fast Vector Display For Arduino. Software je licencován pod licencí GNU Affero Public License v3 a lze jej libovolně používat a upravovat podle podmínek této licence.

Otevřete soubor „fast-vector-display-arduino.ino“v IDE Arduino a nahrajte do svého Arduina. Na chvilku uvidíte na obrazovce osciloskopu animaci „Šťastný nový rok“.

Tento projekt jsem vyvinul jako osobní hackaton v týdnech před Vánocemi, takže je zde vánoční a novoroční tematická zpráva, kterou můžete vidět úpravou proměnné PATTERN v kódu.

Krok 4: Vytvořte si vlastní kresbu

Pochopte, proč je PWM tak pomalý
Pochopte, proč je PWM tak pomalý

Pokud si přejete vytvořit svůj vlastní výkres, můžete vložit souřadnice bodu do skici Arduina na řádku, který definuje USER_PATTERN.

Zjistil jsem, že Inkscape je docela dobrý nástroj pro vytváření vlastních výkresů:

  1. Vytvářejte text pomocí velkého, tučného písma, například Impact.
  2. Vyberte textový objekt a v nabídce „Cesta“vyberte „Objekt na cestu“.
  3. Vyberte jednotlivá písmena a překryjte je, abyste vytvořili propojený tvar
  4. Vyberte „Union“z nabídky „Path“a spojte je do jediné křivky.
  5. Pokud jsou v nějakých písmenech díry, vyřízněte malý zářez nakreslením obdélníku nástrojem obdélník a odečtěte jej od kontury pomocí nástroje „Rozdíl“.
  6. Dvojitým kliknutím na cestu zobrazíte uzly.
  7. Obdélník vyberte všechny uzly a klikněte na nástroj "Vytvořit roh vybraných uzlů".
  8. Uložte soubor SVG.

Důležité je, aby vaše kresba měla jedinou uzavřenou cestu a žádné otvory. Ujistěte se, že váš návrh má méně než přibližně 130 bodů.

Krok 5: Vložte souřadnice ze souboru SVG do Arduino IDE

  1. Otevřete soubor SVG a zkopírujte souřadnice. Ty budou vloženy do prvku „cesta“. První dvojici souřadnic lze ignorovat; nahraďte je 0, 0.
  2. Souřadnice vložte do skici Arduina do závorek hned za „#define USER_PATTERN“.
  3. Nahraďte všechny mezery čárkami, jinak se zobrazí chyba kompilace. Pomoci může nástroj „Nahradit a najít“.
  4. Zkompilovat a spustit!
  5. Pokud máte problémy, podívejte se na případné chyby v sériové konzole. Zprávy se zobrazí zejména v případě, že váš vzor má pro interní vyrovnávací paměť příliš mnoho bodů. V takových případech bude obraz nadměrně blikat.

Krok 6: Pochopte, proč je PWM tak pomalý

Nejprve se podívejme na chování kondenzátoru při nabíjení.

Kondenzátor připojený ke zdroji napětí Vcc zvýší své napětí podle exponenciální křivky. Tato křivka je asymptotická, což znamená, že se přiblíží k cílovému napětí. Pro všechny praktické účely je napětí „dostatečně blízko“po 5 RC sekundách. RC se nazývá „časová konstanta“. Jak jsme viděli dříve, je to součin hodnot odporu a kondenzátoru ve vašem obvodu. Problém je v tom, že 5 RC je poměrně dlouhá doba na aktualizaci každého bodu na grafickém displeji. To vede k velkému blikání!

Když použijeme k nabíjení kondenzátoru pulzně šířkovou modulaci (PWM), nejsme na tom o nic lépe. S PWM se napětí rychle přepíná mezi 0V a 5V. V praxi to znamená, že rychle střídáme tlačení náboje do kondenzátoru a trochu z něj vytáhneme znovu ven - toto tlačení a tažení je spíše jako snaha zaběhnout maraton tak, že uděláte velký krok vpřed a pak malý krok zpět znovu a znovu.

Když to všechno průměrujete, chování nabíjení kondenzátoru pomocí PWM je úplně stejné, jako kdybyste k nabíjení kondenzátoru použili stálé napětí Vpwm. Stále trvá asi 5 RC sekund, než se dostaneme „dostatečně blízko“k požadovanému napětí.

Krok 7: Dostaňte se z bodu A do bodu B o kousek rychleji

Dostaňte se z a do B, o kousek rychleji
Dostaňte se z a do B, o kousek rychleji

Předpokládejme, že máme kondenzátor, který je již nabitý až do Va. Předpokládejme, že k zápisu nové hodnoty b použijeme analogWrite (). Jakou minimální dobu musíte čekat, než bude dosaženo napětí Vb?

Pokud jste uhodli 5 RC sekund, je to skvělé! Čekáním 5 RC sekund se kondenzátor nabije na téměř Vb. Ale pokud chceme, můžeme ve skutečnosti čekat o něco méně.

Podívejte se na křivku nabíjení. Víš, kondenzátor už byl ve Va, když jsme začínali. To znamená, že nemusíme čekat čas t_a. To bychom museli jen tehdy, kdybychom kondenzátor nabíjeli z nuly.

Tím, že tu dobu nečekáme, vidíme zlepšení. Čas t_ab je ve skutečnosti o něco kratší než 5 RC.

Ale vydržte, můžeme to udělat mnohem lépe! Podívejte se na celý ten prostor nad v_b. To je rozdíl mezi Vcc, maximálním dostupným napětím a Vb, kterého chceme dosáhnout. Vidíte, jak nám to extra napětí může pomoci dostat se tam, kam chceme, mnohem rychleji?

Krok 8: Dostaňte se z bodu A do bodu B s turbodmychadlem

Dostaňte se z bodu A do bodu B s turbodmychadlem!
Dostaňte se z bodu A do bodu B s turbodmychadlem!

To je správně. Namísto použití PWM při cílovém napětí V_b jej udržujeme na stabilním Vcc po mnohem, mnohem kratší dobu. Říkám tomu metoda Turbo Charger a dostává nás tam, kam chceme, opravdu, ale opravdu rychle! Po časové prodlevě (kterou musíme vypočítat) sešlápneme brzdy přepnutím na PWM na V_b. Tím se zabrání tomu, aby napětí překročilo cíl.

Pomocí této metody je možné změnit napětí v kondenzátoru z V_a na V_b za zlomek času než pomocí pouze PWM. Takhle získáte místa, zlato!

Krok 9: Pochopte kód

Pochopte Kodex
Pochopte Kodex

Obrázek má hodnotu tisíc slov, diagram tedy zobrazuje data a operace, které jsou v kódu prováděny. Zleva doprava:

  • Grafická data jsou uložena v PROGMEM (tj. Flash paměti) jako seznam bodů.
  • Jakákoli kombinace translačních, škálovacích a rotačních operací je sloučena do matice afinní transformace. To se provádí jednou na začátku každého rámce animace.
  • Body se čtou jeden po druhém z grafických dat a každý se vynásobí uloženou transformační maticí.
  • Transformované body jsou vedeny nůžkovým algoritmem, který ořízne všechny body mimo viditelnou oblast.
  • Pomocí vyhledávací tabulky zpoždění RC jsou body převedeny na řídicí napětí a časové zpoždění. Vyhledávací tabulka zpoždění RC je uložena v EEPROM a lze ji znovu použít pro více běhů kódu. Při spuštění se kontroluje přesnost vyhledávací tabulky RC a aktualizují se všechny nesprávné hodnoty. Použití EEPROM šetří cennou paměť RAM.
  • Řídicí napětí a zpoždění jsou zapsána do neaktivního rámce ve vyrovnávací paměti rámců. Vyrovnávací paměť rámců obsahuje místo pro aktivní rámec a neaktivní snímek. Jakmile je zapsán celý rámec, neaktivní snímek se aktivuje.
  • Rutina služby přerušení nepřetržitě znovu vykresluje obraz čtením hodnot napětí a zpoždění z aktivní vyrovnávací paměti rámců. Na základě těchto hodnot upravuje pracovní cykly výstupních kolíků. Časovač 1 se používá k měření časové prodlevy s přesností na několik nanosekund, zatímco časovač 2 se používá k řízení pracovního cyklu kolíků.
  • Kolík s největší změnou napětí je vždy „přeplněn“s pracovním cyklem nula nebo 100%, což poskytuje nejrychlejší dobu nabíjení nebo vybíjení. Kolík s menší změnou napětí je poháněn pracovním cyklem zvoleným tak, aby odpovídal času přechodu prvního kolíku-tentokrát je důležité, aby bylo zajištěno, že čáry jsou na osciloskopu nakresleny přímo.

Krok 10: S velkou rychlostí přichází velká odpovědnost

Protože je tato metoda mnohem rychlejší než PWM, proč ji analogWrite () nepoužívá? Protože použití pouze PWM je dost dobré pro většinu programů a je mnohem shovívavější. Metoda „Turbo Charger“však vyžaduje pečlivé kódování a je vhodná pouze pro konkrétní případy:

  1. Je extrémně citlivý na načasování. Jakmile dosáhneme cílové úrovně napětí, hnací kolík musí být okamžitě přepnut do běžného režimu PWM, aby se zabránilo překročení cílového napětí.
  2. Vyžaduje znalost konstanty RC, proto je třeba tyto hodnoty zadat předem. Při nesprávných hodnotách bude načasování špatné a napětí bude nesprávné. U běžného PWM existuje záruka, že se po nějaké době usadíte na správném napětí, i když RC konstanta není známa.
  3. Výpočet přesného časového intervalu pro nabíjení kondenzátoru vyžaduje logaritmické rovnice, které jsou pro výpočet v reálném čase na Arduinu příliš pomalé. Ty musí být předem vypočítány před každým rámcem animace a někde uloženy do mezipaměti.
  4. Programy zabývající se touto metodou musí zápasit s tím, že zpoždění jsou velmi nelineární (ve skutečnosti jsou exponenciální). Cílové napětí poblíž Vcc nebo GND bude trvat o mnoho řádů déle, než dosáhne napětí blízko středu.

K překonání těchto omezení můj kód vektorové grafiky provádí následující věci:

  1. Využívá časovač 1 na 16 kHz a rutinu služby přerušení pro přesnou manipulaci s výstupem a načasování.
  2. Vyžaduje použití konkrétní hodnoty časové konstanty RC, která omezuje výběr hodnot kondenzátoru a odporu.
  3. Ukládá časové zpoždění pro všechny body v animačním rámci do vyrovnávací paměti. To znamená, že rutina, která vypočítává časové zpoždění, běží mnohem pomaleji než rutina služby přerušení, která aktualizuje výstupní kolíky. Jakýkoli daný snímek může být namalován několikrát, než bude připravena k použití nová sada zpoždění pro další snímek.
  4. Použití vyrovnávací paměti klade omezení na počet bodů, které lze nakreslit na snímek. Používám prostorově efektivní kódování, abych co nejlépe využil dostupnou RAM, ale stále je omezen na přibližně 150 bodů. Za více než stovkou bodů by displej stejně začal blikat, takže je to diskutabilní bod!

Doporučuje: