Съдържание:

Методи за синхронизиране на Arduino с Millis (): 4 стъпки
Методи за синхронизиране на Arduino с Millis (): 4 стъпки

Видео: Методи за синхронизиране на Arduino с Millis (): 4 стъпки

Видео: Методи за синхронизиране на Arduino с Millis (): 4 стъпки
Видео: Using Digispark Attiny85 Mini Arduino boards: Lesson 108 2024, Юли
Anonim
Методи за синхронизиране на Arduino с Millis ()
Методи за синхронизиране на Arduino с Millis ()

В тази статия представяме millis (); функция и я използвайте за създаване на различни примери за време.

Милис? Нищо общо със синхронизаторите за устни … дано сте разпознали мили като цифров префикс за хилядни; което умножава мерна единица с 0,001 (или десет до степента на минус 3).

Интересното е, че нашите системи Arduino ще броят броя милисекунди (хиляди в секунда) от началото на скица, докато броят достигне максималния брой, който може да се съхранява в променливия тип unsigned long (32-битово [четирибайтово] цяло число -това варира от нула до (2^32) -1. (2^32) -1, или 4294967295 милисекунди се превръща в 49.71027-нечетни дни.

Броячът се нулира, когато Arduino се нулира, той достига максималната стойност или се качва нова скица. За да получите стойността на брояча в определен момент, просто извикайте функцията - например:

start = millis ();

Където начало е беззначна дълга променлива. Ето един много прост пример, който да ви покаже millis () в действие:

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

без подпис дълъг старт, завършен, изтекъл;

void setup ()

{Serial.begin (9600); }

void loop ()

{Serial.println ("Старт …"); start = millis (); забавяне (1000); завършено = millis (); Serial.println ("Готово"); изтекъл = завършен старт; Serial.print (изтекъл); Serial.println ("изминали милисекунди"); Serial.println (); забавяне (500); }

Скицата съхранява текущия брой мили в началото, след това изчаква една секунда, след което отново съхранява стойността на мили в завършен вид. Накрая изчислява изминалото време на закъснението. В следния думп на екрана на серийния монитор можете да видите, че продължителността не винаги е била точно 1000 милисекунди, както е показано на изображението.

Етап 1:

Образ
Образ

Просто казано, функцията millis използва вътрешен брояч в микроконтролера ATmega в сърцето на вашия Arduino. Този брояч увеличава всеки тактов цикъл - което се случва (в стандартния Arduino и съвместими) при тактова честота от 16 Mhz. Тази скорост се контролира от кристала на дъската на Arduino (сребърното нещо с T16.000 щамповано върху него).

Стъпка 2:

Образ
Образ

Точността на кристала може да варира в зависимост от външната температура и толеранса на самия кристал. Това от своя страна ще повлияе на точността на вашия милис резултат. Анекдотичен опит съобщава, че отклонението в точността на времето може да бъде около три или четири секунди за период от двадесет и четири часа.

Ако използвате дъска или собствена версия, която използва керамичен резонатор вместо кристал, имайте предвид, че те не са толкова точни и ще въведат възможност за по -високи нива на дрейф. Ако имате нужда от много по -високо ниво на точност на времето, помислете за специфични интегрални схеми на таймера, като например Maxim DS3231.

Сега можем да използваме millis за различни функции за синхронизиране. Както е показано в предходната примерна скица, можем да изчислим изминалото време. За да продължим тази идея, нека направим прост хронометър. Това може да бъде толкова просто или толкова сложно, колкото е необходимо, но за този случай ще се насочим към прости.

От гледна точка на хардуера, ще имаме два бутона-Старт и Стоп-с 10 k ома издърпващи се резистори, свързани съответно към цифрови пинове 2 и 3. Когато потребителят натисне старта, скицата ще отбележи стойността за милис - след това след натискане на стоп, скицата отново ще отбележи стойността за мили, ще изчисли и покаже изминалото време. След това потребителят може да натисне старт, за да повтори процеса, или да спре за актуализирани данни. Ето скицата:

/* Супер-основен хронометър, използващ millis (); */

без подпис дълъг старт, завършен, изтекъл;

void setup ()

{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); над = над%60000; s = int (над/1000); ms = над%1000; Serial.print ("Сурово изминало време:"); Serial.println (изтекъл); Serial.print ("Изминало време:"); Serial.print (h, 0); Serial.print ("h"); Сериен отпечатък (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

void loop ()

{if (digitalRead (2) == HIGH) {start = millis (); забавяне (200); // за деблокиране на Serial.println ("Стартирано …"); } if (digitalRead (3) == HIGH) {завършено = millis (); забавяне (200); // за debounce displayResult (); }}

Извикванията към delay () се използват за премахване на превключвателите - те са по избор и използването им ще зависи от вашия хардуер. Изображението е пример за изхода на серийния монитор на скицата - хронометърът стартира и след това бутон два натиснат шест пъти през периоди от време.

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

Image
Image

Ако сте имали сензор в началото и края на фиксирано разстояние, скоростта може да се изчисли: скорост = разстояние ÷ време.

Можете също така да направите скоростомер за колесна форма на движение, например велосипед. Понастоящем нямаме колело, с което да се занимаваме, но можем да опишем процеса на това - това е съвсем просто. (Отказ от отговорност - направете това на свой собствен риск и т.н.)

Първо, нека разгледаме необходимата математика. Ще трябва да знаете обиколката на колелото. Хардуер - ще ви е необходим сензор. Например - тръстиков превключвател и магнит. Считайте, че тръстиковият превключвател е нормално отворен бутон и се свързва както обикновено с 10k ом издърпващ се резистор.

Други могат да използват сензор за ефект на Хол-всеки за себе си). Запомнете от математически клас, за да изчислите обиколката - използвайте формулата: обиколка = 2πr, където r е радиусът на окръжността.

Сега, когато имате обиколката на колелото, тази стойност може да се счита за наше „фиксирано разстояние“и следователно скоростта може да бъде изчислена чрез измерване на изминалото време между пълно завъртане.

Вашият сензор-веднъж монтиран-трябва да действа по същия метод като нормално отворен бутон, който се натиска при всяко завъртане. Нашата скица ще измерва времето, изминало между всеки импулс от сензора.

За да направите това, в нашия пример изходът на сензора ще бъде свързан към цифров щифт 2 - тъй като той ще задейства прекъсване за изчисляване на скоростта. Скицата иначе ще показва скоростта на нормален LCD модул с I2C интерфейс. Предлага се интерфейсът I2C, тъй като това изисква само 4 проводника от платката Arduino към LCD - колкото по -малко проводници, толкова по -добре.

Ето скицата за вашето проучване:

/*Основен скоростомер с помощта на millis (); */

#include "Wire.h" // за I2C шина LCD

#include "LiquidCrystal_I2C.h" // за I2C шина LCD модул - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // задайте LCD адреса на 0x27 за 16 символен и 2 -редов дисплей

плаващ старт, завършен;

поплавък измина, време; float circMetric = 1,2; // обиколка на колелото спрямо позицията на сензора (в метри) float circImperial; // използвайки 1 километър = 0,621371192 мили float speedk, speedm; // съдържа изчислени скорости на валиди в метрични и имперски

void setup ()

{attachInterrupt (0, speedCalc, RISING); // прекъсване, извикано, когато сензорите изпращат цифров 2 висок (всяко завъртане на колелото) start = millis (); // настройка на LCD lcd.init (); // инициализираме lcd lcd.backlight (); // включване на LCD подсветката lcd.clear (); lcd.println ("Носете каска!"); забавяне (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // конвертираме метрика в имперска за изчисления на MPH}

void speedCalc ()

{elapsed = millis ()-начало; start = millis (); speedk = (3600*circMetric)/изтекло; // km/h speedm = (3600*circImperial)/изтекло; // Мили в час }

void loop ()

{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 () за момента. Има и микросхемите (); функция, която отчита микросекунди.

Ето го - още една практична функция, която може да позволи разрешаването на повече проблеми чрез света на Arduino. Както винаги, сега от вас и от въображението ви зависи да намерите нещо, което да контролирате или да се докоснете до други манипулации.

Тази публикация ви е предоставена от pmdway.com - всичко за производители и ентусиасти на електрониката, с безплатна доставка по целия свят.

Препоръчано: