Esikhathini esedlule sashicilela ulwazi olwengeziwe mayelana ne- millis() umsebenzi de I-ArduinoManje sizojula kule ndaba Isikhathi se-Arduino, ukuze uqalise ngalesi sici sesici, qonda ukuthi leli bhodi lisiphatha kanjani isikhathi ne-MCU, kanye neminye imisebenzi engale kwe-millis().
Yini i-Arduino Timer?
El Isikhathi se-Arduino, noma isibali sikhathi, kuwumsebenzi osetshenziswa yi-hardware (ku-microcontroller, ngosizo lwekristalu ye-quartz ekhiqiza ama-pulses wewashi futhi ebeka "isigqi", ngaphandle kwesidingo se-hardware yangaphandle noma i-ICs 555) evumela ukulawula imicimbi yesikhashana ngenxa yamawashi. yangaphakathi. Isibonelo, ukwenza umsebenzi wenzeke ngezikhathi ezithile, ukwenza izilinganiso zesikhathi ezinembile, njll., ngaphandle kwekhodi yomdwebo.
Cabanga ukuthi usebenzisa i- delay() umsebenzi, lokhu kuzovimba ukusebenza ku-Arduino MCU kuze kudlule isikhathi esishiwo bese uqhubeka nohlelo, kodwa isibali sikhathi ngeke sivimbe. Kuzoba isikhathi njengoba i-MCU iqhubeka nokwenza eminye imiyalo kanye kanye. Yilokho inzuzo enkulu.
Isibali sikhathi sihlobene ne iziphazamiso ze-Arduino, njengoba zizobulawa ngazo ukuze zihambele umsebenzi othile. Ngamanye amazwi, i-Arduino Timer iwumsebenzi oqalwa ngesikhathi esithile, wenze umsebenzi ophazamisayo. Yingakho kubalulekile futhi ukwazi ngalezi ziphazamiso.
Amamodi
I-Arduino Timer ine 2 izindlela zokusebenza, ukwazi ukuyisebenzisa ku:
- Isignali ye-PWM: Ungakwazi ukulawula Izikhonkwane ze-Arduino (~).
- I-CTC (Sula isibali sikhathi ekuqhathaniseni okufanayo): ibala isikhathi ngaphakathi kwekhawunta futhi uma ifika kunani elishiwo kurejista yezibali-sikhathi, ukuphazamisa kuyenziwa.
Zingaki izikhathi ezinazo? Izinhlobo Zezibali-zikhathi
Kukhona 3 izikhathi emapuletini Arduino UNO, nakuba kungase kube nokunye kwamanye amapuleti aphezulu:
- Isikhathi 0: 8-bit, ingabala ukusuka ku-0 kuye ku-255 (amanani angenzeka angama-256). Kusetshenziswa imisebenzi efana nokulibaziseka(), millis(), kanye nama-micros(). Ukuguqulwa kwayo akunconywa ukuze kungashintshi izinhlelo.
- Isikhathi 1: ilingana ne-Timer 0. Isetshenziswa ilabhulali ye-Servo eku-UNO (Isibali sikhathi 5 se-MEGA).
- Isikhathi 2: 16-bit, futhi ingasukela ku-0 kuye ku-65.525 (amanani angaba ngu-65.536). Isetshenziselwa umsebenzi wethoni(), uma ingasetshenziswa, ingasetshenziswa ngokukhululeka kuhlelo lwakho lokusebenza.
- Isikhathi 3, 4, 5 (ku-Arduino MEGA kuphela): yonke i-16-bit.
Sisebenza kanjani i-Arduino Timer?
Ukuze ukwazi sebenza nge-Arduino Timer, kubalulekile ukwazi ukuthi konke lokhu kusebenza kanjani ngekhompyutha ku-MCU yaleli bhodi lokuthuthukisa:
- Imvamisa yewashi: inombolo yemijikelezo ngomzuzwana ekwazi ukuyithuthukisa, esimweni se-Arduino yi-16 Mhz, noma yini efanayo, isignali yewashi i-oscillates izikhathi ezingu-16.000.000 ngomzuzwana (imijikelezo).
- Isikhathi: imelelwa u-T, futhi ikalwa ngamasekhondi, futhi iwukuphambene kwemijikelezo. Isibonelo, T=1/C, okungaholela ku-1/16000000 = 0.0000000625, isikhathi esingasithatha ukuze umjikelezo ngamunye uphele. Futhi i-frequency iwukuphambene nesikhathi, ngakho-ke f = 1/T.
- Umjikelezo: ukuphindaphinda ngakunye kwesignali okwenzeka ngeyunithi yesikhathi. Ku-Arduino kungaba ngu-16M ngomzuzwana. Noma yini efanayo, kulokhu, lapho imijikelezo eyizigidi ezingu-16 isidlulile, umzuzwana owodwa usudlulile. Ngakho-ke, umjikelezo owodwa kungathiwa uthatha ama-625 ns.
- emaphethelweni esignali: Izimpawu zewashi ziyisikwele, futhi imiphetho ingakhuphuka noma yehle. Unqenqema umugqa oqondile wesiginali uma ishintsha ukusuka ku-:
- 0 (phansi) ukuya ku-1 (phezulu): unqenqema olukhuphukayo.
- 1 (phezulu) kuya ku-0 (phansi): unqenqema oluwayo.
Imiphetho ibalulekile ngoba izibali sikhathi ze-Arduino zikala imijikelezo ukusuka emaphethelweni esignali. A) Yebo i-contador iyakhula ngomjikelezo ngamunye futhi lapho ifinyelela inani lerejista, ukuphazamisa kukhishwa.
Ngakho-ke, uma ukwazi lokhu, uma ukwazi 16Mhz ku-Arduino MCU, kanye nesibali-sikhathi esingu-8-bit sisetshenziswa, kungashiwo ukuthi ukuphazamiseka kuzokwenzeka njalo ngo-16 μs (256/16000000) noma u-4 ms ku-16-bit (65536/16000000). Ngakho-ke, uma usetha irejista yekhawunta ye-16-bit ibe phezulu, enenani elingu-65535, khona-ke ukuphazamiseka kuzokwenzeka ngo-4 ms ukwenza noma yimuphi umsebenzi okuwu.
Lapho ikhawunta ifinyelela inani eliphakeme kakhulu elingenzeka, izobuyela ku-0 futhi. Okusho ukuthi, ukuchichima kwenzeka futhi kuzobala emuva kusukela ekuqaleni.
Ukuze ulawule izinga lokunyuka kwesibali sikhathi ungasebenzisa futhi i-prescaler, ethatha amanani 1, 8, 64, 256 kanye no-1024 futhi iguqule isikhathi kanje:
Isivinini Sesikhathi (Hz) = Imvamisa yewashi le-Arduino / Prescaler
Uma kungu-1 i-prescaler isilawuli sizokhuphuka sibe ngu-16 Mhz, uma singu-8 kuya ku-2 Mhz, uma singama-64 kuya ku-250 kHz, njalonjalo. Khumbula ukuthi kuzoba khona isiqhathaniso sesimo sesibali sesikhathi sokuqhathanisa inani lekhawunta nesilinganisi sangaphambili kuze kube ziyalingana bese wenza isenzo. Ngakho, phazamisa imvamisa inikezwa ngefomula:
Isivinini Sokuphazamisa (Hz) = I-Arduino / Prescaler Clock Frequency (inani lerejista yesiqhathanisi + 1)
Ngenhlanhla, akufanele guqula amarekhodi ye-Arduino Timers, njengoba izonakekelwa yimitapo yolwazi esiyisebenzisa kukhodi. Kodwa uma zingasetshenzisiwe, kufanele zilungiselelwe.
Izibonelo ku-Arduino IDE
Ukuze ukuqonde konke lokhu kangcono, lapha ngibonisa amakhodi amabili emidwebo we-Arduino IDE ongathola ngawo ukuzwa ukusetshenziswa kwezibali sikhathi. Eyokuqala ikhodi ezocwayiza i-LED exhunywe ku-Arduino pin 8 njalo ngomzuzwana:
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configurar Timer1 TCCR1A = 0; //Registro control A a 0, pines OC1A y OC1B deshabilitados TCCR1B = 0; //Limpia el registrador TCCR1B |= (1<<CS10)|(1 << CS12); //Configura prescaler a 1024: CS12 = 1 y CS10 = 1 TCNT1 = 0xC2F8; //Iniciar timer para desbordamiento a 1 segundo //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal TIMSK1 |= (1 << TOIE1); //Habilitar interrupción para Timer1 } void loop() { } ISR(TIMER1_OVF_vect) //Interrupción del TIMER1 { TCNT1 = 0xC2F7; // Reniciar Timer1 digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }
Hlela ukucwayiza noma ukucwayiza kwe-LED, njengasekuqaleni njalo ngomzuzwana, kodwa kulokhu usebenzisa I-CTC i.e. ukuqhathanisa:
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configuración Timer1 TCCR1A = 0; //Registro de control A a 0 TCCR1B = 0; //Limpiar registro TCNT1 = 0; //Inicializar el temporizador OCR1A = 0x3D08; //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08 TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12); //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1 TIMSK1 |= (1 << OCIE1A); //Habilita interrupción por igualdad de comparación } void loop() { } ISR(TIMER1_COMPA_vect) //Interrupción por igualdad de comparación en TIMER1 { digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }
Okuningi mayelana nohlelo lwe-Arduino
ukuthenga ipuleti Arduino UNO Isambiso3