Obsah:

Super rýchle analógové napätie z Arduina: 10 krokov (s obrázkami)
Super rýchle analógové napätie z Arduina: 10 krokov (s obrázkami)

Video: Super rýchle analógové napätie z Arduina: 10 krokov (s obrázkami)

Video: Super rýchle analógové napätie z Arduina: 10 krokov (s obrázkami)
Video: BTT - Manta M8P - TMC2209 UART With Sensorless Homing 2024, Júl
Anonim
Image
Image

Tento návod ukazuje, ako generovať super rýchle zmeny analógového napätia z Arduina a jednoduchého páru rezistorov a kondenzátorov. Jednou z aplikácií, kde je to užitočné, je generovanie grafiky na osciloskope. Existuje niekoľko ďalších projektov, ktoré to urobili. Johngineer ukazuje jednoduchý vianočný stromček pomocou modulácie šírky impulzu (PWM). Iní sa na tomto projekte zdokonalili použitím odporového rebríka alebo použitím vyhradeného čipu prevodníka digitálneho signálu na analógový.

Použitie PWM spôsobuje veľa blikania, zatiaľ čo používanie odporového rebríka alebo prevodníka digitálneho signálu na analógový vyžaduje viac výstupných kolíkov a komponentov, ktoré nemusia byť dostupné. Okruh, ktorý používam, je rovnaký mŕtvy jednoduchý rezistor a kondenzátorový pár ako v predvianočnom strome, ale pracuje s výrazne menším blikaním.

Najprv vás prevediem procesom budovania obvodu. Potom vás naučím, ako pridať svoj vlastný obrázok. Nakoniec predstavím teóriu, čo ju robí rýchlejšie.

Ak sa vám páčil tento návod, zvážte jeho hlasovanie!:)

Krok 1: Budovanie obvodu

Budovanie okruhu
Budovanie okruhu

Na stavbu obvodu budete potrebovať:

a) Arduino založené na Atmel 16MHz ATmega328P, ako napríklad Arduino Uno alebo Arduino Nano.

b) Dva odpory s hodnotou R, ktorá je najmenej 150Ω.

c) Dva kondenzátory s hodnotou C tak, že C = 0,0015 / R, prí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 pre výber týchto hodnôt sú dvojaké. Primárne chceme udržať prúd na kolíkoch Arduina pod maximálnym menovitým prúdom 40mA. Použitie hodnoty 150Ω obmedzuje prúd na 30mA pri použití s napájacím napätím Arduino 5V. Väčšie hodnoty R znížia prúd, a preto sú prijateľné.

Druhým obmedzením je, že chceme udržať časovú konštantu, ktorá je súčinom R a C, rovnajúca sa približne 1,5 ms. Softvér bol špeciálne vyladený pre túto časovú konštantu. Aj keď je možné v softvéri upraviť hodnoty R a C, existuje úzky rozsah, v ktorom to bude fungovať, preto vyberajte komponenty čo najbližšie k navrhovanému pomeru.

Dôkladnejšie vysvetlenie, prečo je RC konštanta dôležitá, bude podané v teoretickej časti, potom, čo som vám ukázal, ako zostaviť demonštračný obvod.

Krok 2: Nastavenie osciloskopu

Nastavenie osciloskopu
Nastavenie osciloskopu

Ukážka vyžaduje osciloskop nastavený na režim X/Y. Testovacie káble je potrebné zapojiť podľa schémy. Váš osciloskop sa bude líšiť od môjho, ale budem postupovať podľa krokov potrebných na nastavenie režimu X/Y na mojej jednotke:

a) Nastavte horizontálny ťah, aby bol ovládaný kanálom B (os X).

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

c) Nastavte napätie/div na oboch kanáloch tak, aby mohlo zobrazovať napätie od 0V do 5V. Svoju som nastavil na 0,5V/div.

d) Nastavte režim spojenia na DC na oboch kanáloch.

e) Nastavte polohu X a Y tak, aby sa bodka nachádzala v ľavom dolnom rohu obrazovky, keď je Arduino vypnuté.

Krok 3: Stiahnite a spustite softvér

Image
Image

Stiahnite si softvér z úložiska Fast Vector Display For Arduino. Softvér je chránený licenciou GNU Affero Public License v3 a je možné ho voľne používať a upravovať podľa podmienok tejto licencie.

V IDE Arduino otvorte súbor „fast-vector-display-arduino.ino“a nahrajte ho do svojho Arduina. Na chvíľu uvidíte na obrazovke osciloskopu animáciu „Šťastný nový rok“.

Tento projekt som vyvinul ako osobný hackaton v týždňoch pred Vianocami, takže existuje vianočná a novoročná správa, ktorú môžete vidieť úpravou premennej PATTERN v kóde.

Krok 4: Vytvorte si vlastnú kresbu

Pochopte, prečo je PWM taký pomalý
Pochopte, prečo je PWM taký pomalý

Ak si chcete vytvoriť svoj vlastný výkres, môžete súradnice bodu prilepiť do náčrtu Arduino na riadku, ktorý definuje USER_PATTERN.

Zistil som, že Inkscape je celkom dobrý nástroj na vytváranie vlastných kresieb:

  1. Vytvárajte text pomocou veľkého, tučného písma, ako je napríklad Impact.
  2. Vyberte textový objekt a v ponuke „Cesta“zvoľte „Objekt na cestu“.
  3. Vyberte jednotlivé písmená a prekrývajte ich, aby ste vytvorili súvislý tvar
  4. Vyberte „Union“z ponuky „Path“a spojte ich do jednej krivky.
  5. Ak sú v nejakých písmenách diery, vyrežte malý zárez nakreslením obdĺžnika nástrojom na obdĺžnik a pomocou nástroja „Rozdiel“ho odčítajte od obrysu.
  6. Dvojitým kliknutím na cestu zobrazíte uzly.
  7. Obdĺžnik vyberte všetky uzly a kliknite na nástroj „Vytvoriť roh vybratých uzlov“.
  8. Uložte súbor SVG.

Dôležité je, aby vaša kresba mala jednu uzavretú cestu a žiadne otvory. Uistite sa, že váš návrh má menej ako asi 130 bodov.

Krok 5: Vložte súradnice zo súboru SVG do Arduino IDE

  1. Otvorte súbor SVG a skopírujte súradnice. Tieto budú vložené do prvku „cesta“. Prvú dvojicu súradníc je možné ignorovať; nahraďte ich 0, 0.
  2. Súradnice vložte do náčrtu Arduino do zátvoriek hneď za „#define USER_PATTERN“.
  3. Nahraďte všetky medzery čiarkami, inak sa zobrazí chyba pri kompilácii. Pomôcť môže nástroj „Nahradiť a nájsť“.
  4. Zostavte a spustite!
  5. Ak máte problémy, sledujte všetky chyby na sériovej konzole. Správy sa zobrazia najmä vtedy, ak má váš vzor príliš veľa bodov pre vnútornú vyrovnávaciu pamäť. V takýchto prípadoch bude obrázok nadmerne blikať.

Krok 6: Pochopte, prečo je PWM taký pomalý

Na začiatok sa pozrime na správanie kondenzátora pri nabíjaní.

Kondenzátor, ktorý je pripojený k zdroju napätia Vcc, zvýši svoje napätie podľa exponenciálnej krivky. Táto krivka je asymptotická, čo znamená, že sa priblíži k cieľovému napätiu. Na všetky praktické účely je napätie „dostatočne blízko“po 5 RC sekundách. RC sa nazýva „časová konštanta“. Ako sme už videli, je to súčin hodnôt odporu a kondenzátora vo vašom obvode. Problém je v tom, že 5 RC je pomerne dlhý čas na aktualizáciu každého bodu na grafickom displeji. To vedie k veľkému blikaniu!

Keď na nabitie kondenzátora použijeme moduláciu šírky impulzu (PWM), nie sme na tom o nič lepšie. S PWM sa napätie rýchlo prepína medzi 0V a 5V. V praxi to znamená, že rýchlo striedame medzi tlačením náboja do kondenzátora a trochou jeho opätovného vytiahnutia - toto tlačenie a ťahanie je niečo ako pokúšať sa bežať maratón tak, že urobíte veľký krok vpred a potom malý krok vzad znova a znova.

Keď to všetko spriemerujete, správanie pri nabíjaní kondenzátora pomocou PWM je úplne rovnaké, ako keby ste na nabíjanie kondenzátora použili stabilné napätie Vpwm. Stále trvá asi 5 RC sekúnd, kým sa dostaneme „dostatočne blízko“k požadovanému napätiu.

Krok 7: Dostaňte sa z a do B, o niečo bit rýchlejšie

Dostaňte sa z a do B, o niečo rýchlejšie
Dostaňte sa z a do B, o niečo rýchlejšie

Predpokladajme, že máme kondenzátor, ktorý je už nabitý do Va. Predpokladajme, že použijeme analogWrite () na zapísanie novej hodnoty b. Aký je minimálny čas, ktorý musíte čakať na dosiahnutie napätia Vb?

Ak ste uhádli 5 RC sekúnd, je to skvelé! Čakaním 5 RC sekúnd sa kondenzátor nabije na takmer Vb. Ale ak chceme, môžeme v skutočnosti čakať o niečo menej.

Pozrite sa na krivku nabíjania. Viete, kondenzátor už bol vo Va, keď sme začali. To znamená, že nemusíme čakať čas t_a. To by sme museli iba vtedy, keby sme kondenzátor nabíjali z nuly.

Tým, že tento čas nečakáme, vidíme zlepšenie. Čas t_ab je v skutočnosti o niečo kratší ako 5 RC.

Ale vydržte, dokážeme to oveľa lepšie! Pozrite sa na všetko to miesto nad v_b. To je rozdiel medzi Vcc, maximálnym napätím, ktoré máme k dispozícii, a Vb, ktoré chceme dosiahnuť. Vidíte, ako nám toto extra napätie môže pomôcť dostať sa tam, kam chceme, oveľa rýchlejšie?

Krok 8: Prejdite z bodu do bodu B s turbodúchadlom

Dostaňte sa z bodu do bodu B s turbodúchadlom!
Dostaňte sa z bodu do bodu B s turbodúchadlom!

To je správne. Namiesto použitia PWM pri cieľovom napätí V_b ho držíme na stabilnom Vcc oveľa, oveľa kratšie časové obdobie. Hovorím tomu metóda Turbo Charger a dostáva nás tam, kam chceme, naozaj, naozaj rýchlo! Po časovom oneskorení (ktoré musíme vypočítať) dupneme na brzdy prepnutím na PWM na V_b. To zabráni tomu, aby napätie prekročilo cieľ.

Touto metódou je možné zmeniť napätie v kondenzátore z V_a na V_b za zlomok času ako pri použití iba PWM. Takto získate miesta, zlatko!

Krok 9: Pochopte kód

Pochopte kódex
Pochopte kódex

Obrázok má hodnotu tisíc slov, diagram preto zobrazuje údaje a operácie, ktoré sa v kóde vykonávajú. Zľava doprava:

  • Grafické údaje sú uložené v programe PROGMEM (tj. Flash pamäť) ako zoznam bodov.
  • Akákoľvek kombinácia operácií translácie, škálovania a otáčania sa skombinuje do matice afinnej transformácie. To sa robí raz na začiatku každého rámca animácie.
  • Body sa načítavajú jeden po druhom z grafických údajov a každý sa vynásobí uloženou transformačnou maticou.
  • Transformované body sú vedené nožnicovým algoritmom, ktorý orezáva všetky body mimo viditeľnú oblasť.
  • Pomocou vyhľadávacej tabuľky oneskorenia RC sú body prevedené na napätie a časové oneskorenia. Tabuľka vyhľadávania oneskorenia RC je uložená v EEPROM a môže byť znovu použitá na viacnásobné spustenie kódu. Pri štarte sa kontroluje správnosť vyhľadávacej tabuľky RC a aktualizujú sa všetky nesprávne hodnoty. Použitie EEPROM šetrí cennú pamäť RAM.
  • Riadiace napätia a oneskorenia sú zapísané do neaktívneho rámca vo vyrovnávacej pamäti rámcov. Vyrovnávacia pamäť rámcov obsahuje priestor pre aktívny rámec a neaktívny rámec. Akonáhle je zapísaný celý rámec, neaktívny rámec sa stane aktívnym.
  • Rutinná služba prerušenia nepretržite kreslí obraz čítaním hodnôt napätia a oneskorení z aktívnej rámcovej vyrovnávacej pamäte. Na základe týchto hodnôt upravuje pracovné cykly výstupných kolíkov. Časovač 1 sa používa na meranie časového oneskorenia s presnosťou na niekoľko nanosekúnd, zatiaľ čo časovač 2 sa používa na riadenie pracovného cyklu kolíkov.
  • Kolík s najväčšou zmenou napätia je vždy „preplnený“s pracovným cyklom nula alebo 100%, čo poskytuje najrýchlejší čas nabíjania alebo vybíjania. Kolík s menšou zmenou napätia je poháňaný pracovným cyklom zvoleným tak, aby zodpovedal času prechodu prvého kolíka-časové prispôsobenie je dôležité, aby sa zabezpečilo, že čiary sú na osciloskope nakreslené priamo.

Krok 10: S veľkou rýchlosťou prichádza veľká zodpovednosť

Keďže je táto metóda oveľa rýchlejšia ako PWM, prečo ju analogWrite () nepoužíva? Pretože používanie iba PWM je dosť dobré pre väčšinu programov a je oveľa zhovievavejšie. Metóda „Turbo Charger“však vyžaduje starostlivé kódovanie a je vhodná iba pre konkrétne prípady:

  1. Je mimoriadne citlivý na načasovanie. Akonáhle dosiahneme cieľovú úroveň napätia, riadiaci kolík musí byť okamžite prepnutý do pravidelného režimu PWM, aby sa zabránilo prekročeniu cieľového napätia.
  2. Vyžaduje to znalosť RC konštanty, preto je potrebné tieto hodnoty zadať vopred. Pri nesprávnych hodnotách bude nesprávne načasovanie a napätie bude nesprávne. Pri bežnom PWM existuje záruka, že sa po určitom čase usadíte na správnom napätí, aj keď RC konštanta nie je známa.
  3. Výpočet presného časového intervalu na nabitie kondenzátora vyžaduje logaritmické rovnice, ktoré sú na výpočet v reálnom čase na Arduine príliš pomalé. Tieto musia byť vopred vypočítané pred každým rámcom animácie a niekde uložené do pamäte cache.
  4. Programy zaoberajúce sa touto metódou musia zápasiť s tým, že oneskorenia sú veľmi nelineárne (sú v skutočnosti exponenciálne). Cieľové napätie v blízkosti Vcc alebo GND bude trvať dosiahnutie rádovo dlhšieho rádu ako napätie v blízkosti stredného bodu.

Aby som prekonal tieto obmedzenia, môj kód vektorovej grafiky robí nasledujúce veci:

  1. Na presnú manipuláciu s výstupom a načasovanie používa časovač 1 na 16 kHz a rutinnú službu prerušenia.
  2. Vyžaduje použitie konkrétnej hodnoty časovej konštanty RC, ktorá obmedzuje výber hodnôt kondenzátora a odporu.
  3. Ukladá časové oneskorenia pre všetky body v animačnom rámci do vyrovnávacej pamäte. To znamená, že rutina, ktorá vypočítava časové oneskorenia, beží oveľa pomalšie ako rutina služby prerušenia, ktorá aktualizuje výstupné kolíky. Akýkoľvek daný rám môže byť namaľovaný niekoľko desiatokkrát, než bude pripravená na použitie nová sada oneskorení pre nasledujúci rám.
  4. Použitie vyrovnávacej pamäte obmedzuje počet bodov, ktoré je možné nakresliť v rámci. Používam priestorovo efektívne kódovanie, aby som čo najlepšie využil dostupnú RAM, ale stále je obmedzený na približne 150 bodov. Po približne stovke bodov by displej aj tak začal blikať, takže je to diskutabilný bod!

Odporúča: