Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. // Kode 3.4 : Pengukuran Periode dengan Interupsi
  2.  
  3. #define PERIODE_DISPLAY 5
  4. #define PERIODE_GATE 100
  5.  
  6. #define NPulse 10
  7.  
  8. // Pemetaan Port
  9. #define BUTTON1 A2
  10. #define OPTO 2
  11. #define BCD1 8
  12. #define T1 12
  13. #define T2 13
  14. #define MOTOR_INPUT1 3
  15. #define MOTOR_INPUT2 A1
  16.  
  17. // fungsi-fungsi dari modul sebelumnya
  18. boolean s1IsPressed() {
  19.   static boolean b1_old = 0;
  20.   boolean b1 = digitalRead (BUTTON1);
  21.   boolean s1 = (b1 && !b1_old);
  22.   b1_old = b1;
  23.   return s1;
  24. }
  25.  
  26. void writeDigit(int bcd){
  27.   for (int i=0; i<4; i++){
  28.     digitalWrite(BCD1 + i, bcd & 0x01);
  29.     bcd = bcd >> 1;
  30.   }
  31. }
  32.  
  33. int digits[3];
  34. void writeDigit3(int data) {
  35.   digits[0] = data%10;
  36.   data = data/10;
  37.   digits[1] = data % 10;
  38.   data = data / 10;
  39.   digits[2] = data %10;
  40. }
  41.  
  42. int index = 0;
  43. void shiftDigit() {
  44.   writeDigit(digits[index]);
  45.   digitalWrite(T1, index & 0x02);
  46.   digitalWrite(T2, index & 0x01);
  47.   index = (index + 1) % 3;
  48. }
  49.  
  50. // memeriksa ada tidaknya pulsa pada optocoupler
  51. boolean optoIsFired() {
  52.   static boolean b1_old = 1;
  53.   boolean b1 = digitalRead(OPTO);
  54.   boolean s1 = (b1 && !b1_old);
  55.   b1_old = b1;
  56.   return s1;
  57. }
  58. //variabel global
  59. long tdisplay, tgate;
  60. volatile long pulse;
  61. int pwm;
  62.  
  63. void setup() {
  64.   Serial.begin(115200);
  65.   Serial.println("Pengukuran Periode dengan Interupsi");
  66.   // inisialisasi mode pin
  67.     for(int pin=BCD1;pin<=T2;pin++){
  68.       pinMode(pin, OUTPUT);
  69.     }
  70.   attachInterrupt(digitalPinToInterrupt(OPTO),taskOpto,RISING);
  71.    
  72.   // Inisialisasi shift register
  73.   pinMode(T1, OUTPUT);
  74.   pinMode(T2, OUTPUT);
  75.   digitalWrite(T1,LOW);
  76.   digitalWrite(T2,LOW);
  77.  
  78.   // Inisialisasi INPUT1 dan INPUT2 motor driver
  79.   pinMode(MOTOR_INPUT1, OUTPUT);
  80.   pinMode(MOTOR_INPUT2, OUTPUT);
  81.   analogWrite(MOTOR_INPUT1, 0);
  82.   digitalWrite(MOTOR_INPUT2, LOW);
  83.  
  84.   // Inisialisasi BUTTON1
  85.   pinMode(BUTTON1, INPUT);
  86.   digitalWrite(BUTTON1,HIGH);
  87.  
  88.   // inisialisasi variabel global
  89.   tgate = tdisplay = millis();
  90.   pulse = 0;
  91.   pwm = 255;
  92. }
  93.  
  94. // Menurunkan pwm secara step
  95. void taskButton() {
  96.   pwm = pwm - (256/16);
  97.   if (pwm < 0) pwm = 255;
  98.   analogWrite(MOTOR_INPUT1, pwm);
  99. }
  100.  
  101. // Menaikkan cacahan pulse apabila opto terdeteksi
  102. void taskOpto() {
  103.   pulse++;
  104. }
  105.  
  106. // Task dipanggil setiap Tgate
  107. // untuk menghitung Period
  108. void taskPeriod(long ms) {
  109.  
  110.   long tgate2 = ms;
  111.   long tw = tgate2-tgate;
  112.  
  113.   // hitung period
  114.   float period = float(tw)/NPulse;
  115.  
  116.   // tampilkan ke 7 segment
  117.   writeDigit3(period);
  118.  
  119.   // untuk membandingkan, kirim ke serial
  120.   // pwm tw pulse periodd
  121.   Serial.print(pwm);
  122.   Serial.print(" ");
  123.   Serial.print(tw);
  124.   Serial.print(" ");
  125.   Serial.print(pulse);
  126.   Serial.print(" ");
  127.   Serial.println(period);
  128.  
  129.   // reset cacahan
  130.   pulse = 0;
  131.   tgate=millis();
  132. }
  133.  
  134. // task menampilkan bacaan 7 segment
  135. void taskDisplay() {
  136.   shiftDigit();
  137. }
  138.  
  139. // loop utama
  140. void loop() {
  141.   long ms = millis();
  142.   if (optoIsFired()) {
  143.     taskOpto();
  144.   }
  145.   else if (pulse >= NPulse) {
  146.     noInterrupts();
  147.     taskPeriod(ms);
  148.     tgate = millis();
  149.     interrupts();
  150.   }
  151.   else if (s1IsPressed()) {
  152.     noInterrupts();
  153.     taskButton();
  154.     interrupts();
  155.   }
  156.   else if (ms >= tdisplay) {
  157.     taskDisplay();
  158.     tdisplay = tdisplay + PERIODE_DISPLAY;
  159.   }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement