Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Kode 3.4 : Pengukuran Periode dengan Interupsi
- #define PERIODE_DISPLAY 5
- #define PERIODE_GATE 100
- #define NPulse 10
- // Pemetaan Port
- #define BUTTON1 A2
- #define OPTO 2
- #define BCD1 8
- #define T1 12
- #define T2 13
- #define MOTOR_INPUT1 3
- #define MOTOR_INPUT2 A1
- // fungsi-fungsi dari modul sebelumnya
- boolean s1IsPressed() {
- static boolean b1_old = 0;
- boolean b1 = digitalRead (BUTTON1);
- boolean s1 = (b1 && !b1_old);
- b1_old = b1;
- return s1;
- }
- void writeDigit(int bcd){
- for (int i=0; i<4; i++){
- digitalWrite(BCD1 + i, bcd & 0x01);
- bcd = bcd >> 1;
- }
- }
- int digits[3];
- void writeDigit3(int data) {
- digits[0] = data%10;
- data = data/10;
- digits[1] = data % 10;
- data = data / 10;
- digits[2] = data %10;
- }
- int index = 0;
- void shiftDigit() {
- writeDigit(digits[index]);
- digitalWrite(T1, index & 0x02);
- digitalWrite(T2, index & 0x01);
- index = (index + 1) % 3;
- }
- // memeriksa ada tidaknya pulsa pada optocoupler
- boolean optoIsFired() {
- static boolean b1_old = 1;
- boolean b1 = digitalRead(OPTO);
- boolean s1 = (b1 && !b1_old);
- b1_old = b1;
- return s1;
- }
- //variabel global
- long tdisplay, tgate;
- volatile long pulse;
- int pwm;
- void setup() {
- Serial.begin(115200);
- Serial.println("Pengukuran Periode dengan Interupsi");
- // inisialisasi mode pin
- for(int pin=BCD1;pin<=T2;pin++){
- pinMode(pin, OUTPUT);
- }
- attachInterrupt(digitalPinToInterrupt(OPTO),taskOpto,RISING);
- // Inisialisasi shift register
- pinMode(T1, OUTPUT);
- pinMode(T2, OUTPUT);
- digitalWrite(T1,LOW);
- digitalWrite(T2,LOW);
- // Inisialisasi INPUT1 dan INPUT2 motor driver
- pinMode(MOTOR_INPUT1, OUTPUT);
- pinMode(MOTOR_INPUT2, OUTPUT);
- analogWrite(MOTOR_INPUT1, 0);
- digitalWrite(MOTOR_INPUT2, LOW);
- // Inisialisasi BUTTON1
- pinMode(BUTTON1, INPUT);
- digitalWrite(BUTTON1,HIGH);
- // inisialisasi variabel global
- tgate = tdisplay = millis();
- pulse = 0;
- pwm = 255;
- }
- // Menurunkan pwm secara step
- void taskButton() {
- pwm = pwm - (256/16);
- if (pwm < 0) pwm = 255;
- analogWrite(MOTOR_INPUT1, pwm);
- }
- // Menaikkan cacahan pulse apabila opto terdeteksi
- void taskOpto() {
- pulse++;
- }
- // Task dipanggil setiap Tgate
- // untuk menghitung Period
- void taskPeriod(long ms) {
- long tgate2 = ms;
- long tw = tgate2-tgate;
- // hitung period
- float period = float(tw)/NPulse;
- // tampilkan ke 7 segment
- writeDigit3(period);
- // untuk membandingkan, kirim ke serial
- // pwm tw pulse periodd
- Serial.print(pwm);
- Serial.print(" ");
- Serial.print(tw);
- Serial.print(" ");
- Serial.print(pulse);
- Serial.print(" ");
- Serial.println(period);
- // reset cacahan
- pulse = 0;
- tgate=millis();
- }
- // task menampilkan bacaan 7 segment
- void taskDisplay() {
- shiftDigit();
- }
- // loop utama
- void loop() {
- long ms = millis();
- if (optoIsFired()) {
- taskOpto();
- }
- else if (pulse >= NPulse) {
- noInterrupts();
- taskPeriod(ms);
- tgate = millis();
- interrupts();
- }
- else if (s1IsPressed()) {
- noInterrupts();
- taskButton();
- interrupts();
- }
- else if (ms >= tdisplay) {
- taskDisplay();
- tdisplay = tdisplay + PERIODE_DISPLAY;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement