မကြာသေးမီက ကျွန်ုပ်တို့သည် ၎င်းနှင့်ပတ်သက်သည့် နောက်ထပ်အချက်အလက်များကို ထုတ်ပြန်ခဲ့သည်။ millis() လုပ်ဆောင်ချက် de Arduinoယခုကျွန်ုပ်တို့သည် နက်နဲစွာ နက်ရှိုင်းစွာ နက်ရှိုင်းစွာ လေ့လာကြပါမည်။ Arduino Timerအင်္ဂါရပ်အတွက် ဤအင်္ဂါရပ်ကို စတင်ရန်၊ ဤဘုတ်အဖွဲ့သည် MCU နှင့် အချိန်ကို စီမံခန့်ခွဲပုံအပြင် millis() ကျော်လွန်သည့် အခြားလုပ်ဆောင်ချက်များကို နားလည်ပါ။
အညွှန်းကိန်း
Arduino Timer ဆိုတာဘာလဲ။
El Arduino timer သို့မဟုတ် timer, သည် ဟာ့ဒ်ဝဲလ် သို့မဟုတ် ICs 555 မလိုအပ်ဘဲ နာရီလက်တံများကိုထုတ်ပေးသည့် quartz crystal ၏အကူအညီဖြင့် မိုက်ခရိုကွန်ထရိုလာတွင် လုပ်ဆောင်သည့်လုပ်ဆောင်ချက်တစ်ခုဖြစ်ပြီး၊ ပြင်ပဟာ့ဒ်ဝဲ (သို့) ICs XNUMX မလိုအပ်ဘဲ) ယာယီဖြစ်ရပ်များကို ထိန်းချုပ်နိုင်စေသော၊ အတွင်းပိုင်း။ ဥပမာအားဖြင့်၊ အလုပ်တစ်ခုအား အချိန်အပိုင်းအခြားအလိုက် ပြုလုပ်ခြင်း၊ တိကျသောအချိန်တိုင်းတာမှုများပြုလုပ်ခြင်း စသည်ဖြင့် ပုံကြမ်းကုဒ်နှင့် ကင်းကွာသည်။
သင်အသုံးပြုသည်ဟု မြင်ယောင်ကြည့်ပါ။ delay() လုပ်ဆောင်ချက်သတ်မှတ်ထားသောအချိန်ကုန်သွားသည်အထိ ၎င်းသည် Arduino MCU တွင် လုပ်ဆောင်မှုကို ပိတ်ဆို့မည်ဖြစ်ပြီး ပရိုဂရမ်ကို ဆက်လက်လုပ်ဆောင်ရန်၊ သို့သော် အချိန်တိုင်းကိရိယာသည် ပိတ်ဆို့မည်မဟုတ်ပါ။ MCU သည် အခြားသော ညွှန်ကြားချက်များကို တစ်ပြိုင်နက် ဆက်လက်လုပ်ဆောင်နေသဖြင့် အချိန်ကိုက် ဖြစ်လိမ့်မည်။ အဲဒါက မဟာ အားသာချက်ပါ။
timer နဲ့ သက်ဆိုင်ပါတယ်။ အနှောင့်အယှက်များ Arduino ၏ သီးခြားလုပ်ငန်းတာဝန်အချို့ကို တက်ရောက်ရန် ၎င်းတို့မှတစ်ဆင့် ကွပ်မျက်ခံရမည်ဖြစ်သောကြောင့်ဖြစ်သည်။ တစ်နည်းဆိုရသော် Arduino Timer သည် အနှောင့်အယှက်ပေးသည့်လုပ်ဆောင်ချက်ကို လုပ်ဆောင်ပေးသည့် တစ်ချိန်တည်းတွင် အစပျိုးလုပ်ဆောင်သည့် လုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ ထို့ကြောင့် ဤအနှောင့်အယှက်များအကြောင်း သိရန်လည်း အရေးကြီးပါသည်။
နည်းလမ်းများ
Arduino Timer ပါရှိပါသည်။ 2 operating Modes သာ၊ ၎င်းကို အသုံးပြုနိုင်ခြင်း ၊
- PWM အချက်ပြ: သင်ထိန်းချုပ်နိုင်ပါတယ်။ Arduino pins (~).
- CTC (နှိုင်းယှဥ်ပြိုင်မှုတွင် အချိန်တိုင်းကိုရှင်းလင်းပါ): ကောင်တာတစ်ခုအတွင်းရှိအချိန်ကိုရေတွက်ပြီး timers ၏မှတ်ပုံတင်ခြင်းတွင်သတ်မှတ်ထားသောတန်ဖိုးသို့ရောက်ရှိသောအခါ၊ အနှောင့်အယှက်ကိုလုပ်ဆောင်သည်။
သူ့မှာ တိုင်မာ ဘယ်လောက်ရှိလဲ။ Timers အမျိုးအစားများ
အဲဒီမှာ တိုင်မာ ၂ ခု ပန်းကန်များပေါ်တွင် Arduino UNOအခြားထိပ်ပြားများတွင် ပို၍ရှိနိုင်သော်လည်း၊
- တိုင်မာ ၁: 8-bit၊ 0 မှ 255 အထိ ရေတွက်နိုင်သည် (ဖြစ်နိုင်ချေ တန်ဖိုး 256)။ delay(), millis(), နှင့် micros() ကဲ့သို့သော လုပ်ဆောင်ချက်များဖြင့် အသုံးပြုသည်။ ပရိုဂရမ်များကို မပြောင်းလဲစေရန် ၎င်း၏ပြုပြင်မွမ်းမံခြင်းကို အကြံပြုထားခြင်းမရှိပါ။
- တိုင်မာ ၁: Timer 0 နှင့် ညီမျှသည်။ UNO တွင် Servo စာကြည့်တိုက်မှ အသုံးပြုသည် (MEGA အတွက် Timer 5)။
- တိုင်မာ ၁: 16-bit နှင့် 0 မှ 65.525 (ဖြစ်နိုင်ချေတန်ဖိုးများ 65.536)။ tone() လုပ်ဆောင်ချက်အတွက် သုံးသည်၊ အသုံးမပြုပါက၊ ၎င်းကို သင့်အပလီကေးရှင်းအတွက် လွတ်လပ်စွာ အသုံးပြုနိုင်သည်။
- Timer 3၊ 4၊ 5 (Arduino MEGA တွင်သာ): အားလုံး 16-bit ။
Arduino Timer သည် မည်သို့အလုပ်လုပ်သနည်း။
သို့ Arduino Timer ဖြင့်အလုပ်လုပ်ပါ။ဤအရာအားလုံးသည် ဤဖွံ့ဖြိုးတိုးတက်မှုဘုတ်အဖွဲ့၏ MCU တွင် အီလက်ထရွန်နစ်စနစ်ဖြင့် မည်သို့အလုပ်လုပ်သည်ကို သိရန် အရေးကြီးသည်-
- နာရီအကြိမ်ရေArduino မှာ 16 Mhz သို့မဟုတ် အတူတူပါပဲ၊ တစ်စက္ကန့်မှာ 16.000.000 ကြိမ် (စက်ဝိုင်း) လည်ပတ်နိုင်တဲ့ cycles per second အရေအတွက်ဖြစ်ပါတယ်။
- ကာလ: ကို T ဖြင့် ကိုယ်စားပြုပြီး စက္ကန့်ဖြင့် တိုင်းတာပြီး သံသရာ၏ ပြောင်းပြန်ဖြစ်သည်။ ဥပမာအားဖြင့်၊ T=1/C၊ 1/16000000 = 0.0000000625 ရလဒ်ဖြစ်မည့်၊ သံသရာတစ်ခုစီတိုင်းအတွက် အချိန်ယူရမည်ဖြစ်ပါသည်။ ကြိမ်နှုန်းသည် ကာလ၏ ပြောင်းပြန်ဖြစ်သောကြောင့် f = 1/T ဖြစ်သည်။
- သံသရာ: သည် အချိန်ယူနစ်အလိုက် ဖြစ်ပေါ်သည့် signal ၏ ထပ်ခါတလဲလဲမှုတစ်ခုစီဖြစ်သည်။ Arduino တွင် တစ်စက္ကန့်အတွင်း 16M ရှိသည်။ ဒါမှမဟုတ် အတူတူပါပဲ၊ ဒီကိစ္စမှာ သံသရာ 16 သန်းကျော်သွားတဲ့အခါ တစ်စက္ကန့်ကျော်သွားပါပြီ။ ထို့ကြောင့် သံသရာတစ်ခုသည် 625 ns ယူသည်ဟု ဆိုနိုင်သည်။
- signal တစ်ခု၏အစွန်း: နာရီအချက်ပြမှုများသည် စတုရန်းဖြစ်ပြီး အစွန်းများသည် မြင့်တက်လာနိုင်သည် သို့မဟုတ် ကျဆင်းနိုင်သည်။ အစွန်းတစ်ခုသည် ၎င်းမှပြောင်းသည့်အခါ အချက်ပြ၏ မျဉ်းဖြောင့်ဖြစ်သည်။
- 0 (နိမ့်) မှ 1 (မြင့်) : အနားတက်လာခြင်း။
- 1 (မြင့်) မှ 0 (နိမ့်) : ပြုတ်ကျသောအစွန်း။
Arduino timers များသည် signal edges မှ cycles များကို တိုင်းတာသောကြောင့် edges များသည် အရေးကြီးပါသည်။ က) ဟုတ်ကဲ့ contador ၎င်းသည် လည်ပတ်မှုတစ်ခုစီနှင့် တိုးလာပြီး မှတ်ပုံတင်တန်ဖိုးသို့ ရောက်ရှိသောအခါ၊ ကြားဖြတ်ကို လုပ်ဆောင်သည်။
ထို့ကြောင့် ဤအရာကို သိသည်နှင့် ဆိုလျှင်၊ Arduino MCU တွင် 16Mhz8-bit Timer ကိုအသုံးပြုထားပြီး 16 μs (256/16000000) တိုင်း သို့မဟုတ် 4-bit (16/65536) အတွက် 16000000 ms ကြားနှောက်ယှက်မှုများ ဖြစ်ပေါ်မည်ဟု ဆိုနိုင်ပါသည်။ ထို့ကြောင့် သင်သည် 16-bit ကောင်တာမှတ်ပုံတင်ခြင်းကို အမြင့်ဆုံးသို့တန်ဖိုး 65535 ဖြင့်သတ်မှတ်ထားပါက ၎င်းသည် မည်သည့်တာဝန်ကိုမဆိုလုပ်ဆောင်ရန် 4 ms တွင်အနှောင့်အယှက်ဖြစ်လိမ့်မည်။
ကောင်တာသည် ဖြစ်နိုင်ချေအများဆုံးတန်ဖိုးသို့ရောက်ရှိသောအခါ၊ 0 သို့ ပြန်သွားပါမည်။. ဆိုလိုသည်မှာ၊ လျှံတက်လာပြီး အစမှ ပြန်ရေတွက်မည်ဖြစ်သည်။
timer ၏တိုးနှုန်းကိုထိန်းချုပ်ရန်သင်လည်းသုံးနိုင်သည်။ prescaler တစ်ခုတန်ဖိုးများ 1၊ 8၊ 64၊ 256 နှင့် 1024 ကိုယူ၍ အချိန်ကို ဤကဲ့သို့ ပြောင်းလဲပေးသည်-
Timer Speed (Hz) = Arduino/Prescaler ၏ နာရီကြိမ်နှုန်း
၎င်းသည် 1 prescaler ဖြစ်ပါက controller သည် 16 Mhz၊ 8 မှ 2 Mhz ဖြစ်ပါက၊ 64 မှ 250 kHz ဖြစ်ပါက၊ စသည်တို့ဖြစ်သည်။ ကောင်တာ၏တန်ဖိုးနှင့် ကြိုတင်စကေးကိရိယာ၏တန်ဖိုးကို နှိုင်းယှဉ်ကာ လုပ်ဆောင်ချက်တစ်ခုကို လုပ်ဆောင်သည့်အချိန်အထိ တိုင်မာကောင်တာအခြေအနေ နှိုင်းယှဉ်မှုတစ်ခုရှိမည်ကို သတိရပါ။ ဒီတော့၊ interrupt အကြိမ်ရေ ဖော်မြူလာဖြင့် ပေးသည်-
Interrupt Speed (Hz) = Arduino / Prescaler Clock Frequency (နှိုင်းယှဉ်မှု မှတ်ပုံတင်တန်ဖိုး + 1)
ကံအားလျော်စွာ ကျွန်တော်တို့ မနေရဘူး။ မှတ်တမ်းများကိုမွမ်းမံပါ။ Arduino Timers ၏ ကုဒ်တွင် ကျွန်ုပ်တို့အသုံးပြုသော စာကြည့်တိုက်များမှ ဂရုစိုက်ပေးမည်ဖြစ်သောကြောင့်၊ သို့သော် အသုံးမပြုပါက၊ ၎င်းတို့ကို configure လုပ်သင့်သည်။
Arduino IDE တွင် နမူနာများ
ဤအရာအားလုံးကို ပိုကောင်းနားလည်စေရန်အတွက်၊ ဤနေရာတွင် Arduino IDE အတွက် ပုံကြမ်းကုဒ်နှစ်ခုကို သင်အချိန်တိုင်းကိရိယာများအသုံးပြုခြင်းကို တွေ့ကြုံခံစားနိုင်စေရန် ဤနေရာတွင် ကျွန်ုပ်ပြသထားပါသည်။ ပထမအချက်မှာ Arduino pin 8 နှင့် ချိတ်ဆက်ထားသော LED တစ်ခုကို စက္ကန့်တိုင်း မှိတ်တုတ်မှိတ်တုတ်ဖြစ်စေမည့် ကုဒ်ဖြစ်သည်။
#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 }
ယခင်ကိစ္စများတွင် စက္ကန့်တိုင်းကဲ့သို့ LED မှိတ်တုတ်မှိတ်တုတ်မှိတ်တုတ်မှိတ်တုတ်မှိတ်တုတ်မှိတ်တုတ်မှိတ်တုတ်မှိတ်တုတ်မှိတ်တုတ်မပြဘဲ ပရိုဂရမ်ကိုအသုံးပြုပါ။ CTC ဆိုလိုသည်မှာ နှိုင်းယှဉ်မှု:
#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 }
Arduino programming အကြောင်း နောက်ထပ်
တစ်ပန်းကန်ဝယ် Arduino UNO ဗျာ၃
မှတ်ချက်ပေးရန်ပထမဦးဆုံးဖြစ်