ماژول اپتوکوپلر تک حالته
A Optocoupler Module
جداساز امن و مطمئن سیگنالهای الکتریکی
⚡ اپتوکوپلر تکحالته: پل نوری برای جداسازی الکتریکی ایمن
ماژول اپتوکوپلر تکحالته یک راهحل ایدهآل برای ایزوله کردن سیگنالهای الکتریکی در سیستمهای قدرت و کنترل است. با استفاده از نور به عنوان واسطه انتقال، این ماژول جداسازی گالوانیکی کامل بین مدارهای ورودی و خروجی ایجاد میکند.
🛡️ مزایای کلیدی اپتوکوپلر
🔌 جداسازی الکتریکی کامل:
-
ایزولاسیون گالوانیکی: جداسازی کامل ورودی و خروجی
-
مقاومت عایقی: تا 5000V RMS
-
جلوگیری از نویز: حذف نویزهای زمین مشترک
-
محافظت در برابر اسپایک: جلوگیری از انتقال نوسانات ولتاژ
⚡ عملکرد قابل اعتماد:
-
سرعت پاسخ بالا: تا 100 کیلوهرتز
-
طول عمر طولانی: بدون تماس مکانیکی
-
پایداری حرارتی: عملکرد مطمئن در دمای -40°C تا +100°C
-
مصرف برق پایین: جریان LED معمولاً 5-20mA
📊 مشخصات فنی استاندارد
پارامترهای الکتریکی:
-
ولتاژ ایزولاسین: 2500Vrms تا 5000Vrms
-
ولتاژ ورودی LED: 1.2V – 1.7V (نقطه کار)
-
جریان ورودی: 5mA – 50mA (توصیه شده)
-
ولتاژ خروجی: تا 30V (بسته به نوع ترانزیستور)
-
جریان خروجی: 50mA – 100mA (پیوسته)
-
CTR (نسبت انتقال جریان): 20% – 600%
پارامترهای عملکردی:
انواع رایج اپتوکوپلر تکحالته:
-
PC817: پرکاربردترین، CTR: 80%-600%
-
4N25: عمومیپurpose، ولتاژ ایزولاسین 2500V
-
TLP521: سرعت متوسط، CTR بالا
-
SFH6106: ولتاژ ایزولاسین 5000V
-
MOC3021: با تریاک خروجی برای کنترل AC
🔧 ساختار و طراح داخلی
ساختمان اپتوکوپلر:
ساختار داخلی:
ورودی → [LED مادون قرمز] → [نور] → [فوتوترانزیستور] → خروجی
↓ ↓ ↓ ↓ ↓
سیگنال فرستنده محیط عایق گیرنده سیگتال
کنترل نوری (پلاستیک نوری ایزوله
یا هوای (فتوترانزیستور)
خشک)
پیکربندی پایههای DIP-4:
پیکربندی استاندارد 4 پایه:
┌───┐
1 │ ● │ 4 پایه 1: آند LED
2 │ │ 3 پایه 2: کاتد LED
└───┘ پایه 3: امیتر فوتوترانزیستور
پایه 4: کلکتور فوتوترانزیستور
💻 برنامهنویسی و راهاندازی
اتصال پایهها به آردوینو:
#define OPTO_INPUT_PIN 2
#define OPTO_OUTPUT_PIN 3
#define LED_ANODE_PIN 8
#define LED_CATHODE_PIN 9
#define TRANSISTOR_COLLECTOR_PIN 10
#define TRANSISTOR_EMITTER_PIN 11
void setupOptocoupler() {
Serial.begin(9600);
pinMode(OPTO_INPUT_PIN, OUTPUT);
pinMode(OPTO_OUTPUT_PIN, INPUT);
digitalWrite(OPTO_INPUT_PIN, LOW);
Serial.println("ماژول اپتوکوپلر راهاندازی شد");
Serial.println("=============================");
}
void testOptocoupler() {
digitalWrite(OPTO_INPUT_PIN, HIGH);
delay(10);
bool outputState = digitalRead(OPTO_OUTPUT_PIN);
Serial.print("ورودی HIGH - خروجی: ");
Serial.println(outputState ? "HIGH" : "LOW");
digitalWrite(OPTO_INPUT_PIN, LOW);
delay(10);
outputState = digitalRead(OPTO_OUTPUT_PIN);
Serial.print("ورودی LOW - خروجی: ");
Serial.println(outputState ? "HIGH" : "LOW");
}
کلاس مدیریت پیشرفته اپتوکوپلر:
class SingleChannelOptocoupler {
private:
int inputPin;
int outputPin;
unsigned long responseTime;
bool isInverting;
float ctr;
public:
SingleChannelOptocoupler(int inPin, int outPin, bool invert = false, float ctrValue = 100.0) {
inputPin = inPin;
outputPin = outPin;
isInverting = invert;
ctr = ctrValue;
responseTime = 10;
pinMode(inputPin, OUTPUT);
pinMode(outputPin, INPUT);
digitalWrite(inputPin, LOW);
}
void turnOn() {
digitalWrite(inputPin, HIGH);
if (responseTime > 0) {
delayMicroseconds(responseTime);
}
}
void turnOff() {
digitalWrite(inputPin, LOW);
if (responseTime > 0) {
delayMicroseconds(responseTime);
}
}
bool getOutputState() {
bool rawState = digitalRead(outputPin);
return isInverting ? !rawState : rawState;
}
bool isIsolated(bool expectedState) {
bool currentState = getOutputState();
bool inputState = digitalRead(inputPin);
bool shouldBeActive = (inputState == HIGH && !isInverting) ||
(inputState == LOW && isInverting);
return currentState == shouldBeActive;
}
float calculateCTR() {
float inputCurrent = measureInputCurrent();
float outputCurrent = measureOutputCurrent();
if (inputCurrent > 0) {
return (outputCurrent / inputCurrent) * 100.0;
}
return 0.0;
}
void setResponseTime(unsigned long timeUs) {
responseTime = timeUs;
Serial.print("زمان پاسخ تنظیم شد: ");
Serial.print(timeUs);
Serial.println(" µs");
}
void pulseTest(unsigned int pulseWidthUs, int count = 10) {
Serial.println("=== تست پالس ===");
for (int i = 0; i < count; i++) {
unsigned long startTime = micros();
turnOn();
bool onState = getOutputState();
delayMicroseconds(pulseWidthUs);
turnOff();
bool offState = getOutputState();
unsigned long endTime = micros();
unsigned long actualPulseWidth = endTime - startTime;
Serial.print("پالس ");
Serial.print(i + 1);
Serial.print(": عرض ");
Serial.print(actualPulseWidth);
Serial.print("µs | خروجی روشن: ");
Serial.print(onState);
Serial.print(" | خروجی خاموش: ");
Serial.println(offState);
delay(100);
}
}
void measureResponseTimes() {
Serial.println("=== اندازهگیری زمانهای پاسخ ===");
unsigned long turnOnStart = micros();
turnOn();
unsigned long turnOnTime = micros() - turnOnStart;
unsigned long turnOffStart = micros();
turnOff();
unsigned long turnOffTime = micros() - turnOffStart;
Serial.print("Ton: ");
Serial.print(turnOnTime);
Serial.print("µs | Toff: ");
Serial.print(turnOffTime);
Serial.println("µs");
}
bool healthCheck() {
bool test1 = isolationTest();
bool test2 = ctrTest();
bool test3 = responseTest();
Serial.println("=== بررسی سلامت اپتوکوپلر ===");
Serial.print("تست ایزولاسیون: ");
Serial.println(test1 ? "✅ PASS" : "❌ FAIL");
Serial.print("تست CTR: ");
Serial.println(test2 ? "✅ PASS" : "❌ FAIL");
Serial.print("تست پاسخ: ");
Serial.println(test3 ? "✅ PASS" : "❌ FAIL");
return test1 && test2 && test3;
}
};
⚙️ کاربردهای عملی
۱. ایزوله کردن سیگنالهای دیجیتال:
class DigitalIsolator {
private:
SingleChannelOptocoupler opto;
bool lastState;
public:
DigitalIsolator(int inPin, int outPin) : opto(inPin, outPin) {
lastState = false;
}
void transmit(bool state) {
if (state != lastState) {
if (state) {
opto.turnOn();
} else {
opto.turnOff();
}
lastState = state;
}
}
bool receive() {
return opto.getOutputState();
}
void sendPulse(unsigned int durationMs) {
opto.turnOn();
delay(durationMs);
opto.turnOff();
}
void sendSerialData(const String& data, int baudRate = 9600) {
int bitTime = 1000000 / baudRate;
for (int i = 0; i < data.length(); i++) {
char c = data.charAt(i);
opto.turnOff();
delayMicroseconds(bitTime);
for (int bit = 0; bit < 8; bit++) {
bool bitValue = (c >> bit) & 0x01;
if (bitValue) {
opto.turnOn();
} else {
opto.turnOff();
}
delayMicroseconds(bitTime);
}
opto.turnOn();
delayMicroseconds(bitTime * 2);
}
}
};
DigitalIsolator serialIsolator(2, 3);
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
String data = Serial.readString();
serialIsolator.sendSerialData(data);
}
}
۲. کنترل رله یا بارهای AC:
class ACLoadController {
private:
SingleChannelOptocoupler opto;
int triacPin;
bool zeroCrossingDetected;
public:
ACLoadController(int optoIn, int optoOut, int triac)
: opto(optoIn, optoOut), triacPin(triac) {
zeroCrossingDetected = false;
pinMode(triacPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(2), zeroCrossingISR, RISING);
}
static void zeroCrossingISR() {
}
void turnOnAC() {
waitForZeroCrossing();
digitalWrite(triacPin, HIGH);
opto.turnOn();
}
void turnOffAC() {
waitForZeroCrossing();
digitalWrite(triacPin, LOW);
opto.turnOff();
}
void dimAC(int angle) {
angle = constrain(angle, 0, 180);
waitForZeroCrossing();
int delayTime = map(angle, 0, 180, 8000, 0);
delayMicroseconds(delayTime);
digitalWrite(triacPin, HIGH);
opto.turnOn();
delayMicroseconds(100);
digitalWrite(triacPin, LOW);
opto.turnOff();
}
void waitForZeroCrossing() {
while (!zeroCrossingDetected) {
delayMicroseconds(100);
}
zeroCrossingDetected = false;
}
};
۳. خواندن سیگنالهای ولتاژ بالا:
class HighVoltageMonitor {
private:
SingleChannelOptocoupler opto;
float voltageDividerRatio;
float referenceVoltage;
public:
HighVoltageMonitor(int optoIn, int optoOut, float ratio, float refVoltage = 5.0)
: opto(optoIn, optoOut), voltageDividerRatio(ratio), referenceVoltage(refVoltage) {
}
bool isVoltagePresent(float thresholdVoltage) {
float scaledVoltage = thresholdVoltage / voltageDividerRatio;
return opto.getOutputState();
}
float estimateVoltage() {
unsigned long onTime = measureOnTime();
unsigned long period = measurePeriod();
if (period > 0) {
float dutyCycle = (float)onTime / period * 100.0;
return dutyCycle * voltageDividerRatio * referenceVoltage / 100.0;
}
return 0.0;
}
void monitorVoltage(float safeThreshold) {
static unsigned long lastAlert = 0;
float currentVoltage = estimateVoltage();
if (currentVoltage > safeThreshold) {
if (millis() - lastAlert > 5000) {
lastAlert = millis();
Serial.print("⚠️ ولتاژ بالا: ");
Serial.print(currentVoltage, 1);
Serial.println("V");
}
}
}
};
🔌 مدارهای کاربردی
مدار پایه برای PC817:
void setupPC817Circuit() {
Serial.println("مدار PC817 راهاندازی شد");
Serial.println("مقاومت سری LED: 220Ω برای 5V");
Serial.println("مقاومت بار کلکتور: 10KΩ");
Serial.println("پیکربندی: خروجی فعال LOW");
}
float calculateLEDResistor(float supplyVoltage, float ledVoltage, float ledCurrent) {
return (supplyVoltage - ledVoltage) / ledCurrent;
}
float calculateCollectorResistor(float supplyVoltage, float collectorCurrent) {
return supplyVoltage / collectorCurrent;
}
مدار درایور موتور DC ایزوله:
class IsolatedMotorDriver {
private:
SingleChannelOptocoupler opto1;
SingleChannelOptocoupler opto2;
int motorPin1, motorPin2;
public:
IsolatedMotorDriver(int opto1In, int opto1Out, int opto2In, int opto2Out, int pin1, int pin2)
: opto1(opto1In, opto1Out), opto2(opto2In, opto2Out) {
motorPin1 = pin1;
motorPin2 = pin2;
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
}
void forward() {
opto1.turnOn();
opto2.turnOff();
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
}
void reverse() {
opto1.turnOff();
opto2.turnOn();
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
}
void stop() {
opto1.turnOff();
opto2.turnOff();
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
}
void brake() {
opto1.turnOn();
opto2.turnOn();
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
delay(100);
stop();
}
};
⚡ تست و کالیبراسیون
روال تست کامل:
void comprehensiveOptocouplerTest() {
SingleChannelOptocoupler opto(2, 3);
Serial.println("=== تست جامع اپتوکوپلر ===");
Serial.println("1. تست ایزولاسیون:");
testIsolation(opto);
Serial.println("n2. تست نسبت انتقال جریان:");
testCTR(opto);
Serial.println("n3. تست زمانهای پاسخ:");
testResponseTimes(opto);
Serial.println("n4. تست فرکانس کاری:");
testFrequencyResponse(opto);
Serial.println("n5. تست پایداری دمایی:");
testTemperatureStability(opto);
Serial.println("n✅ تست کامل شد");
}
void testIsolation(SingleChannelOptocoupler& opto) {
bool isolationGood = true;
for (int i = 0; i < 10; i++) {
analogWrite(9, random(0, 255));
bool outputState = opto.getOutputState();
bool inputState = digitalRead(opto.inputPin);
if (inputState == LOW && outputState == HIGH) {
isolationGood = false;
Serial.println("❌ نشتی تشخیص داده شد");
break;
}
}
if (isolationGood) {
Serial.println("✅ ایزولاسیون صحیح است");
}
}
کالیبراسیون CTR:
void calibrateCTR(SingleChannelOptocoupler& opto) {
Serial.println("کالیبراسیون CTR:");
float inputCurrents[] = {5.0, 10.0, 15.0, 20.0};
float ctrValues[4];
for (int i = 0; i < 4; i++) {
float pwmValue = (inputCurrents[i] / 20.0) * 255.0;
analogWrite(opto.inputPin, pwmValue);
delay(100);
float outputCurrent = measureOutputCurrent();
ctrValues[i] = (outputCurrent / inputCurrents[i]) * 100.0;
Serial.print("Iin=");
Serial.print(inputCurrents[i]);
Serial.print("mA, CTR=");
Serial.print(ctrValues[i], 1);
Serial.println("%");
}
float avgCTR = 0.0;
for (int i = 0; i < 4; i++) {
avgCTR += ctrValues[i];
}
avgCTR /= 4.0;
Serial.print("CTR متوسط: ");
Serial.print(avgCTR, 1);
Serial.println("%");
digitalWrite(opto.inputPin, LOW);
}
🛡️ ملاحظات ایمنی و حفاظتی
محدودیتهای کاری:
-
حداکثر ولتاژ ورودی: بسته به نوع، معمولاً 1.2V-1.7V برای LED
-
حداکثر جریان ورودی: 50mA-100mA (به دیتاشیت مراجعه شود)
-
حداکثر ولتاژ خروجی: 30V-80V
-
حداکثر توان تلفاتی: 100mW-250mW
-
دمای ذخیرهسازی: -55°C تا +125°C
نکات ایمنی مهم:
void safetyGuidelines() {
Serial.println("=== دستورالعملهای ایمنی اپتوکوپلر ===");
Serial.println("1. همیشه از مقاومت سری برای LED استفاده کنید");
Serial.println("2. از عبور جریان بیش از حد مجاز خودداری کنید");
Serial.println("3. اطمینان از قطبیت صحیح اتصالات");
Serial.println("4. استفاده از هیتسینک در جریانهای بالا");
Serial.println("5. تست ایزولاسیون قبل از استفاده");
Serial.println("6. رعایت فاصلههای عایقی در PCB");
}
محافظت در برابر شرایط خاص:
class ProtectedOptocoupler {
private:
SingleChannelOptocoupler opto;
int currentSensePin;
float maxCurrent;
public:
ProtectedOptocoupler(int inPin, int outPin, int sensePin, float maxCurrentmA)
: opto(inPin, outPin), maxCurrent(maxCurrentmA) {
currentSensePin = sensePin;
pinMode(currentSensePin, INPUT);
}
bool safeTurnOn() {
float current = measureCurrent();
if (current > maxCurrent) {
Serial.println("⚠️ جریان بیش از حد - عملیات لغو شد");
return false;
}
opto.turnOn();
delayMicroseconds(10);
if (!opto.getOutputState()) {
Serial.println("⚠️ اپتوکوپلر روشن نشد");
return false;
}
return true;
}
float measureCurrent() {
int sensorValue = analogRead(currentSensePin);
float voltage = sensorValue * (5.0 / 1023.0);
return (voltage - 2.5) / 0.185;
}
void emergencyShutdown() {
opto.turnOff();
Serial.println("🛑 خاموشی اضطراری فعال شد");
}
};
🔍 عیبیابی و تشخیص خطا
مشکلات رایج و راهحل:
برنامه تشخیص خودکار:
void autoDiagnostic() {
Serial.println("=== تشخیص خودکار خطا ===");
testLED();
testPhototransistor();
testCTRBasic();
testBasicIsolation();
Serial.println("تشخیص کامل شد");
}
void testLED() {
Serial.print("تست LED: ");
digitalWrite(OPTO_INPUT_PIN, HIGH);
delay(10);
bool output = digitalRead(OPTO_OUTPUT_PIN);
if (output) {
Serial.println("✅ سالم");
} else {
Serial.println("❌ مشکوک - CTR ممکن است پایین باشد");
}
digitalWrite(OPTO_INPUT_PIN, LOW);
}
🏭 کاربردهای صنعتی
۱. سیستمهای PLC:
class PLCInputIsolator {
private:
SingleChannelOptocoupler opto;
int inputStatus;
public:
PLCInputIsolator(int inPin, int outPin) : opto(inPin, outPin) {
inputStatus = 0;
}
int readIsolatedInput() {
bool state = opto.getOutputState();
inputStatus = state ? 1 : 0;
return inputStatus;
}
void monitorInput(unsigned long debounceTime = 10) {
static unsigned long lastChange = 0;
static bool lastState = false;
bool currentState = opto.getOutputState();
if (currentState != lastState) {
if (millis() - lastChange > debounceTime) {
lastChange = millis();
lastState = currentState;
Serial.print("ورودی تغییر کرد: ");
Serial.println(currentState ? "ACTIVE" : "INACTIVE");
logEvent(currentState);
}
}
}
};
۲. اینورترها و درایوهای موتور:
class InverterGateDriver {
private:
SingleChannelOptocoupler highSideOpto;
SingleChannelOptocoupler lowSideOpto;
float deadTime;
public:
InverterGateDriver(int highIn, int highOut, int lowIn, int lowOut, float deadTimeUs = 2.0)
: highSideOpto(highIn, highOut), lowSideOpto(lowIn, lowOut), deadTime(deadTimeUs) {
}
void drivePWM(float dutyCycle, float frequency) {
unsigned long period = 1000000 / frequency;
unsigned long onTime = period * dutyCycle / 100.0;
unsigned long offTime = period - onTime - (deadTime * 2);
highSideOpto.turnOn();
delayMicroseconds(onTime);
highSideOpto.turnOff();
delayMicroseconds(deadTime);
lowSideOpto.turnOn();
delayMicroseconds(offTime);
lowSideOpto.turnOff();
delayMicroseconds(deadTime);
}
void enableBoth() {
highSideOpto.turnOn();
lowSideOpto.turnOn();
}
void disableBoth() {
highSideOpto.turnOff();
lowSideOpto.turnOff();
}
};
۳. سیستمهای پزشکی:
class MedicalIsolation {
private:
SingleChannelOptocoupler opto;
bool patientConnected;
public:
MedicalIsolation(int inPin, int outPin) : opto(inPin, outPin) {
patientConnected = false;
}
bool isPatientConnected() {
return patientConnected;
}
void checkIsolationIntegrity() {
float leakageCurrent = measureLeakageCurrent();
if (leakageCurrent > 10.0) {
Serial.println("⚠️ جریان نشتی بیش از حد مجاز پزشکی");
triggerSafetyShutdown();
}
}
float measureLeakageCurrent() {
return 0.0;
}
void triggerSafetyShutdown() {
opto.turnOff();
Serial.println("🚨 سیستم ایزولاسیون پزشکی خاموش شد");
}
};
📦 مشخصات ماژولهای آماده
ماژول اپتوکوپلر تککاناله رایج:
-
ابعاد: 20mm × 15mm × 10mm
-
پایهها: هدر 4 پین 2.54mm
-
اپتوکوپلر: PC817 یا معادل
-
مقاومتهای نصب شده:
-
مقاومت LED: 220Ω
-
مقاومت پایه: 10KΩ
-
خازن فیلتر: 100nF (در برخی مدلها)
-
ولتاژ کاری: 3.3V – 5V
-
جریان خروجی: تا 50mA
پکیج استاندارد:
-
1 عدد ماژول اپتوکوپلر
-
4 عدد پایه هدر
-
2 عدد مقاومت اضافی
-
راهنمای اتصال سریع
-
دیاگرام نمونه مدار
🌟 نتیجهگیری
ماژول اپتوکوپلر تکحالته یک ابزار ضروری برای هر پروژهای است که نیاز به جداسازی الکتریکی بین بخشهای مختلف مدار دارد. با ترکیب سادگی، قابلیت اطمینان بالا و هزینه کم، این ماژول در طیف گستردهای از کاربردها از الکترونیک مصرفی تا سیستمهای صنعتی و پزشکی استفاده میشود.
ایمنی در ایزولاسیون، اطمینان در عملکرد
نقد و بررسیها
پاکسازی فیلترهنوز بررسیای ثبت نشده است.