Sisällysluettelo:

Arduinon ajoitusmenetelmät millien kanssa (): 4 vaihetta
Arduinon ajoitusmenetelmät millien kanssa (): 4 vaihetta

Video: Arduinon ajoitusmenetelmät millien kanssa (): 4 vaihetta

Video: Arduinon ajoitusmenetelmät millien kanssa (): 4 vaihetta
Video: Makeblock Untimate Robot Kit Part 1 : Step by Step Assembly Robot of Aram Tank 2024, Marraskuu
Anonim
Arduinon ajoitusmenetelmät millien kanssa ()
Arduinon ajoitusmenetelmät millien kanssa ()

Tässä artikkelissa esittelemme millis (); -toimintoa ja käytä sitä erilaisten ajoitusesimerkkien luomiseen.

Milliä? Ei mitään tekemistä huulipullojen kanssa… toivottavasti tunnistit milli olevan tuhannesosien numeerinen etuliite; joka kertoo mittayksikön 0,001: llä (tai kymmenellä negatiivisen 3: n potenssiin).

Mielenkiintoista on, että Arduino-järjestelmämme laskee millisekuntien lukumäärän (tuhansia sekunteja) luonnoksen käynnistämisestä siihen saakka, kunnes lukema saavuttaa enimmäismäärän, joka voidaan tallentaa muuttujatyyppiin, jota ei ole allekirjoitettu pitkäksi (32-bittinen [neljän tavun] kokonaisluku -joka vaihtelee nollasta arvoon (2^32) -1. (2^32) -1 tai 4294967295 millisekuntia muuntaa 49.71027 parittomaksi päiväksi.

Laskuri nollautuu, kun Arduino nollataan, se saavuttaa maksimiarvon tai uusi luonnos ladataan. Jos haluat saada laskurin arvon tietyssä vaiheessa, soita funktio - esimerkiksi:

alku = millis ();

Alku on allekirjoittamaton pitkä muuttuja. Tässä on hyvin yksinkertainen esimerkki, joka näyttää millis () toiminnassa:

/ * millis () esittely */

allekirjoittamaton pitkä alku, päättynyt, kulunut;

mitätön asennus ()

{Serial.begin (9600); }

tyhjä silmukka ()

{Serial.println ("Aloita…"); alku = millis (); viive (1000); valmis = millis (); Serial.println ("Valmis"); kulunut = valmis-aloitus; Sarjajälki (kulunut); Serial.println ("millisekuntia kulunut"); Sarja.println (); viive (500); }

Luonnos tallentaa nykyisen millisluvun aluksi, odottaa sitten sekunnin ja tallentaa sitten millisarjan arvon valmiiksi. Lopuksi se laskee viiveen kuluneen ajan. Seuraavassa sarjamonitorin näytössä näet, että kesto ei aina ollut täsmälleen 1000 millisekuntia, kuten kuvassa näkyy.

Vaihe 1:

Kuva
Kuva

Yksinkertaisesti sanottuna, millis -toiminto käyttää sisäistä laskuria ATmega -mikrokontrollerissa Arduinon sydämessä. Tämä laskuri kasvaa jokaisen kellosyklin aikana - mikä tapahtuu (vakio Arduinossa ja yhteensopivissa laitteissa) kellotaajuudella 16 Mhz. Tätä nopeutta ohjaa Arduino -levyn kristalli (hopeinen asia, johon on leimattu T16.000).

Vaihe 2:

Kuva
Kuva

Kristallien tarkkuus voi vaihdella ulkoisen lämpötilan ja itse kiteen toleranssin mukaan. Tämä puolestaan vaikuttaa millisekuntatuloksen tarkkuuteen. Anekdoottisten kokemusten mukaan ajoitustarkkuuden poikkeama voi olla noin kolme tai neljä sekuntia 24 tunnin aikana.

Jos käytät levyä tai omaa versiota, jossa käytetään keraamista resonaattoria kristallin sijasta, huomaa, että ne eivät ole yhtä tarkkoja ja mahdollistavat korkeamman drift -tason. Jos tarvitset paljon korkeamman ajoitustarkkuuden, harkitse tiettyjä ajastinpiirejä, kuten Maxim DS3231.

Nyt voimme käyttää milliä eri ajoitustoimintoihin. Kuten edellisessä esimerkkiluonnoksessa osoitettiin, voimme laskea kuluneen ajan. Tämän ajatuksen viemiseksi eteenpäin tehdään yksinkertainen sekuntikello. Se voi olla niin yksinkertaista tai monimutkaista kuin on tarpeen, mutta tässä tapauksessa siirrymme yksinkertaiseen.

Laitteiston kannalta meillä on kaksi painiketta-Käynnistä ja Pysäytä-ja 10 k ohmin alasvetovastus on kytketty vastaavasti digitaalisiin nastoihin 2 ja 3. Kun käyttäjä painaa käynnistyspainiketta, luonnos kirjaa arvoksi millisekunteja - sen jälkeen kun pysäytyspainiketta on painettu, luonnos kirjaa uudelleen arvon millisekunteina, laskee ja näyttää kuluneen ajan. Käyttäjä voi sitten toistaa prosessin painamalla käynnistyspainiketta tai päivittää tietoja pysähtymällä. Tässä on luonnos:

/* Super-perus-sekuntikello millis (); */

allekirjoittamaton pitkä alku, päättynyt, kulunut;

mitätön asennus ()

{Serial.begin (9600); pinMode (2, TULO); // käynnistyspainike pinMode (3, INPUT); // pysäytyspainike Serial.println ("Paina 1 Käynnistä/Nollaa, 2 kuluneen ajan ajan"); }

tyhjä näyttöResult ()

{kellua h, m, s, ms; allekirjoittamaton pitkään; kulunut = valmis-aloitus; h = int (kulunut/3600000); yli = kulunut%3600000; m = int (yli/60000); yli = yli%60000; s = int (yli/1000); ms = yli%1000; Serial.print ("Raw kulunut aika:"); Serial.println (kulunut); Serial.print ("Kulunut aika:"); Sarjanjälki (h, 0); Serial.print ("h"); Sarjanjälki (m, 0); Sarjajälki ("m"); Sarjajälki (s, 0); Serial.print ("s"); Sarjajälki (ms, 0); Serial.println ("ms"); Sarja.println (); }

tyhjä silmukka ()

{if (digitalRead (2) == HIGH) {start = millis (); viive (200); // Debounce Serial.println ("Aloitettu…"); } if (digitalRead (3) == HIGH) {valmis = millis (); viive (200); // debounce displayResult (); }}

Viivepuheluita () käytetään kytkimien poistamiseen - nämä ovat valinnaisia ja niiden käyttö riippuu laitteistostasi. Kuva on esimerkki luonnoksen sarjamonitorilähdöstä - sekuntikello on käynnistynyt, ja sitten painiketta kaksi painetaan kuusi kertaa ajanjaksojen aikana.

Vaihe 3: Nopeusmittari…

Image
Image

Jos sinulla oli anturi kiinteän matkan alussa ja lopussa, nopeus voitaisiin laskea: nopeus = matka ÷ aika.

Voit myös tehdä nopeusmittarin pyörillä varustetulle liikkeelle, esimerkiksi polkupyörälle. Tällä hetkellä meillä ei ole polkupyörää sekaannettavaksi, mutta voimme kuvata prosessin sen tekemiseksi - se on melko yksinkertaista. (Vastuuvapauslauseke - tee se omalla vastuullasi jne.)

Tarkastellaan ensin tarvittavaa matematiikkaa. Sinun on tiedettävä pyörän ympärysmitta. Laitteisto - tarvitset anturin. Esimerkiksi - ruoko -kytkin ja magneetti. Pidä ruoko-kytkin normaalisti auki -painikkeena ja liitä tavalliseen tapaan 10 k ohmin vedettävällä vastuksella.

Toiset voivat käyttää hall-efektianturia-kukin omalla tavallaan). Muista matematiikan luokasta kehän laskeminen - käytä kaavaa: ympärysmitta = 2πr missä r on ympyrän säde.

Nyt kun sinulla on pyörän ympärysmitta, tätä arvoa voidaan pitää "kiinteänä etäisyytenä", ja siksi nopeus voidaan laskea mittaamalla täyden kierroksen välinen aika.

Kun anturi on asennettu, sen pitäisi toimia samalla tavalla kuin normaalisti auki oleva painike, jota painetaan joka kierros. Luonnoksemme mittaa jokaisen anturista tulevan pulssin välisen ajan.

Tätä varten esimerkissämme on anturilähtö kytketty digitaaliseen nastaan 2 - koska se laukaisee keskeytyksen nopeuden laskemiseksi. Luonnos näyttää muuten nopeuden normaalissa I2C-liitännän LCD-moduulissa. I2C -rajapintaa ehdotetaan, koska tämä vaatii vain 4 johtoa Arduino -kortilta nestekidenäyttöön - mitä vähemmän johtoja, sitä parempi.

Tässä on luonnos luettavaksesi:

/*Perusnopeusmittari millis (); */

#sisältää "Wire.h" // I2C -väylän nestekidenäytölle

#include "LiquidCrystal_I2C.h" // I2C -väylän LCD -moduulille - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // aseta LCD -osoitteeksi 0x27, jos haluat 16 merkkiä ja 2 riviä

kelluva käynnistys, valmis;

kelluva aika, aika; float circMetric = 1,2; // pyörän ympärysmitta suhteessa anturin asemaan (metreinä) float circImperial; // käyttäen 1 kilometriä = 0.621371192 mailia float speedk, speedm; // pitää lasketut nopeusarvot metrisinä ja keisarillisina

mitätön asennus ()

{attachInterrupt (0, speedCalc, RISING); // keskeytys kutsutaan, kun anturit lähettävät digitaalisen 2 korkean (jokaisen pyörän pyörimisen) käynnistyksen = millis (); // LCD -näytön asennus lcd.init (); // alustetaan lcd lcd.backlight (); // kytke LCD -taustavalo päälle lcd.clear (); lcd.println ("Käytä kypärää!"); viive (3000); lcd.clear (); Sarja.alku (115200); circImperial = circMetric*.62137; // muuntaa metrinen imperiaaliseksi MPH -laskelmia varten}

tyhjä nopeusCalc ()

{kulunut = millis ()-aloita; alku = millis (); speedk = (3600*circMetric)/kulunut; // km/h speedm = (3600*circImperial)/kulunut; // Mailia tunnissa }

tyhjä silmukka ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km/h"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (kulunut)); lcd.print ("ms/rev"); viive (1000); // säädä henkilökohtaisten mieltymysten mukaan välkkymisen minimoimiseksi}

Siellä ei tapahdu niin paljon - joka kerta, kun pyörä suorittaa yhden kierroksen, anturin signaali siirtyy alhaisesta korkeaan - laukaisee keskeytyksen, joka kutsuu funktion speedCalc ().

Tämä mittaa millimetreinä () ja laskee sitten nykyisen ja edellisen lukeman välisen eron - tästä arvosta tulee aika, joka kuluu matkan (joka on pyörän ympärysmitta suhteessa anturiin) suorittamiseen

float circMetric = 1,2;

ja mitataan metreinä). Lopulta se laskee nopeuden km/h ja MPH. Keskeytysten välillä luonnos näyttää päivitetyt nopeustiedot nestekidenäytössä sekä raaka -ajan arvon jokaiselle kierrokselle uteliaisuuden vuoksi. Tosielämässä en usko, että kukaan kiinnittäisi LCD -näyttöä polkupyörään, ehkä LED -näyttö olisi tärkeämpi.

Tällä välin voit nähdä, miten tämä esimerkki toimii seuraavassa lyhyessä videoleikkeessä. Pyörän ja ruoko-kytkimen/magneettiyhdistelmän sijasta olen liittänyt toimintogeneraattorin neliöaaltoisen ulostulon keskeytystapaan simuloimaan anturin pulsseja, jotta saat käsityksen siitä, miten se toimii.

Vaihe 4:

Se summaa milis (): n käytön toistaiseksi. Siellä on myös micros (); toiminto, joka laskee mikrosekunteja.

Joten sinulla on se - toinen käytännöllinen toiminto, jonka avulla voit ratkaista lisää ongelmia Arduinon maailman kautta. Kuten aina, nyt sinun ja mielikuvituksesi on löytää jotain hallittavaa tai päästä muiden huijareiden kimppuun.

Tämän viestin toi sinulle pmdway.com - kaikki valmistajille ja elektroniikan harrastajille, ilmainen toimitus maailmanlaajuisesti.

Suositeltava: