Мазмуну:

Millis менен Arduino хронометраждык методдору (): 4 кадам
Millis менен Arduino хронометраждык методдору (): 4 кадам

Video: Millis менен Arduino хронометраждык методдору (): 4 кадам

Video: Millis менен Arduino хронометраждык методдору (): 4 кадам
Video: Урок 101. Использование ИК-пульта дистанционного управления для управления телевизором, лампочкой переменного тока с реле, двигателем постоянного тока и серводвигателем. 2024, Ноябрь
Anonim
Millis менен Arduino хронометраждык методдору ()
Millis менен Arduino хронометраждык методдору ()

Бул макалада биз millis () менен тааныштырабыз; функциясын колдонуп, ар кандай убакыт мисалдарын түзүү үчүн колдонуңуз.

Millis? Эрин синхрондору менен эч кандай байланышы жок … миллионду миңден бир бөлүгүнүн сандык префикси катары тааныдыңыз деп үмүттөнөбүз; бул өлчөө бирдигин 0,001ге көбөйтөт (же онду терс 3кө чейин).

Кызыктуусу, биздин Arduino тутумдары эскиздин башталышынан баштап, миллисекундтардын санын (миңдеген секунддар) санап турат, эсептөө максималдуу санга жеткенге чейин өзгөрүлбөгөн типте сакталышы керек (32-бит [төрт байт] бүтүн сан -бул нөлдөн (2^32) -1ге чейин. (2^32) -1, же 4294967295 миллисекунддар 49.71027-так күндөргө айланат.

Эсептегич Arduino баштапкы абалга келтирилгенде, ал максималдуу мааниге жетет же жаңы эскиз жүктөлөт. Белгилүү бир убакта эсептегичтин маанисин алуу үчүн, жөн гана функцияны чакырыңыз - мисалы:

баштоо = миллис ();

Кайда баштоо - бул белгисиз узун өзгөрмө. Бул жерде millis () кыймылда экенин көрсөтүү үчүн абдан жөнөкөй мисал:

/ * millis () демонстрация */

кол коюлбаган узак баштоо, бүтүү, өтүү;

жараксыз орнотуу ()

{Serial.begin (9600); }

боштук цикл ()

{Serial.println ("Баштоо…"); баштоо = миллис (); кечигүү (1000); даяр = millis (); Serial.println ("Даяр"); elapsed = аяктаган-баштоо; Serial.print (өткөн); Serial.println ("миллисекунддар өттү"); Serial.println (); кечигүү (500); }

Эскизде учурдагы миллис саны сакталат, андан кийин бир секунд күтүлөт, андан кийин миллис баасы кайрадан даяр бойдон сакталат. Акыр -аягы, ал кечигүү өткөн убакытты эсептейт. Сериялык монитордун кийинки экран төгүндүлөрүндө, сүрөттө көрүнүп тургандай, узактыгы дайыма 1000 миллисекунд эмес экенин көрө аласыз.

1 кадам:

Сүрөт
Сүрөт

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

2-кадам:

Сүрөт
Сүрөт

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

Эгерде сиз кристаллдын ордуна керамикалык резонаторду колдонуп жаткан тактаны же өзүңүздүн версияңызды колдонуп жатсаңыз, анда алар анча так эмес экенин жана дрейфтин жогорку деңгээлинин мүмкүнчүлүгүн киргизерин эске алыңыз. Эгер сизге убакыт тактыгынын бир кыйла жогорку деңгээли керек болсо, Maxim DS3231 сыяктуу конкреттүү таймер ICлерин карап көрүңүз.

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

Аппараттык перспективада бизде эки баскыч болот-Баштоо жана Токтотуу-тиешелүүлүгүнө жараша 2 жана 3 санариптик казыктарга туташкан 10к Ом тартылып каршылыгы бар. Колдонуучу басууну баштаганда, эскиз миллис үчүн маанини белгилейт - андан кийин аялдама басылганда, эскиз дагы миллис үчүн маанини белгилеп, өткөн убакытты эсептеп жана көрсөтөт. Колдонуучу андан кийин процессти кайталоо үчүн баштоону басып, же жаңыртылган маалыматтарды токтото алат. Мына эскиз:

/* Супер-негизги секундомер миллис () менен; */

кол коюлбаган узак баштоо, бүтүү, өтүү;

жараксыз орнотуу ()

{Serial.begin (9600); pinMode (2, INPUT); // pinMode (3, INPUT) баштоо баскычы; // токтотуу баскычы Serial.println ("Баштоо/кайра коюу үчүн 1, өткөн убакыт үчүн 2 басыңыз"); }

void displayResult ()

{float h, m, s, ms; көпкө чейин кол коюлбаган; elapsed = аяктаган-баштоо; h = int (өткөн/3600000); үстүнөн = өткөн%3600000; m = int (60000 ашык); ашык =%60000дөн жогору; s = int (1000ден жогору); ms =%1000ден жогору; Serial.print ("Чийки убакыт:"); Serial.println (өткөн); Serial.print ("Өткөн убакыт:"); Serial.print (h, 0); Serial.print ("h"); Serial.print (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (мс, 0); Serial.println ("ms"); Serial.println (); }

боштук цикл ()

{if (digitalRead (2) == HIGH) {start = millis (); кечигүү (200); // чыгаруу үчүн Serial.println ("Башталды…"); } if (digitalRead (3) == HIGH) {даяр = миллис (); кечигүү (200); // дисплейден чыгаруу DisplayResult (); }}

Кечиктирүү () чалуулары өчүргүчтөрдү жок кылуу үчүн колдонулат - бул милдеттүү эмес жана аларды колдонуу сиздин жабдыктарыңызга жараша болот. Сүрөт эскиздин сериялык мониторунун мисалы болуп саналат - секундомер иштей баштады, андан кийин эки баскычты убакыт аралыгында алты жолу басуу.

3 -кадам: Спидометр…

Image
Image

Эгерде сизде белгиленген аралыктын башында жана аягында сенсор болсо, ылдамдыкты эсептөөгө болот: ылдамдык = аралык ÷ убакыт.

Сиз ошондой эле дөңгөлөктүү кыймылдын спидометрин жасай аласыз, мисалы велосипед. Учурда бизде баш аламан велосипед жок, бирок биз муну кантип жасоону сүрөттөп бере алабыз - бул абдан жөнөкөй. (Жоопкерчиликтен баш тартуу - муну өз тобокелиңизге ж.б.у.с.)

Биринчиден, керектүү математиканы карап көрөлү. Сиз дөңгөлөктүн айланасын билишиңиз керек. Аппараттык - сенсор керек болот. Мисалы - камыш которгуч жана магнит. Камыш которгучту кадимкидей ачык баскыч катары карап көрүңүз жана адаттагыдай эле 10к Ом тартылып турган резистор менен туташыңыз.

Башкалар холл-эффект сенсорун колдонушу мүмкүн-ар бири өз алдынча). Айлананы эсептөө үчүн математика сабагынан эсиңизде болсун: формуланы колдонуңуз: айлана = 2πr, мында r - айлананын радиусу.

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

Сиздин сенсор-орнотулгандан кийин-ар бир айлануу басылган кадимкидей ачык баскыч менен бирдей иштеши керек. Биздин эскиз сенсордун ар бир импульсунун ортосундагы убакытты өлчөйт.

Бул үчүн, биздин мисалда сенсордук санарип 2 -пинге туташкан болот - бул ылдамдыкты эсептөө үчүн үзгүлтүккө учуратат. Эскиз башка учурда ылдамдыкты кадимки I2C-интерфейсиндеги ЖК модулда көрсөтөт. I2C интерфейси сунушталат, анткени бул Arduino тактасынан ЖКга 4 зымды гана талап кылат - зымдар азыраак болсо жакшы.

Бул жерде сиздин таанышууңуздун эскизи:

/*Милис () колдонулган негизги спидометр; */

#кошуу "Wire.h" // I2C автобус ЖК үчүн

#кошуу "LiquidCrystal_I2C.h" // I2C шинасынын LCD модулу үчүн - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // 16 дарек жана 2 саптуу дисплей үчүн ЖК дарегин 0x27 деп коюңуз

сүзүү баштоо, бүтүү;

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

жараксыз орнотуу ()

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

боштук speedCalc ()

{elapsed = millis ()-баштоо; баштоо = миллис (); speedk = (3600*circMetric)/өткөн; // км/с speedm = (3600*circImperial)/өткөн; // Миллер саатына}

боштук цикл ()

{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ди велосипедге эч ким орнотпойт деп ойлойм, балким LED дисплейи көбүрөөк актуалдуу болмок.

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

4 -кадам:

Бул азырынча millis () колдонулушун жыйынтыктайт. Ошондой эле micros () бар; микросекунддарды эсептеген функция.

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

Бул пост сизге pmdway.com тарабынан келген - бүткүл дүйнө жүзү боюнча бекер жеткирүү менен, жасоочулар жана электроника ышкыбоздору үчүн.

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