Advertisement
sunu

Untitled

May 9th, 2025
366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 2.31 KB | Source Code | 0 0
  1. /*
  2.  * Phase-Angle Control untuk pemicuan Triac.
  3.  * Menggunakan interrupt.
  4.  * LAMA_PEMICUAN diperlukan 1 mS untuk memastikan,
  5.  * pemicuan terjadi dengan baik.
  6.  *
  7.  * Tidak ada fitur komunikasi serial.
  8.  *
  9.  * Tidak ada perlindungan untuk batas maksimal
  10.  * sudut pemicuan.
  11.  *
  12.  */
  13.  
  14.  
  15. #include <Arduino.h>
  16.  
  17. // Konstanta
  18. const float DEFAULT_FREQUENCY = 50.0;  // PLN frek dalam Hz (default: 50 Hz)
  19. const uint8_t DEFAULT_PHASE_ANGLE = 120;    // Sudut pemicuan dalam degree
  20. const uint16_t LAMA_PEMICUAN = 1000; // Lamanya sinyal pemicu
  21. /*
  22.  * Sudut minimal: 0
  23.  * Sudut maksimal: 150
  24.  */
  25.  
  26. // Pin definitions
  27. const int ZERO_CROSS_PIN = 2; // Pin ke ZCD
  28. const int TRIAC_CONTROL_PIN = 3; // Pin ke MOC3021
  29.  
  30. // Var untuk penghitungan pewaktuan
  31. volatile bool zeroCrossDetected = false;
  32. float frequency = DEFAULT_FREQUENCY;
  33. int phaseAngle = DEFAULT_PHASE_ANGLE;
  34. float halfCyclePeriodMs; // Half cycle period in milliseconds
  35.  
  36. float delayMs;
  37. uint16_t delayMS_int = 0;
  38.  
  39. void setup() {
  40.   pinMode(ZERO_CROSS_PIN, INPUT);
  41.   pinMode(TRIAC_CONTROL_PIN, OUTPUT);
  42.   digitalWrite(TRIAC_CONTROL_PIN, LOW);
  43.  
  44.   // Calculate half-cycle period (ms)
  45.   halfCyclePeriodMs = 1000.0 / (2 * frequency);
  46.  
  47.   // Calculate delay based on phase angle
  48.   delayMs = (phaseAngle / 180.0) * halfCyclePeriodMs;
  49.  
  50.   // Konversi dari float ke uint16_t
  51. //  delayMS_int= static_cast<int>(delayMs * 1000);
  52.   delayMS_int= static_cast<int>(delayMs * 1000);  
  53.  
  54.  
  55.   Serial.begin(9600);
  56.   Serial.println(" Phase-Angle Control (PAC) untuk Triac.");
  57.   Serial.print(" Nilai sudut picu dalam derajat: ");
  58.   Serial.println(DEFAULT_PHASE_ANGLE);
  59.   Serial.print(" Nilai delay dalam micro seconds: ");
  60.   Serial.println(delayMS_int);
  61.   Serial.println("");
  62.  
  63.   // Inisiasi bagian interrupt.
  64.   attachInterrupt(digitalPinToInterrupt(ZERO_CROSS_PIN), zeroCrossISR, RISING);
  65. }
  66.  
  67. void loop() {
  68.   if (zeroCrossDetected) {
  69.     zeroCrossDetected = false;
  70.  
  71.     // Waktu tunda berdasarkan nilai firing angle.
  72.     delayMicroseconds(delayMS_int); // Dihitung berdasarkan nilai sudut.
  73.  
  74.     // Bagian pemicuan Triac
  75.     digitalWrite(TRIAC_CONTROL_PIN, HIGH);
  76.     delayMicroseconds(LAMA_PEMICUAN);
  77.     // Waktu tunda pulsa pemicuan MOC3021, min 1000 uS
  78.     digitalWrite(TRIAC_CONTROL_PIN, LOW);
  79.   }
  80. }
  81.  
  82. // Rutin interrupt
  83. void zeroCrossISR() {
  84.   zeroCrossDetected = true;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement