Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | None | 0 0
  1. // Kode 3.3 : Pengukuran Frekuensi Teknik Pooling
  2.  
  3. #define PERIODE_DISPLAY 5
  4. #define PERIODE_GATE 1000
  5.  
  6. // unit menghitung frekuensi dalam RPS (1000 ms)
  7. #define F_UNIT 1000L
  8.  
  9. // Pemetaan Port arduino
  10. #define BUTTON1 A2
  11. #define OPTO 2
  12.  
  13. // Pemetaan Port untuk memutar motor seperti praktikum sebelumnya
  14. #define BCD1 8
  15. #define T1 12
  16. #define T2 13
  17. #define AIN A0
  18. #define ASENSE A5
  19. #define MOTOR_INPUT1 3
  20. #define MOTOR_INPUT2 A1
  21.  
  22. // fungsi-fungsi dari modul sebelumnya
  23. boolean s1IsPressed() {
  24.   static boolean b1_old = 0;
  25.   boolean b1 = digitalRead (BUTTON1);
  26.   boolean s1 = (b1 && !b1_old);
  27.   b1_old = b1;
  28.   return s1;
  29. }
  30.  
  31. void writeDigit(int bcd){
  32.   for (int i=0; i<4; i++){
  33.     digitalWrite(BCD1 + i, bcd & 0x01);
  34.     bcd = bcd >> 1;
  35.   }
  36. }
  37.  
  38. int digits[3];
  39. void writeDigit3(int data) {
  40.   digits[0] = data%10;
  41.   data = data/10;
  42.   digits[1] = data % 10;
  43.   data = data / 10;
  44.   digits[2] = data %10;
  45. }
  46.  
  47. int index = 0;
  48. void shiftDigit() {
  49.   writeDigit(digits[index]);
  50.   digitalWrite(T1, index & 0x02);
  51.   digitalWrite(T2, index & 0x01);
  52.   index = (index + 1) % 3;
  53. }
  54.  
  55. // fungsi mengecek sinyal opto coupler
  56. boolean optoIsFired() {
  57.   static boolean b1_old = 1;
  58.   boolean b1 = digitalRead(OPTO);
  59.   boolean s1 = (b1 && !b1_old);
  60.   b1_old = b1;
  61.   return s1;
  62. }
  63.  
  64. // Inisialisasi variabel global
  65. long tdisplay, tgate;
  66. long pulse;
  67. int pwm;
  68.  
  69. void setup() {
  70.   Serial.begin(115200);
  71.   Serial.println("Pengukuran Frekuensi teknik pooling");
  72.   // inisialisasi mode pin
  73.     for(int pin=BCD1;pin<=T2;pin++){
  74.       pinMode(pin, OUTPUT);
  75.     }
  76.  
  77.   // Inisialisasi shift register
  78.   pinMode(T1, OUTPUT);
  79.   pinMode(T2, OUTPUT);
  80.   digitalWrite(T1,LOW);
  81.   digitalWrite(T2,LOW);
  82.  
  83.   // Inisialisasi INPUT1 dan INPUT2 motor driver
  84.   pinMode(MOTOR_INPUT1, OUTPUT);
  85.   pinMode(MOTOR_INPUT2, OUTPUT);
  86.   analogWrite(MOTOR_INPUT1, 0);
  87.   digitalWrite(MOTOR_INPUT2, LOW);
  88.  
  89.   // Inisialisasi Button1
  90.   pinMode(BUTTON1,INPUT);
  91.   digitalWrite(BUTTON1, HIGH);
  92.  
  93.   // inisialisasi variabel global
  94.   tgate = tdisplay = millis();
  95.   pulse = 0;
  96.   pwm = 255;
  97. }
  98.  
  99. // TaskButton(), bila S1 ditekan pwm turun secara step
  100. void taskButton() {
  101.   pwm = pwm - (256/16);
  102.   if (pwm < 0) pwm = 255;
  103.   analogWrite(MOTOR_INPUT1, pwm);
  104. }
  105.  
  106. // TaskOpto(), bila opto terdeteksi, cacah pulse
  107. void taskOpto() {
  108.   pulse++;
  109. }
  110.  
  111. // TaskFrequency(), memanggil setiap Tgate untuk menghitung frekuensi
  112. void taskFrequency(long ms) {
  113.   // hitung selang waktu tw, yang ms selalu sama dengan tgate, karena bisa terlambat, sehingga perlu dihitung lagi
  114.   long tw = PERIODE_GATE + (ms - tgate);
  115.  
  116.   // hitung frekuensi
  117.   int freq = pulse * F_UNIT / tw ; // lihat persamaan (3.1)
  118.  
  119.   // tampilkan ke 7 segment
  120.   writeDigit3(freq);
  121.  
  122.   // untuk membandingkan, kirim ke serial
  123.   // pwm tw pulse freq
  124.   Serial.print(pwm);
  125.   Serial.print(" ");
  126.   Serial.print(tw);
  127.   Serial.print(" ");
  128.   Serial.print(pulse);
  129.   Serial.print(" ");
  130.   Serial.println(freq);
  131.  
  132.   // reset cacahan
  133.   pulse = 0;
  134. }
  135.  
  136. // task menampilkan bacaan 7 segment
  137. void taskDisplay() {
  138.  shiftDigit();
  139. }
  140.  
  141. // loop utama
  142. void loop() {
  143.   long ms = millis();
  144.   if (optoIsFired()) {
  145.     taskOpto();
  146.   }
  147.   else if (ms >= tgate) {
  148.     taskFrequency(ms);
  149.     tgate = tgate + PERIODE_GATE;
  150.   }
  151.   else if (s1IsPressed()) {
  152.     taskButton();
  153.   }
  154.   else if (ms >= tdisplay) {
  155.     taskDisplay();
  156.     tdisplay = tdisplay + PERIODE_DISPLAY;
  157.   }
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement