sunu icon

Untitled

sunu | PRO | 05/09/25 12:29:52 PM UTC | 0 ⭐ | 11245 👁️ | Never ⏰ | []
Arduino |

2.31 KB

|

Source Code

|

0 👍

/

0 👎

/*
 * Phase-Angle Control untuk pemicuan Triac. 
 * Menggunakan interrupt.
 * LAMA_PEMICUAN diperlukan 1 mS untuk memastikan,
 * pemicuan terjadi dengan baik.
 * 
 * Tidak ada fitur komunikasi serial.
 * 
 * Tidak ada perlindungan untuk batas maksimal
 * sudut pemicuan.
 * 
 */
 
 
#include <Arduino.h>
 
// Konstanta
const float DEFAULT_FREQUENCY = 50.0;  // PLN frek dalam Hz (default: 50 Hz)
const uint8_t DEFAULT_PHASE_ANGLE = 120;    // Sudut pemicuan dalam degree
const uint16_t LAMA_PEMICUAN = 1000; // Lamanya sinyal pemicu
/*
 * Sudut minimal: 0
 * Sudut maksimal: 150
 */
 
// Pin definitions
const int ZERO_CROSS_PIN = 2; // Pin ke ZCD
const int TRIAC_CONTROL_PIN = 3; // Pin ke MOC3021
 
// Var untuk penghitungan pewaktuan
volatile bool zeroCrossDetected = false;
float frequency = DEFAULT_FREQUENCY;
int phaseAngle = DEFAULT_PHASE_ANGLE;
float halfCyclePeriodMs; // Half cycle period in milliseconds
 
float delayMs;
uint16_t delayMS_int = 0;
 
void setup() {
  pinMode(ZERO_CROSS_PIN, INPUT);
  pinMode(TRIAC_CONTROL_PIN, OUTPUT);
  digitalWrite(TRIAC_CONTROL_PIN, LOW);
 
  // Calculate half-cycle period (ms)
  halfCyclePeriodMs = 1000.0 / (2 * frequency);
 
  // Calculate delay based on phase angle
  delayMs = (phaseAngle / 180.0) * halfCyclePeriodMs;
 
  // Konversi dari float ke uint16_t
//  delayMS_int= static_cast<int>(delayMs * 1000);
  delayMS_int= static_cast<int>(delayMs * 1000);  
 
 
  Serial.begin(9600);
  Serial.println(" Phase-Angle Control (PAC) untuk Triac.");
  Serial.print(" Nilai sudut picu dalam derajat: ");
  Serial.println(DEFAULT_PHASE_ANGLE);
  Serial.print(" Nilai delay dalam micro seconds: ");
  Serial.println(delayMS_int);
  Serial.println("");
 
  // Inisiasi bagian interrupt.
  attachInterrupt(digitalPinToInterrupt(ZERO_CROSS_PIN), zeroCrossISR, RISING);
}
 
void loop() {
  if (zeroCrossDetected) {
    zeroCrossDetected = false;
 
    // Waktu tunda berdasarkan nilai firing angle.
    delayMicroseconds(delayMS_int); // Dihitung berdasarkan nilai sudut.
 
    // Bagian pemicuan Triac
    digitalWrite(TRIAC_CONTROL_PIN, HIGH);
    delayMicroseconds(LAMA_PEMICUAN);
    // Waktu tunda pulsa pemicuan MOC3021, min 1000 uS
    digitalWrite(TRIAC_CONTROL_PIN, LOW);
  }
}
 
// Rutin interrupt
void zeroCrossISR() {
  zeroCrossDetected = true;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎