Tartalomjegyzék:

Szupergyors analóg feszültségek az Arduino -tól: 10 lépés (képekkel)
Szupergyors analóg feszültségek az Arduino -tól: 10 lépés (képekkel)

Videó: Szupergyors analóg feszültségek az Arduino -tól: 10 lépés (képekkel)

Videó: Szupergyors analóg feszültségek az Arduino -tól: 10 lépés (képekkel)
Videó: Complete Guide for 15A 400W MOSFET AOD4184A to control motor or load 2024, Július
Anonim
Image
Image

Ez az utasítás bemutatja, hogyan lehet szupergyors analóg feszültségváltozásokat generálni egy Arduino, valamint egy egyszerű ellenállás és kondenzátor párból. Az egyik alkalmazás, ahol ez hasznos, grafikák generálása oszcilloszkópon. Több más projekt is ezt tette. A Johngineer egy egyszerű karácsonyfát mutat be impulzusszélesség -modulációval (PWM). Mások továbbfejlesztették ezt a projektet egy ellenállás létra vagy egy dedikált digitális-analóg átalakító chip használatával.

A PWM használata sok villódzást okoz, míg az ellenállás létra vagy a digitális-analóg átalakító használata több kimeneti tüskét és alkatrészeket igényel, amelyek esetleg nem állnak rendelkezésre. Az általam használt áramkör ugyanaz a holt egyszerű ellenállás és kondenzátor pár, mint a karácsonyfa bemutatójában, de lényegesen kevesebb villódzással működik.

Először is végigvezetem az áramkör felépítésének folyamatán. Akkor megtanítom, hogyan adhat hozzá saját képet. Végül bemutatom azt az elméletet, hogy mi teszi gyorsabbá.

Ha tetszett ez az Instructable, akkor fontolja meg a szavazást!:)

1. lépés: Az áramkör építése

A pálya építése
A pálya építése

Az áramkör felépítéséhez a következőkre lesz szüksége:

a) Arduino, amely az Atmel 16MHz ATmega328P alapú, például Arduino Uno vagy Arduino Nano.

b) Két R értékű ellenállás, amely legalább 150Ω.

c) Két C értékű kondenzátor, C = 0,0015 / R, példák:

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

Ezen értékek kiválasztásának kettős oka van. Elsősorban az Arduino csapjain lévő áramot szeretnénk a maximális 40 mA névleges áram alatt tartani. A 150Ω érték használata az áramot 30 mA -re korlátozza, ha 5 V -os Arduino tápfeszültséggel használja. A nagyobb R értékek csökkentik az áramot, ezért elfogadhatók.

A második megkötés az, hogy az időt állandó értéken szeretnénk tartani, ami R és C szorzata, körülbelül 1,5 ms. A szoftvert kifejezetten erre az időállandóra hangolták. Bár a szoftverben lehetőség van az R és C értékek módosítására, egy szűk tartományban fog működni, ezért válassza ki az összetevőket a javasolt arányhoz közel.

Az elmélet részben részletesebb magyarázatot adunk arra, hogy miért fontos az RC állandó, miután bemutattam a bemutató áramkör összeállítását.

2. lépés: Az oszcilloszkóp beállítása

Az oszcilloszkóp beállítása
Az oszcilloszkóp beállítása

A bemutatóhoz X/Y módba állított oszcilloszkóp szükséges. A mérővezetékeket a kapcsolási rajzok szerint kell csatlakoztatni. Az oszcilloszkópja eltér az enyémtől, de végigjárom az X/Y mód beállításához szükséges lépéseket a készüléken:

a) Állítsa be a vízszintes söprést a B csatorna (X tengely) vezérlésére.

b) Állítsa az oszcilloszkópot kétcsatornás üzemmódba.

c) Állítsa be a feszültséget/div mindkét csatornán úgy, hogy 0V és 5V közötti feszültséget tudjon megjeleníteni. Az enyémet 0,5V/div -ra állítottam.

d) Állítsa a csatolási módot DC -re mindkét csatornán.

e) Állítsa be X és Y helyzetét úgy, hogy a pont a képernyő bal alsó sarkában legyen, amikor az Arduino ki van kapcsolva.

3. lépés: Töltse le és futtassa a szoftvert

Image
Image

Töltse le a szoftvert az Arduino gyors vektoros kijelzőjéről. A szoftver a GNU Affero Public License v3 licencével rendelkezik, és szabadon használható és módosítható az adott licenc feltételei szerint.

Nyissa meg a "fast-vector-display-arduino.ino" fájlt az Arduino IDE-ben, és töltse fel az Arduino-ra. Pillanatnyilag "Boldog új évet" animáció jelenik meg az oszcilloszkóp képernyőjén.

Ezt a projektet személyes hackatonként dolgoztam ki a karácsony előtti hetekben, ezért van egy karácsonyi és újévi témájú üzenet, amelyet a PATTERN változó módosításával láthat.

4. lépés: Hozza létre saját egyéni rajzát

Értsd meg, miért olyan lassú a PWM
Értsd meg, miért olyan lassú a PWM

Ha saját rajzot szeretne létrehozni, akkor illessze be a pontkoordinátákat az Arduino vázlatba az USER_PATTERN -t meghatározó vonalon.

Azt tapasztaltam, hogy az Inkscape nagyon jó eszköz egyéni rajz készítéséhez:

  1. Hozzon létre szöveget egy nagy, vastag betűtípussal, például az Impact használatával.
  2. Válassza ki a szöveges objektumot, és válassza az "Object to Path" elemet az "Path" menüből.
  3. Válassza ki az egyes betűket, és fedje át őket, hogy összekapcsolt alakzatot hozzon létre
  4. Válassza az "Unió" lehetőséget az "Útvonal" menüből, hogy egyetlen görbévé egyesítse őket.
  5. Ha lyukak vannak a betűkben, vágjon egy kis bevágást úgy, hogy a téglalap eszközzel téglalapot rajzol, és kivonja a kontúrból a "Különbség" eszköz segítségével.
  6. A csomópontok megjelenítéséhez kattintson duplán az elérési útra.
  7. Válassza ki az összes csomópontot téglalap alakban, majd kattintson a "Kijelölt csomópontok létrehozása sarokba" eszközre.
  8. Mentse az SVG fájlt.

A lényeg az, hogy a rajz egyetlen zárt utat és lyukakat ne tartalmazzon. Győződjön meg arról, hogy a terv kevesebb mint 130 pontot tartalmaz.

Lépés: Illessze be a koordinátákat az SVG fájlból az Arduino IDE -be

  1. Nyissa meg az SVG fájlt, és másolja ki a koordinátákat. Ezek be lesznek ágyazva az "útvonal" elembe. Az első koordinátapár figyelmen kívül hagyható; cserélje ki őket 0, 0 -val.
  2. Illessze be a koordinátákat a zárójelben lévő Arduino -vázlatba közvetlenül a "#define USER_PATTERN" után.
  3. Cserélje ki az összes szóközt vesszővel, különben fordítási hibát kap. A "Csere és keresés" eszköz hasznos lehet.
  4. Fordítsa össze és futtassa!
  5. Ha problémái vannak, nézze meg a soros konzolt az esetleges hibákért. Különösen akkor láthat üzeneteket, ha a mintája túl sok pontot tartalmaz a belső pufferhez. Ilyen esetekben a kép túlzottan vibrál.

6. lépés: Értse meg, miért olyan lassú a PWM

Először nézzük át a kondenzátor viselkedését töltés közben.

A Vcc feszültségforráshoz csatlakoztatott kondenzátor exponenciális görbe szerint növeli feszültségét. Ez a görbe aszimptotikus, vagyis lassulni fog, amint megközelíti a célfeszültséget. Minden gyakorlati célból a feszültség "elég közel" van 5 RC másodperc után. Az RC -t "időállandónak" nevezik. Amint azt korábban láttuk, ez az áramkörben lévő ellenállás és kondenzátor értékeinek szorzata. A probléma az, hogy az 5 RC meglehetősen hosszú idő a grafikus kijelző egyes pontjainak frissítéséhez. Ez sok villódzáshoz vezet!

Ha impulzusszélesség -modulációt (PWM) használunk a kondenzátor feltöltésére, akkor sem vagyunk jobb helyzetben. A PWM segítségével a feszültség gyorsan vált 0V és 5V között. A gyakorlatban ez azt jelenti, hogy gyorsan felváltva töltjük a töltést a kondenzátorba, és húzzunk ki belőle egy kicsit - ez a lökés és húzás inkább olyan, mintha egy nagy lépést előre, majd egy kis lépést hátrálva próbálnánk lefutni egy maratont. újra és újra.

Ha mindent átlagol, a kondenzátor PWM használatával való töltése pontosan ugyanaz, mint ha állandó Vpwm feszültséget használt volna a kondenzátor töltésére. Még mindig körülbelül 5 RC másodperc szükséges ahhoz, hogy "elég közel" érjük el a kívánt feszültséget.

7. lépés: Menj el a -ból B -be, Tad Bit gyorsabban

Menj el a -ból B -be, Tad egy kicsit gyorsabban
Menj el a -ból B -be, Tad egy kicsit gyorsabban

Tegyük fel, hogy van egy kondenzátorunk, amely már fel van töltve Va -ig. Tegyük fel, hogy az analogWrite () segítségével írjuk ki a b új értékét. Mennyi ideig kell várni a Vb feszültség elérésére?

Ha 5 RC másodpercet tippelt, az nagyszerű! Az 5 RC másodperc várakozással a kondenzátort nagyon közel Vb -ra töltik fel. De ha akarjuk, akkor egy kicsit kevesebbet várhatunk.

Nézd meg a töltési görbét. Látod, a kondenzátor már Va -nál volt, amikor elkezdtük. Ez azt jelenti, hogy nem kell várnunk a t_a időre. Csak akkor kellene, ha nulláról töltenénk a kondenzátort.

Tehát ha nem várjuk meg ezt az időt, javulást látunk. A t_ab idő valójában valamivel rövidebb, mint 5 RC.

De tarts ki, sokkal többet tudunk csinálni! Nézze meg ezt a helyet a v_b felett. Ez a különbség a Vcc, a rendelkezésünkre álló maximális feszültség és az elérni kívánt Vb között. Látod, hogyan segíthet ez az extra feszültség sokkal gyorsabban eljutni oda, ahová szeretnénk?

8. lépés: A -ból B -be, turbófeltöltővel

A turbó töltővel juthat el a -ból a B -be!
A turbó töltővel juthat el a -ból a B -be!

Úgy van. Ahelyett, hogy a PWM -et V_b célfeszültség mellett használnánk, sokkal -sokkal rövidebb ideig állandó Vcc -n tartjuk. Ezt Turbo Charger módszernek hívom, és nagyon -nagyon gyorsan eljutunk oda, ahová szeretnénk menni! Az időkésleltetés után (amit ki kell számolnunk), a fékeket lecsapjuk, átkapcsolva a PWM -re V_b -nél. Ez megakadályozza, hogy a feszültség túlszárnyalja a célt.

Ezzel a módszerrel lehetőség van a kondenzátor feszültségének V_a -ról V_b -re történő megváltoztatására az idő töredéke alatt, mint csak a PWM használatával. Így szerezhet helyet, kicsim!

9. lépés: A kód megértése

Értsd meg a kódexet
Értsd meg a kódexet

Egy kép ezer szónál többet ér, így a diagram az adatokat és a kódban végrehajtott műveleteket mutatja. Balról jobbra:

  • A grafikus adatokat a PROGMEM (azaz flash memória) tárolja pontok listájaként.
  • A fordítási, skálázási és forgatási műveletek bármely kombinációja egy affin transzformációs mátrixba kerül. Ezt minden animációs keret elején egyszer kell elvégezni.
  • A pontokat egyenként olvassák le a grafikus adatokból, és mindegyiket megszorozzák a tárolt transzformációs mátrixszal.
  • Az átalakított pontokat ollózó algoritmuson keresztül tápláljuk, amely a látható területen kívül minden pontot levág.
  • Az RC késleltetési táblázat segítségével a pontokat menetfeszültséggé és időkésleltetéssé alakítják át. Az RC késleltetési tábla az EEPROM-ban van tárolva, és újra felhasználható a kód többszöri futtatásához. Indításkor az RC keresési tábla pontossága ellenőrizve van, és a helytelen értékek frissülnek. Az EEPROM használata értékes RAM memóriát takarít meg.
  • A hajtási feszültségeket és késleltetéseket a keretpuffer inaktív keretébe írják. A keretpuffer helyet tartalmaz egy aktív keretnek és egy inaktív keretnek. A teljes keret megírása után az inaktív keret aktívvá válik.
  • Egy megszakítási szolgáltatási rutin folyamatosan újrarajzolja a képet a feszültségértékek és a késleltetések kiolvasásával az aktív keretpufferből. Ezen értékek alapján módosítja a kimeneti csapok működési ciklusait. Az 1. időzítőt az időkésleltetés néhány nanosekundum pontosságú mérésére használják, míg a 2. időzítőt a csapok életciklusának szabályozására.
  • A legnagyobb feszültségváltozással rendelkező csap mindig "turbófeltöltésű", nulla vagy 100%-os üzemidővel, ami a leggyorsabb töltési vagy kisülési időt biztosítja. A kisebb feszültségváltozással rendelkező csapot az első csapszeg átmeneti idejének megfelelően választott működési ciklussal hajtják meg-ez az időbeosztás fontos annak biztosítása érdekében, hogy a vonalak egyenesen húzódjanak az oszcilloszkópon.

10. lépés: Nagy sebességgel, nagy felelősséggel jár

Mivel ez a módszer sokkal gyorsabb, mint a PWM, miért nem használja az analogWrite ()? Nos, mert csak a PWM használata elég jó a legtöbb programhoz, és sokkal megbocsátóbb. A "Turbo Charger" módszer azonban gondos kódolást igényel, és csak bizonyos esetekben alkalmas:

  1. Rendkívül érzékeny az időzítésre. Amint elértük a célfeszültség szintjét, a hajtótüskét azonnal normál PWM üzemmódba kell kapcsolni, hogy elkerüljük a célfeszültség túllépését.
  2. Ehhez szükség van az RC állandó ismeretére, ezért ezeket az értékeket előre be kell írni. Helytelen értékek esetén az időzítés és a feszültségek helytelenek lesznek. Rendszeres PWM esetén garantált, hogy egy idő után a megfelelő feszültségre áll, még akkor is, ha az RC állandó nem ismert.
  3. A kondenzátor töltésének pontos időintervallumának kiszámításához olyan logaritmikus egyenletekre van szükség, amelyek túl lassúak az Arduino valós idejű számításához. Ezeket minden animációs keret előtt előre ki kell számítani, és valahol gyorsítótárazni kell a memóriában.
  4. Az ezzel a módszerrel foglalkozó programoknak szembe kell nézniük azzal a ténnyel, hogy a késések nagyon nem lineárisak (valójában exponenciálisak). A Vcc vagy GND közelében lévő célfeszültségek elérése sok nagyságrenddel tovább tart, mint a középpont közelében.

Ezen korlátok leküzdése érdekében a vektorgrafikus kódom a következőket teszi:

  1. Az 1. időzítőt 16 kHz -en és megszakítási szolgáltatási rutinot használja a pontos kimeneti manipulációhoz és időzítéshez.
  2. Ez megköveteli az RC időállandó meghatározott értékének használatát, korlátozva a kondenzátor és az ellenállás értékeit.
  3. Memóriapufferben tárolja az animációs keret összes pontjának késleltetését. Ez azt jelenti, hogy az időkésleltetéseket kiszámító rutin sokkal lassabban fut, mint a megszakítási szolgáltatási rutin, amely frissíti a kimeneti csapokat. Bármelyik keret több tucatszor festhető, mielőtt a következő keret új késleltetése készen áll a használatra.
  4. A memóriapuffer használata korlátozza a képkockánként húzható pontok számát. Helytakarékos kódolást alkalmazok, hogy a legtöbbet hozzam ki a rendelkezésre álló RAM -ból, de még mindig csak 150 pontra van korlátozva. Körülbelül száz ponton túl a kijelző úgyis villogni kezd, szóval vitatott!

Ajánlott: