Мазмуну:

Arduinoдон супер тез аналогдук чыңалуу: 10 кадам (сүрөттөр менен)
Arduinoдон супер тез аналогдук чыңалуу: 10 кадам (сүрөттөр менен)

Video: Arduinoдон супер тез аналогдук чыңалуу: 10 кадам (сүрөттөр менен)

Video: Arduinoдон супер тез аналогдук чыңалуу: 10 кадам (сүрөттөр менен)
Video: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Июль
Anonim
Image
Image

Бул Instructable кантип Arduino жана жөнөкөй резистор менен конденсатор жупунан аналогдук чыңалуу өзгөрүүлөрүн кантип түзүүнү көрсөтөт. Бул пайдалуу болгон бир колдонмо осциллографта графика түзүү. Муну кылган дагы бир нече долбоорлор бар. Johngineer пульстун туурасы модуляциясын (PWM) колдонуп, жөнөкөй балатыны көрсөтөт. Башкалары резистордук тепкичти колдонуу менен же атайын санариптен аналогго айландыруучу чипти колдонуу менен бул долбоорду жакшыртышты.

PWMди колдонуу көп жылтылдатууга алып келет, ал эми резистордук тепкичти же санариптен аналогдук алмаштыргычты колдонууда дагы жеткиликтүү болбошу мүмкүн болгон көбүрөөк чыканактар жана компоненттер талап кылынат. Мен колдонгон схема - бул жаңы жылдык балатынын демосунда колдонулган эле жөнөкөй резистор жана конденсатор жубу, бирок анча -мынча жылтылдоо менен иштейт.

Биринчиден, мен сизге схеманы куруу процессинде жол көрсөтөм. Анда мен сизге өз сүрөтүңүздү кантип кошууну үйрөтөм. Акыр -аягы, мен аны тезирээк кылган теориясы менен тааныштырам.

Эгерде сиз бул Нускаманы жактырсаңыз, ага добуш берүүнү карап көрүңүз!:)

1 -кадам: Районду куруу

Районду куруу
Районду куруу

Районду куруу үчүн сизге төмөнкүлөр керек болот:

а) Atmel 16MHz ATmega328P негизиндеги Arduino, мисалы Arduino Uno же Arduino Nano.

б) R value маанисиндеги эки резистор, жок дегенде 150Ω.

c) C мааниси бар эки конденсатор C = 0.0015 / R, мисалдар:

  • R = 150Ω жана C = 10µ
  • R = 1.5kΩ жана C = 1µ
  • R = 15kΩ жана C = 100nF
  • R = 150kΩ жана C = 10nF

Бул баалуулуктарды тандоонун себептери эки эсе. Биринчиден, биз Arduino казыктарында 40мА максималдуу бааланган токтон төмөн болгубуз келет. 150Ω маанисин колдонуу 5V Arduino камсыздоо чыңалуусу менен колдонулганда токту 30мАга чейин чектейт. R чоңураак мааниси токту төмөндөтөт, ошондуктан кабыл алынат.

Экинчи чектөө - бул убакыттын туруктуу болушун каалайбыз, бул R жана C продуктусу, болжол менен 1,5 мс. Программалык камсыздоо атайын ушул убакыт үчүн туруктуу жөнгө салынган. Программада R жана C маанилерин тууралоо мүмкүн болсо да, анын иштей турган тар диапазону бар, андыктан мүмкүн болушунча сунушталган катышка жакын компоненттерди тандаңыз.

Мен сизге демонстрациялык схеманы кантип чогултуу керектигин көрсөткөндөн кийин, RC константасы эмне үчүн маанилүү экени жөнүндө көбүрөөк түшүндүрмө теориялык бөлүмдө берилет.

2 -кадам: Осциллографты орнотуу

Осциллографты орнотуу
Осциллографты орнотуу

Демонстрация X/Y режимине коюлган осциллографты талап кылат. Сыноо өткөргүчтөр схемада көрсөтүлгөндөй туташтырылышы керек. Сиздин осциллограф меникинен айырмаланат, бирок мен бирдигимде X/Y режимин орнотуу үчүн керектүү кадамдарды жасайм:

а) Горизонталдык шыпырууну В каналы (X огу) тарабынан башкарыла турган кылып коюңуз.

б) Осциллографты кош канал режимине коюңуз.

в) Вольтту/дивизияны эки каналда теңдеңиз, анткени ал 0Вдон 5Вга чейинки чыңалууларды көрсөтө алат. Мен өзүмдү 0.5V/div деп койдум.

г) кошуу режимин эки каналда тең DCге коюңуз.

д) Arduino өчүрүлгөндө чекит экрандын төмөнкү сол бурчунда тургандай кылып X жана Y позицияларын тууралаңыз.

3 -кадам: Программаны жүктөө жана иштетүү

Image
Image

Программаны Arduino кампасы үчүн Fast Vector Displayден жүктөп алыңыз. Программалык камсыздоо GNU Affero Public License v3 астында лицензияланган жана ошол лицензиянын шарттары боюнча эркин колдонулушу жана өзгөртүлүшү мүмкүн.

Arduino IDEдеги "fast-vector-display-arduino.ino" файлын ачыңыз жана Arduinoго жүктөңүз. Көз ирмемде сиз осциллографтын экранында "Жаңы жылыңыз менен" анимациясын көрөсүз.

Мен бул долбоорду Рождествого чейинки апталарда жеке хакатон катары иштеп чыктым, андыктан коддогу PATTERN өзгөрмөсүн өзгөртүү аркылуу көрө турган Рождество жана Жаңы жылдык тематикалык билдирүү бар.

4 -кадам: Өзүңүздүн жеке сүрөтүңүздү түзүңүз

Эмне үчүн PWM ушунчалык жай экенин түшүнүңүз
Эмне үчүн PWM ушунчалык жай экенин түшүнүңүз

Эгерде сиз өзүңүздүн чиймеңизди түзгүңүз келсе, анда чекит координаттарын USER_PATTERN аныктоочу сызыкка Arduino эскизине чаптай аласыз.

Мен Inkscape ыңгайлаштырылган сүрөт тартуу үчүн абдан жакшы инструмент экенин таптым:

  1. Impact сыяктуу чоң, жоон шрифттин жардамы менен текст түзүңүз.
  2. Текст объектисин тандап, "Path" менюсунан "Object to Path" тандаңыз.
  3. Жеке тамгаларды тандап, бири -бирине туташкан форма жасоо үчүн бири -бирин кайталаңыз
  4. Аларды бир ийри сызыкка бириктирүү үчүн "Жол" менюсунан "Союзду" тандаңыз.
  5. Эгерде кандайдыр бир тамгаларда тешиктер бар болсо, тик бурчтук куралы менен тик бурчтук чийип, кичинекей оюкту кесип, "Айырмасы" куралы менен контурдан алып салыңыз.
  6. Түйүндөрдү көрсөтүү үчүн жолду эки жолу чыкылдатыңыз.
  7. Төрт бурчтук бардык түйүндөрдү тандап, "Тандалган түйүндөрдүн бурчун жаса" куралын басыңыз.
  8. SVG файлын сактаңыз.

Маанилүүсү, сиздин чиймеңизде бир гана жабык жол жана тешиктер жок болушу керек. Дизайныңызда болжол менен 130дан аз упай бар экенине ынаныңыз.

5 -кадам: SVG файлынан координаттарды Arduino IDEге чаптаңыз

  1. SVG файлын ачыңыз жана координаттарын көчүрүп алыңыз. Булар "жол" элементине киргизилет. Биринчи жуп координаттарды этибарга албай коюуга болот; аларды 0, 0 менен алмаштырыңыз.
  2. "#Define USER_PATTERN" кийин координаттарды кашаалар ичиндеги Arduino эскизине чаптаңыз.
  3. Бардык боштуктарды үтүр менен алмаштырыңыз, болбосо компиляция катасы пайда болот. "Алмаштыруу жана табуу" куралы пайдалуу болушу мүмкүн.
  4. Түзүү жана иштетүү!
  5. Эгерде сизде көйгөйлөр болсо, каталар үчүн сериялык консолун караңыз. Тактап айтканда, сиздин үлгүңүздө ички буфер үчүн өтө көп пункттар бар болсо, сиз билдирүүлөрдү көрөсүз. Мындай учурларда, сүрөт ашыкча жылтырак көрсөтөт.

6 -кадам: Эмне үчүн PWM ушунчалык жай экенин түшүнүңүз

Баштоо үчүн, конденсатор заряддалып жаткандагы жүрүм -турумун карап көрөлү.

Vcc чыңалуу булагына туташкан конденсатор экспоненциалдык ийри сызыкка ылайык чыңалуусун жогорулатат. Бул ийри асимптотикалык, башкача айтканда, ал максаттуу чыңалууга жакындаганда жайыраак болот. Бардык практикалык максаттар үчүн, чыңалуу 5 RC секунддан кийин "жетишерлик жакын". RC "убакыт константасы" деп аталат. Биз мурда көргөндөй, бул сиздин схемаңыздагы резистор менен конденсатордун маанилеринин продуктусу. Көйгөй 5 RC - графикалык дисплейдеги ар бир чекитти жаңыртуу үчүн бир топ убакыт. Бул көп жылтыракка алып келет!

Конденсаторду кубаттоо үчүн импульстун туурасы модуляциясын (PWM) колдонгондо, бизде абал жакшырбайт. PWM менен чыңалуу 0V менен 5V ортосунда тез которулат. Иш жүзүндө, бул биз конденсаторго зарядды түртүп, анын бир азын кайра тартып алуу менен тез алмашып турабыз дегенди билдирет - бул түртүү жана тартуу чоң кадамды алдыга, андан кийин бир аз артка таштоо менен марафонду өткөргөнгө окшош. кайра кайра.

Баарын орточо эсепке алганда, PWMди колдонуп конденсаторду кубаттоо жүрүм -туруму, сиз конденсаторду кубаттоо үчүн Vpwmдин туруктуу чыңалуусун колдонгондой эле болот. Керектүү чыңалууга "жетишерлик жакын" болушубуз үчүн дагы 5 RC секунд талап кылынат.

7 -кадам: а дан Вге чейин, Тад Бит Тезирээк

Адан Вге чейин, Тад Бит Тезирээк
Адан Вге чейин, Тад Бит Тезирээк

Бизде Va чейин заряддалган конденсатор бар дейли. Bнын жаңы маанисин жазуу үчүн analogWrite () колдонобуз дейли. Vb чыңалуусуна жетүү үчүн минималдуу канча убакыт керек?

Эгерде сиз 5 RC секундун ойлосоңуз, бул эң сонун! 5 RC секунд күтүү менен, конденсатор дээрлик Vb заряддалып жатат. Бирок, эгер биз кааласак, анда биз бир аз азыраак күтө алабыз.

Заряддын ийри сызыгын караңыз. Көрдүңүзбү, биз баштаганда конденсатор Вада болчу. Бул t_a убактысын күтүүнүн кажети жок дегенди билдирет. Эгерде биз конденсаторду нөлдөн кубаттаган болсок гана керек болот.

Ошентип, бул убакытты күтпөй, жакшырууну көрөбүз. Убакыт t_ab чындыгында 5 RCден бир аз кыска.

Бирок күтө туруңуз, биз мындан да жакшыраак кыла алабыз! V_b үстүндөгү боштуктун баарын караңыз. Бул Vcc, биз үчүн жеткиликтүү болгон максималдуу чыңалуу менен Vbдин ортосундагы айырма. Бул кошумча чыңалуу биз каалаган жерге тезирээк барууга кандайча жардам берерин көрө аласызбы?

8 -кадам: Турбодогу кубаттагыч менен Адан Вге чейин алыңыз

Турбо кубаттагыч менен Адан Вга чейин алыңыз!
Турбо кубаттагыч менен Адан Вга чейин алыңыз!

Дурус. PWMди V_b максаттуу чыңалуусунда колдонуунун ордуна, биз аны туруктуу Vccте бир кыйла кыска убакытка кармап турабыз. Мен муну Turbo Charger ыкмасы деп атайм жана ал бизди чындап баргысы келген жерге жеткирет, чындап эле! Убакыт кечиктирилгенден кийин (биз эсептешибиз керек), биз V_bдеги PWMге өтүү менен тормозду басабыз. Бул чыңалууну бутага ашуудан сактайт.

Бул ыкма менен, конденсатордогу чыңалууну V_aдан V_bге бир аз убакытта PWMди колдонууга караганда өзгөртүүгө болот. Мына ушундай жерлерге ээ болосуз, балам!

9 -кадам: Кодексти түшүнүңүз

Кодексти түшүнүңүз
Кодексти түшүнүңүз

Сүрөт миң сөздөн турат, андыктан диаграмма коддо аткарылган маалыматтарды жана операцияларды көрсөтөт. Солдон оңго:

  • Графикалык маалыматтар пункттардын тизмеси катары PROGMEMде (башкача айтканда, флеш -эс) сакталат.
  • Которуу, масштабдоо жана айлануу операцияларынын ар кандай айкалышы аффиндик трансформация матрицасына бириктирилет. Бул ар бир анимация кадрынын башында бир жолу жасалат.
  • Упайлар графикалык маалыматтардан бирден окулат жана ар бири сакталган трансформация матрицасына көбөйтүлөт.
  • Которулган чекиттер көзгө көрүнгөн аянттын чегинен тышкары каалаган чекиттерди кесүүчү алгоритм аркылуу азыктанышат.
  • RC кечигүү таблицасын колдонуп, упайлар айдоо чыңалуусуна жана убакыттын кечигүүсүнө айландырылат. RC кечигүү издөө таблицасы EEPROMда сакталат жана кодду бир нече жолу иштетүү үчүн кайра колдонулушу мүмкүн. Ишке киргенде, RC издөө таблицасынын тууралыгы текшерилет жана туура эмес маанилер жаңыртылат. EEPROM колдонуу баалуу RAM эсин сактайт.
  • Айдоочу чыңалуу жана кечигүүлөр кадр буфериндеги активдүү эмес кадрга жазылат. Кадр буферинде активдүү кадр жана активдүү эмес кадр үчүн орун бар. Толук кадр жазылгандан кийин, активдүү эмес кадр активдүү болот.
  • Үзгүлтүккө учуроо кызматы үзгүлтүксүз чыңалуу маанилерин окуу жана активдүү кадр буферинен кечигүү менен сүрөттү кайра тартат. Ошол баалуулуктарга таянып, ал чыгуучу казыктардын кызмат циклдерин тууралайт. Таймер 1 убакыттын кечигүүсүн бир нече наносекунддарга чейин өлчөө үчүн колдонулат, ал эми таймер 2 казыктардын иштөө циклин көзөмөлдөө үчүн колдонулат.
  • Чыңалуунун эң чоң өзгөрүүсүнө ээ болгон пин дайыма "турбо заряддалган" нөлдүк же 100%бир цикл менен иштейт, бул эң тез заряддоону же төгүү убактысын камсыз кылат. Чыңалуунун анча чоң эмес өзгөрүүсү бар пин биринчи пиндин өтүү убактысына дал келген тандоо циклинин жардамы менен жүргүзүлөт-бул жолу дал келтирүү сызыктардын осциллографта түз тартылышын камсыздоо үчүн маанилүү.

10 -кадам: Улуу ылдамдык менен, Улуу жоопкерчилик келет

Бул ыкма PWMге караганда алда канча ылдамыраак болгондуктан, эмне үчүн analogWrite () аны колдонбойт? Ооба, анткени PWMди колдонуу көпчүлүк программалар үчүн жетиштүү жана алда канча кечиримдүү. "Turbo Charger" ыкмасы, бирок кылдат коддоону талап кылат жана белгилүү бир учурларда гана ылайыктуу:

  1. Бул убакытка өтө сезимтал. Биз максаттуу чыңалуу деңгээлине жеткенде, максаттуу чыңалуудан ашпаш үчүн, айдоочу пин дароо кадимки PWM режимине которулушу керек.
  2. Бул RC константасын билүүнү талап кылат, андыктан бул баалуулуктарды алдын ала киргизүү керек. Туура эмес баалуулуктар менен, убакыт туура эмес жана чыңалуу туура эмес болот. Кадимки PWM менен, RC туруктуу белгисиз болсо дагы, бир аз убакыттан кийин туура чыңалууга орношооруңузга кепилдик бар.
  3. Конденсаторду кубаттоо үчүн так убакыт аралыгын эсептөө Arduinoдо реалдуу убакытта эсептөө үчүн өтө жай болгон логарифмалык теңдемелерди талап кылат. Булар ар бир анимация фрейминин алдында алдын ала эсептелип, бир жерде эстутумда сакталышы керек.
  4. Бул ыкма менен иштеген программалар кечигүүлөр абдан сызыктуу эмес экендигине каршы турушу керек (алар, чынында, экспоненциалдуу). Vcc же GNDге жакын максаттуу чыңалууларга орто чекиттин жанындагы чыңалууга караганда чоңураак көптөгөн буйруктар жетет.

Бул чектөөлөрдү жеңүү үчүн менин вектордук графикалык кодум төмөнкү иштерди аткарат:

  1. Бул 16 кГц таймерди жана так чыгуу манипуляциясы жана убактысы үчүн үзгүлтүккө учуроо кызматын колдонот.
  2. Бул конденсатордун жана резистордун маанилеринин тандоолорун чектеп, колдонуу үчүн RC убактысынын белгилүү бир маанисин талап кылат.
  3. Ал бардык пункттардын кечигүүсүн анимация кадрында эс тутумунда сактайт. Бул убакыттын кечигүүсүн эсептеген күнүмдүк иштөө үзгүлтүккө учуроо кызматына караганда бир кыйла жайыраак иштейт дегенди билдирет. Кийинки кадрдын кечигүүлөрүнүн жаңы топтому колдонууга даяр болгонго чейин, каалаган кадрды бир нече ондогон жолу боёш керек.
  4. Эстутум буферин колдонуу бир кадрга тартыла турган чекиттердин санын чектейт. Мен жеткиликтүү RAMдан максималдуу пайдалануу үчүн мейкиндикти эффективдүү коддоону колдоном, бирок ал дагы эле 150гө жакын пункт менен чектелген. Жүзгө жакын упайдан ашып кетсе, дисплей баары бир жаркылдай баштайт, андыктан бул талаштуу маселе!

Сунушталууда: