Përmbajtje:

Tensione analoge super të shpejta nga Arduino: 10 hapa (me fotografi)
Tensione analoge super të shpejta nga Arduino: 10 hapa (me fotografi)

Video: Tensione analoge super të shpejta nga Arduino: 10 hapa (me fotografi)

Video: Tensione analoge super të shpejta nga Arduino: 10 hapa (me fotografi)
Video: Оборудование электронщика, от начинающего до профи. Моя подборка 2024, Korrik
Anonim
Image
Image

Ky udhëzues tregon se si të gjeneroni ndryshime super të shpejta të tensionit analog nga një Arduino dhe një çift rezistence dhe kondensatori të thjeshtë. Një aplikacion ku kjo është e dobishme është krijimi i grafikës në një oshiloskop. Ka disa projekte të tjera që e kanë bërë këtë. Johngineer tregon një pemë të thjeshtë të Krishtlindjes duke përdorur modulimin e gjerësisë së pulsit (PWM). Të tjerët janë përmirësuar mbi atë projekt duke përdorur një shkallë rezistence ose duke përdorur një çip konvertues të dedikuar dixhital në analog.

Përdorimi i PWM shkakton shumë dridhje, ndërsa përdorimi i një shkalle rezistence ose një konvertuesi dixhital në analog kërkon më shumë kunja dalëse dhe përbërës që mund të mos jenë të disponueshëm. Qarku që përdor është i njëjti çift i rezistencës dhe kondensatorit të thjeshtë të përdorur si në demonstrimin e pemës së Krishtlindjes, por funksionon me më pak dridhje.

Së pari, unë do t'ju udhëheq përmes procesit të ndërtimit të qarkut. Atëherë unë do t'ju mësoj se si të shtoni imazhin tuaj. Më në fund, unë do të prezantoj teorinë se çfarë e bën atë më të shpejtë.

Nëse ju pëlqeu ky Udhëzues, ju lutemi konsideroni të votoni për të!:)

Hapi 1: Ndërtimi i qarkut

Ndërtimi i qarkut
Ndërtimi i qarkut

Për të ndërtuar qarkun, do t'ju duhet sa vijon:

a) Një Arduino i bazuar në Atmel 16MHz ATmega328P, siç është një Arduino Uno ose Arduino Nano.

b) Dy rezistorë me vlerë R që është të paktën 150Ω.

c) Dy kondensatorë me vlerë C të tillë që C = 0.0015 / R, shembuj:

  • R = 150Ω dhe C = 10μ
  • R = 1.5kΩ dhe C = 1μ
  • R = 15kΩ dhe C = 100nF
  • R = 150kΩ dhe C = 10nF

Arsyet për zgjedhjen e këtyre vlerave janë të dyfishta. Para së gjithash, ne duam ta mbajmë rrymën në kunjat e Arduino nën rrymën maksimale të vlerësuar prej 40mA. Përdorimi i një vlere prej 150Ω kufizon rrymën në 30mA kur përdoret me tensionin e furnizimit Arduino prej 5V. Vlerat më të mëdha të R do të ulin rrymën dhe për këtë arsye janë të pranueshme.

Kufizimi i dytë është se ne duam ta mbajmë kohën konstante, e cila është produkti i R dhe C, i barabartë me rreth 1.5ms. Softueri është akorduar posaçërisht për këtë konstante kohore. Ndërsa është e mundur të rregulloni vlerat e R dhe C në softuer, ekziston një gamë e ngushtë rreth së cilës do të funksionojë, kështu që zgjidhni përbërësit sa më afër raportit të sugjeruar të jetë e mundur.

Një shpjegim më i plotë se pse konstanta RC është e rëndësishme do të jepet në pjesën e teorisë, pasi ju kam treguar se si të montoni qarkun demonstrues.

Hapi 2: Vendosja e Osciloskopit

Vendosja e Osciloskopit
Vendosja e Osciloskopit

Demonstrimi kërkon një oshiloskop të vendosur në modalitetin X/Y. Drejtuesit e provës duhet të lidhen siç tregohet në skemat. Oshiloskopi juaj do të ndryshojë nga imi, por unë do të ec nëpër hapat e nevojshëm për të vendosur modalitetin X/Y në njësinë time:

a) Vendosni që spastrimi horizontal të kontrollohet nga Kanali B (boshti X).

b) Vendoseni oshiloskopin në modalitetin e dy kanaleve.

c) Vendosni volt/div në të dy kanalet në mënyrë që të mund të shfaqë tensione nga 0V në 5V. Unë e vendosa timen në 0.5V/div.

d) Vendosni mënyrën e bashkimit në DC në të dy kanalet.

e) Rregulloni pozicionin e X dhe Y në mënyrë që pika të jetë në këndin e poshtëm të majtë të ekranit kur Arduino të fiket.

Hapi 3: Shkarkoni dhe Drejtoni Softuerin

Image
Image

Shkarkoni softuerin nga depoja e Vektorit të Shpejtë Për Arduino. Softueri është i licencuar sipas Licencës Publike GNU Affero v3 dhe mund të përdoret dhe modifikohet lirshëm sipas kushteve të asaj licence.

Hapni skedarin "fast-vector-display-arduino.ino" në Arduino IDE dhe ngarkoni në Arduino tuaj. Momentalisht, do të shihni një animacion "Gëzuar Vitin e Ri" në ekranin tuaj të oshiloskopit.

Unë e zhvillova këtë projekt si një hackaton personal në javët para Krishtlindjeve, kështu që ekziston një mesazh me temë për Krishtlindjet dhe Vitin e Ri që mund të shihni duke modifikuar ndryshoren PATTERN në kod.

Hapi 4: Krijoni vizatimin tuaj personal

Kuptoni pse PWM është kaq i ngadalshëm
Kuptoni pse PWM është kaq i ngadalshëm

Nëse dëshironi të krijoni vizatimin tuaj, mund të ngjitni koordinatat e pikave në skicën Arduino në vijën që përcakton USER_PATTERN.

Kam gjetur se Inkscape është një mjet mjaft i mirë për të bërë një vizatim me porosi:

  1. Krijoni tekst duke përdorur një font të madh dhe të guximshëm siç është Impact.
  2. Zgjidhni objektin e tekstit dhe zgjidhni "Objekti në rrugën" nga menyja "Rruga".
  3. Zgjidhni shkronjat individuale dhe mbivendosni ato për të bërë një formë të lidhur
  4. Zgjidhni "Bashkimi" nga menyja "Rruga" për t'i kombinuar ato në një kurbë të vetme.
  5. Nëse ka vrima në ndonjë shkronjë, prerë një nivel të vogël duke vizatuar një drejtkëndësh me mjetin drejtkëndësh dhe zbriteni atë nga kontura duke përdorur mjetin "Diferenca".
  6. Klikoni dy herë rrugën për të treguar nyjet.
  7. Drejtkëndësh zgjidhni të gjitha nyjet dhe klikoni mjetin "Bëni cepin e zgjedhur të nyjeve".
  8. Ruani skedarin SVG.

Gjëja e rëndësishme është që vizatimi juaj duhet të ketë një shteg të vetëm të mbyllur dhe pa vrima. Sigurohuni që dizajni juaj të ketë më pak se rreth 130 pikë.

Hapi 5: Ngjitni Koordinatat Nga Skedari SVG Në Arduino IDE

  1. Hapni skedarin SVG dhe kopjoni koordinatat. Këto do të nguliten në elementin "rrugë". Çifti i parë i koordinatave mund të injorohet; zëvendësojini ato me 0, 0.
  2. Ngjitni koordinatat në skicën Arduino brenda kllapave menjëherë pas "#define USER_PATTERN".
  3. Zëvendësoni të gjitha hapësirat me presje, përndryshe do të merrni një gabim të përpilimit. Mjeti "Zëvendëso & Gjej" mund të jetë i dobishëm.
  4. Përpiloni dhe vraponi!
  5. Nëse keni probleme, shikoni tastierën serike për ndonjë gabim. Në veçanti, do të shihni mesazhe nëse modeli juaj ka shumë pika për tamponin e brendshëm. Në raste të tilla, imazhi do të shfaqë dridhje të tepërt.

Hapi 6: Kuptoni pse PWM është kaq i ngadalshëm

Për të filluar, le të rishikojmë sjelljen e një kondensatori ndërsa po karikohet.

Një kondensator i lidhur me një burim tensioni Vcc do të rrisë tensionin e tij sipas një kurbë eksponenciale. Kjo kurbë është asimptotike, që do të thotë se do të ngadalësohet ndërsa i afrohet tensionit të synuar. Për të gjitha qëllimet praktike, voltazhi është "mjaft afër" pas 5 sekondash RC. RC quhet "konstante e kohës". Siç e pamë më herët, është produkt i vlerave të rezistencës dhe kondensatorit në qarkun tuaj. Problemi është se 5 RC është një kohë mjaft e gjatë për azhurnimin e secilës pikë në një ekran grafik. Kjo çon në shumë dridhje!

Kur përdorim modulimin e gjerësisë së impulsit (PWM) për të ngarkuar një kondensator, nuk jemi më mirë. Me PWM tensioni kalon me shpejtësi midis 0V dhe 5V. Në praktikë, kjo do të thotë që ne alternojmë me shpejtësi midis shtyrjes së ngarkesës në kondensator dhe tërheqjes së tij pak nga e para përsëri - kjo shtytje dhe tërheqje është më tepër si të përpiqesh të vraposh një maratonë duke bërë një hap të madh përpara dhe pastaj një hap prapa pa pushim.

Kur i mesatarizoni të gjitha, sjellja e karikimit të një kondensatori duke përdorur PWM është saktësisht e njëjtë sikur të kishit përdorur një tension të qëndrueshëm të Vpwm për të ngarkuar kondensatorin. Na duhen akoma rreth 5 sekonda RC që të afrohemi "mjaftueshëm" në tensionin e dëshiruar.

Hapi 7: Shkoni nga a në B, pak më shpejt

Shkoni nga a në B, pak më shpejt
Shkoni nga a në B, pak më shpejt

Supozoni se kemi një kondensator që tashmë është i ngarkuar deri në Va. Supozoni se përdorim analogWrite () për të shkruar vlerën e re të b. Cila është koha minimale që duhet të prisni për të arritur tensionin Vb?

Nëse keni menduar 5 sekonda RC, kjo është e mrekullueshme! Duke pritur 5 sekonda RC, kondensatori do të ngarkohet në pothuajse Vb. Por nëse duam, në fakt mund të presim pak më pak.

Shikoni kurbën e ngarkesës. E shihni, kondensatori ishte tashmë në Va kur filluam. Kjo do të thotë që ne nuk duhet të presim kohën t_a. Do të na duhej vetëm nëse po e ngarkonim kondensatorin nga zero.

Pra, duke mos pritur atë kohë, ne shohim një përmirësim. Koha t_ab është në të vërtetë pak më e shkurtër se 5 RC.

Por duroni, ne mund të bëjmë shumë më mirë! Shikoni gjithë atë hapësirë sipër v_b. Ky është ndryshimi midis Vcc, tensionit maksimal të disponueshëm për ne dhe Vb që synojmë të arrijmë. A mund ta shihni se si ai tension shtesë mund të na ndihmojë të arrijmë atje ku duam të shkojmë shumë më shpejt?

Hapi 8: Kaloni nga a në B, me një karikues Turbo

Shkoni nga a në B, me një karikues Turbo!
Shkoni nga a në B, me një karikues Turbo!

Kjo është e drejtë. Në vend që të përdorim PWM në tensionin e synuar V_b, ne e mbajmë atë në një Vcc të qëndrueshëm për një periudhë shumë, shumë më të shkurtër kohore. Unë e quaj këtë metodë Turbo Charger dhe na çon atje ku duam të shkojmë vërtet, vërtet shpejt! Pas vonesës kohore (të cilën ne duhet ta llogarisim), ne godasim frenat duke kaluar në PWM në V_b. Kjo mban tensionin nga tejkalimi i objektivit.

Me këtë metodë, është e mundur të ndryshoni tensionin në kondensator nga V_a në V_b në një pjesë të kohës sesa të përdorni vetëm PWM. Kështu i gjen vendet, zemër!

Hapi 9: Kuptoni Kodin

Kuptoni Kodin
Kuptoni Kodin

Një fotografi vlen sa një mijë fjalë, kështu që diagrami tregon të dhënat dhe operacionet që kryhen në kod. Nga e majta në të djathtë:

  • Të dhënat grafike ruhen në PROGMEM (domethënë flash memorie) si një listë pikash.
  • Çdo kombinim i operacioneve të përkthimit, shkallëzimit dhe rrotullimit kombinohen në një matricë transformimi afine. Kjo bëhet një herë në fillim të çdo kornize animacioni.
  • Pikat lexohen një nga një nga të dhënat grafike dhe secila shumëzohen me matricën e transformimit të ruajtur.
  • Pikat e transformuara ushqehen përmes një algoritmi gërshërë që mbjell çdo pikë jashtë zonës së dukshme.
  • Duke përdorur një tabelë të kërkimit të vonesës RC, pikat konvertohen në tensione të vozitjes dhe vonesa në kohë. Tabela e kërkimit të vonesës RC ruhet në EEPROM dhe mund të ripërdoret për ekzekutime të shumta të kodit. Në fillimin, tabela e kërkimit RC kontrollohet për saktësinë dhe çdo vlerë e pasaktë azhurnohet. Përdorimi i EEPROM kursen memorie të vlefshme RAM.
  • Tensionet dhe vonesat e drejtimit shkruhen në kornizën joaktive në tamponin e kornizës. Tamponi i kornizës përmban hapësirë për një kornizë aktive dhe një kornizë joaktive. Pasi të shkruhet një kornizë e plotë, korniza joaktive bëhet aktive.
  • Një rutinë e shërbimit të ndërprerë ri-vizaton vazhdimisht figurën duke lexuar vlerat e tensionit dhe vonesat nga tamponi aktiv i kornizës. Bazuar në ato vlera, ai rregullon ciklet e punës të kunjave të daljes. Kohëmatësi 1 përdoret për matjen e vonesës kohore deri në disa nanosekonda të saktësisë, ndërsa kohëmatësi 2 përdoret për kontrollin e ciklit të punës të kunjave.
  • Kunja me ndryshimin më të madh të tensionit është gjithmonë "e ngarkuar me turbo" me një cikël pune zero ose 100%, duke siguruar kohën më të shpejtë të ngarkimit ose shkarkimit. Kunja me një ndryshim më të vogël të tensionit drejtohet me një cikël detyre të zgjedhur për të përputhur me kohën e kalimit të kunjit të parë-kjo përputhje e kohës është e rëndësishme për të siguruar që linjat të tërhiqen drejt në oshiloskop.

Hapi 10: Me shpejtësi të madhe, vjen përgjegjësi e madhe

Meqenëse kjo metodë është shumë më e shpejtë se PWM, pse nuk e përdor analogWrite ()? Epo, sepse përdorimi i vetëm PWM është mjaft i mirë për shumicën e programeve dhe është shumë më falës. Metoda "Turbo Charger", megjithatë, kërkon kodim të kujdesshëm dhe është i përshtatshëm vetëm për raste të veçanta:

  1. Extremelyshtë jashtëzakonisht e ndjeshme ndaj kohës. Pasi të arrijmë nivelin e tensionit të synuar, kunja e drejtimit duhet të kalojë menjëherë në modalitetin e rregullt PWM në mënyrë që të shmangë tejkalimin e tensionit të synuar.
  2. Kërkon njohje të konstantës RC, kështu që këto vlera duhet të futen paraprakisht. Me vlera të pasakta, koha do të jetë e gabuar dhe tensionet do të jenë të pasakta. Me PWM të rregullt, ekziston një garanci që do të vendoseni në tensionin e duhur pas ca kohësh, edhe nëse konstanta RC nuk dihet.
  3. Llogaritja e intervalit të saktë kohor për ngarkimin e kondensatorit kërkon ekuacione logaritmike të cilat janë shumë të ngadalta për llogaritjen në kohë reale në Arduino. Këto duhet të llogariten paraprakisht para çdo kornize animacioni dhe të ruhen diku në kujtesë.
  4. Programet që merren me këtë metodë duhet të luftojnë me faktin se vonesat janë shumë jo-lineare (ato janë, në fakt, eksponenciale). Tensionet e synuara pranë Vcc ose GND do të marrin shumë urdhra të madhësisë më shumë për të arritur sesa tensionet pranë pikës së mesme.

Për të kapërcyer këto kufizime, kodi im grafik vektorik bën gjërat e mëposhtme:

  1. Ai përdor Timer 1 në 16kHz dhe një rutinë shërbimi ndërprerje për manipulimin dhe kohën e saktë të prodhimit.
  2. Kërkon që të përdoret një vlerë specifike e konstantës kohore të RC, duke kufizuar zgjedhjet e vlerave të kondensatorit dhe rezistencës.
  3. Ai ruan vonesat e kohës për të gjitha pikat në një kornizë animacioni në një tampon të kujtesës. Kjo do të thotë rutina që llogarit vonesat e kohës shkon me një ritëm shumë më të ngadaltë sesa rutina e shërbimit të ndërprerë që përditëson kunjat e daljes. Çdo kornizë e dhënë mund të pikturohet disa dhjetëra herë para se një grup i ri vonesash për kornizën tjetër të jetë gati për t'u përdorur.
  4. Përdorimi i një tamponi memorie vë një kufizim në numrin e pikave që mund të vizatohen për kuadër. Unë përdor një kodim efikas të hapësirës për të përfituar sa më shumë nga RAM -i i disponueshëm, por ai është akoma i kufizuar në rreth 150 pikë. Përtej njëqind e më shumë pikave apo më shumë, ekrani do të fillonte të dridhej gjithsesi, kështu që është një pikë e diskutueshme!

Recommended: