Агуулгын хүснэгт:

Millis () ашиглан Arduino цаг хэмжих арга: 4 алхам
Millis () ашиглан Arduino цаг хэмжих арга: 4 алхам

Видео: Millis () ашиглан Arduino цаг хэмжих арга: 4 алхам

Видео: Millis () ашиглан Arduino цаг хэмжих арга: 4 алхам
Видео: debounce - bounce filtering - seribu satu jalan ke roma (Subtittled) 2024, Долдугаар сарын
Anonim
Millis ашиглан Arduino цаг хэмжих арга ()
Millis ашиглан Arduino цаг хэмжих арга ()

Энэ нийтлэлд бид millis () -ийг танилцуулж байна; функцийг ажиллуулж, цаг хугацааны янз бүрийн жишээг бий болгоход ашиглаарай.

Милис үү? Уруул синхрончлогчтой ямар ч холбоогүй … та милли-г мянганы нэгийн тоон угтвар гэж хүлээн зөвшөөрсөн гэж найдаж байна. хэмжих нэгжийг 0.001 -ээр үржүүлж байна (эсвэл сөрөг 3 -ын хүчээр арав).

Сонирхолтой нь манай Arduino системүүд ноорог ажиллаж эхэлснээс хойш тэмдэглэгдээгүй урт (32 бит [дөрвөн байт] бүхэл тоо) хувьсах хэлбэрт хадгалах боломжтой дээд хэмжээнд хүрэх хүртэл миллисекундийн тоог (мянга мянган секунд) тоолох болно. -тэгээс (2^32) -1 хооронд хэлбэлздэг. (2^32) -1, эсвэл 4294967295 миллисекундийг 49.71027 сондгой өдөр болгон хөрвүүлдэг.

Тоолуур нь Arduino -ийг дахин тохируулах үед хамгийн их утгад хүрэх эсвэл шинэ ноорог байршуулах үед дахин тохируулна. Тодорхой цэг дээр тоолуурын утгыг авахын тулд функцийг дуудах хэрэгтэй - жишээлбэл:

эхлэх = millis ();

Хаана эхлэх нь гарын үсэг зураагүй урт хувьсагч юм. Millis () -г үйлдэл дээр харуулах маш энгийн жишээ энд байна:

/ * millis () жагсаал */

гарын үсэг зураагүй урт эхлэл, дууссан, өнгөрсөн;

хүчингүй тохиргоо ()

{Serial.begin (9600); }

хоосон давталт ()

{Serial.println ("Эхлэх …"); эхлэх = millis (); саатал (1000); дууссан = millis (); Serial.println ("Дууссан"); өнгөрсөн = дууссан эхлэх; Цуваа.хэвлэх (өнгөрсөн); Serial.println ("миллисекунд өнгөрсөн"); Serial.println (); саатал (500); }

Ноорог нь одоогийн миллисын тооллогыг эхэнд нь хадгалж, нэг секунд хүлээгээд дараа нь миллисийн үнийг дууссан хэлбэрээр хадгална. Эцэст нь энэ нь хойшлогдсон хугацааг тооцоолно. Цуваа дэлгэцийн дараагийн дэлгэцийн овоолго дээр зураг дээрх шиг үргэлжлэх хугацаа нь үргэлж 1000 миллисекунд байгаагүй гэдгийг харж болно.

1-р алхам:

Зураг
Зураг

Энгийнээр хэлэхэд millis функц нь таны Arduino -ийн зүрхэнд байгаа ATmega микроконтроллерийн дотоод тоолуурыг ашигладаг. Энэхүү тоолуур нь цагны мөчлөг бүрийг нэмэгдүүлдэг бөгөөд энэ нь (стандарт Arduino болон нийцтэй хувилбаруудад) 16 МГц давтамжтай болдог. Энэ хурдыг Arduino самбар дээрх болороор хянадаг (T16.000 тамгатай мөнгөн зүйл).

Алхам 2:

Зураг
Зураг

Кристал нарийвчлал нь гаднах температур, талстын хүлцэл зэргээс хамаарч өөр өөр байж болно. Энэ нь эргээд таны миллис үр дүнгийн нарийвчлалд нөлөөлнө. Анекдотын туршлагаас харахад цаг хугацааны нарийвчлал 24 цаг тутамд ойролцоогоор 3-4 секунд байж болно.

Хэрэв та болор биш харин керамик резонатор ашиглаж байгаа самбар эсвэл өөрийн хувилбарыг ашиглаж байгаа бол тэдгээр нь тийм ч нарийвчлалтай биш бөгөөд дрифтийн түвшин өндөр байх магадлалтайг анхаарна уу. Хэрэв танд цаг хугацааны нарийвчлал илүү өндөр байх шаардлагатай бол Maxim DS3231 гэх мэт тодорхой таймерын IC -ийг анхаарч үзээрэй.

Одоо бид янз бүрийн цагийн функцүүдэд миллисийг ашиглаж болно. Өмнөх жишээн дээр харуулснаар бид өнгөрсөн хугацааг тооцоолж болно. Энэ санааг хэрэгжүүлэхийн тулд энгийн секунд хэмжигч хийцгээе. Үүнийг хийх нь аль болох энгийн эсвэл нарийн төвөгтэй байж болох ч энэ тохиолдолд бид энгийн зүйл рүү шилжих болно.

Тоног төхөөрөмжийн үүднээс авч үзвэл бид 2 товчлууртай байх болно-Start ба Stop-10к ом эсэргүүцэх эсэргүүцэл бүхий тоон тээглүүр 2 ба 3-т холбогдсон байна. Хэрэглэгч дарж эхлэхдээ ноорог нь миллисын утгыг тэмдэглэнэ. Дараа нь зогсоох товчийг дарсны дараа ноорог нь миллисийн утгыг дахин тэмдэглэж, өнгөрсөн хугацааг тооцоолж, харуулна. Хэрэглэгч процессыг давтах эсвэл шинэчлэгдсэн өгөгдлийг зогсоохын тулд эхлэх товчийг дарж болно. Энд ноорог байна:

/* Millis () ашиглан супер үндсэн секундомер; */

гарын үсэг зураагүй урт эхлэл, дууссан, өнгөрсөн;

хүчингүй тохиргоо ()

{Serial.begin (9600); pinMode (2, INPUT); // эхлэх товчлуур pinMode (3, INPUT); // зогсоох товч Serial.println ("Эхлэх/дахин тохируулахын тулд 1, өнгөрсөн хугацаанд 2 дарна уу"); }

void displayResult ()

{float h, m, s, ms; урт хугацаанд гарын үсэг зураагүй; өнгөрсөн = дууссан эхлэх; h = int (өнгөрсөн/3600000); хэтэрсэн = өнгөрсөн%3600000; m = int (60000 -аас дээш); дээш = 600%-иас дээш; s = int (1000 -аас дээш); ms =%1000 -аас дээш; Serial.print ("Түүхий цаг дууссан:"); Serial.println (өнгөрсөн); Serial.print ("Өнгөрсөн хугацаа:"); Цуваа.хэвлэх (h, 0); Serial.print ("h"); Цуваа.хэвлэх (м, 0); Serial.print ("m"); Цуваа.хэв (ууд, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

хоосон давталт ()

{if (digitalRead (2) == HIGH) {start = millis (); саатал (200); // for debounce Serial.println ("Эхэлсэн …"); } if (digitalRead (3) == HIGH) {дууссан = millis (); саатал (200); // дебран гаргахын тулд displayResult (); }}

Delay () дуудлага нь унтраалгыг задлахад ашиглагддаг - эдгээр нь заавал биш бөгөөд тэдгээрийн хэрэглээ нь таны техник хангамжаас хамаарна. Энэ зураг нь ноорогны цуваа дэлгэцийн гаралтын жишээ юм - секундомер эхэлж, дараа нь хоёр товчлуурыг зургаан удаа дарна.

Алхам 3: Хурд хэмжигч…

Image
Image

Хэрэв танд тогтмол зайн эхэн ба төгсгөлд мэдрэгч байсан бол хурдыг тооцоолж болно: хурд = зай ÷ цаг.

Та дугуйтай хөдөлгөөний хурд хэмжигч хийж болно, жишээлбэл унадаг дугуй. Одоогийн байдлаар бидэнд унадаг дугуй байхгүй, гэхдээ үүнийг хийх явцыг тайлбарлаж болно - энэ бол маш энгийн зүйл юм. (Татгалзах мэдээлэл - үүнийг өөрийн эрсдэлээр хийх гэх мэт.)

Юуны өмнө шаардлагатай математикийг авч үзье. Та дугуйны тойргийг мэдэх хэрэгтэй. Тоног төхөөрөмж - танд мэдрэгч хэрэгтэй болно. Жишээлбэл - зэгс унтраалга ба соронз. Зэгсэн унтраалгыг ердийн нээлттэй товчлуур гэж үзээд ердийнх шигээ 10к ом эсэргүүцэх хүчээр холбоно уу.

Бусад нь танхимын эффект мэдрэгч ашиглаж болно-тус бүр өөрийн гэсэн). Математикийн хичээлээс тойргийг тооцоолохдоо дараах томъёог ашиглана уу: тойрог = 2πr, энд r нь тойргийн радиус юм.

Дугуйны тойрогтой болсон тул энэ утгыг бидний "тогтмол зай" гэж үзэж болох бөгөөд ингэснээр бүрэн эргэлтийн хоорондох хугацааг хэмжих замаар хурдыг тооцоолж болно.

Таны мэдрэгчийг суурилуулсны дараа эргэлт бүрт дарагддаг ердийн нээлттэй товчлууртай ижил аргаар ажиллах ёстой. Бидний ноорог нь мэдрэгчийн импульс бүрийн хоорондох хугацааг хэмжих болно.

Үүнийг хийхийн тулд бидний жишээ нь хурдыг тооцоолох тасалдлыг өдөөх тул мэдрэгчийн гаралтыг дижитал зүү 2 -тэй холбох болно. Ноорог нь хурдыг ердийн I2C интерфэйстэй LCD модуль дээр харуулах болно. I2C интерфэйсийг санал болгож байна, учир нь энэ нь Arduino самбараас LCD хүртэл 4 утас шаарддаг - утас бага байх тусмаа сайн.

Таны танилцах тоймыг энд оруулав.

/*Millis () ашиглан үндсэн хурд хэмжигч; */

I2C автобусны LCD -д зориулсан "Wire.h" // -г оруулна уу

#оруулах "LiquidCrystal_I2C.h" // I2C автобусны LCD модулийн хувьд - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // 16 тэмдэгт, 2 мөр дэлгэцийн хувьд LCD хаягийг 0x27 болгож тохируулна уу

хөвөх эхлэл, дууссан;

хөвөх хугацаа өнгөрсөн, цаг хугацаа; float circMetric = 1.2; // мэдрэгчийн байрлалтай харьцуулахад дугуйны тойрог (метрээр) хөвөх тойрог Империал; // 1 километр = 0.621371192 миль ашиглан хөвөх хурд, speedm; // хэмжигдэхүүн ба эзэнт гүрний тооцоолсон хурдны утгыг агуулдаг

хүчингүй тохиргоо ()

{attachInterrupt (0, speedCalc, RISING); // мэдрэгчид дижитал 2 өндөр (дугуйны эргэлт бүрт) илгээгдэх үед эхлэх тасалдал = millis (); // LCD lcd.init () тохируулах; // lcd lcd.backlight -ийг эхлүүлэх (); // LCD арын гэрлийг асаах lcd.clear (); lcd.println ("Дуулга өмс!"); саатал (3000); lcd.clear (); Цуваа.begin (115200); circImperial = circMetric*.62137; // MPH тооцоолохын тулд хэмжигдэхүүнийг эзэнт гүрэн болгон хөрвүүлэх}

void speedCalc ()

{elapsed = millis ()-эхлэх; эхлэх = millis (); speedk = (3600*circMetric)/өнгөрсөн; // км/цаг хурд = = 3600*тойрог Империал//өнгөрсөн; // Цагт миль}

хоосон давталт ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("км/цаг"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (өнгөрсөн)); lcd.print ("ms/rev"); саатал (1000); // анивчихыг багасгахын тулд хувийн тохиргоогоо тохируулаарай}

Энэ нь тийм ч их зүйл болохгүй - дугуй нэг эргэлт хийх бүрт мэдрэгчийн дохио багаас өндөр рүү шилжих бөгөөд энэ нь speedCalc () функцийг дууддаг тасалдлыг өдөөдөг.

Энэ нь миллис () заалтыг авч дараа нь одоогийн уншилт ба өмнөх уншилтын хоорондох ялгааг тооцоолно. Энэ утга нь зайг давах цаг болдог (энэ нь мэдрэгчтэй харьцуулахад дугуйны тойрог юм)

float circMetric = 1.2;

ба метрээр хэмжигддэг). Эцэст нь хурдыг км/цаг болон MPH -ээр тооцоолно. Тасалдлын хооронд ноорог нь LCD дээр шинэчлэгдсэн хурдны мэдээлэл, мөн сониуч зангийн төлөө хувьсгал бүрийн цаг хугацааны үнэ цэнийг харуулдаг. Бодит амьдрал дээр хэн ч унадаг дугуй дээр LCD суурилуулахгүй гэж би боддог, магадгүй LED дэлгэц нь илүү хамааралтай байж магадгүй юм.

Энэ хооронд энэ жишээ хэрхэн ажилладагийг та дараах богино хэмжээний видео клипээс харж болно. Унадаг дугуйн дугуй, зэгс унтраалга/соронзны хослолын оронд би функцийн генераторын квадрат долгионы гаралтыг таслах зүү рүү холбосон бөгөөд энэ нь мэдрэгчийн импульсийг дуурайх боломжийг олгодог бөгөөд ингэснээр та хэрхэн ажилладаг талаар ойлголттой болно.

Алхам 4:

Энэ нь одоохондоо millis () хэрэглээг тоймлож байна. Мөн micros (); микросекунд тоолох функц.

Ардуиногийн ертөнцөөр дамжуулан илүү олон асуудлыг шийдвэрлэх боломжийг олгодог өөр нэг практик функц энд байна. Урьдын адил одоо хянаж чадах зүйлээ олж авах эсвэл бусад танил хүмүүстэй холбоо тогтоох нь таны болон таны төсөөллөөс шалтгаална.

Энэхүү бичлэгийг pmdway.com танд хүргэсэн бөгөөд энэ нь үйлдвэрлэгч болон цахилгаан бараа сонирхогчдод зориулагдсан бүх зүйлийг дэлхий даяар үнэгүй хүргэж өгөх болно.

Зөвлөмж болгож буй: