// Константы для пинов
const int phaseAPin = A0; // Фаза A
const int phaseBPin = A1; // Фаза B
const int phaseCPin = A2; // Фаза C
const int ledPin = 13; // Светодиод
// Переменные для хранения значений напряжения
int phaseA, phaseB, phaseC;
// Порог для определения наличия фазы (примерно 2,5 В в 10‑битном АЦП)
const int voltageThreshold = 512;
// Порог для детекции пересечения нуля (около 0 В)
const int zeroCrossThreshold = 5;
// Переменные для измерения фазового сдвига
unsigned long zeroCrossA = 0, zeroCrossB = 0, zeroCrossC = 0;
unsigned long timeA = 0, timeB = 0, timeC = 0;
float phaseShiftAB = 0.0, phaseShiftBC = 0.0, phaseShiftCA = 0.0;
// Флаг для первого обнаружения пересечения нуля
bool firstZeroCross = true;
void setup() {
// Инициализация последовательного порта для отладки
Serial.begin(9600);
// Настройка пинов
pinMode(phaseAPin, INPUT);
pinMode(phaseBPin, INPUT);
pinMode(phaseCPin, INPUT);
pinMode(ledPin, OUTPUT);
// Выключаем светодиод на старте
digitalWrite(ledPin, LOW);
Serial.println("Система контроля чередования фаз с измерением фазового сдвига запущена");
Serial.println("Светодиод горит, если всё в норме");
}
void loop() {
// Считываем значения с аналоговых входов
phaseA = analogRead(phaseAPin);
phaseB = analogRead(phaseBPin);
phaseC = analogRead(phaseCPin);
// Детекция пересечения нуля для фазы A
if (abs(phaseA - 512) < zeroCrossThreshold && firstZeroCross) {
zeroCrossA = micros();
timeA = zeroCrossA;
firstZeroCross = false;
} else if (abs(phaseA - 512) < zeroCrossThreshold) {
unsigned long currentTime = micros();
phaseShiftAB = calculatePhaseShift(timeA, currentTime);
timeA = currentTime;
}
// Детекция пересечения нуля для фазы B
if (abs(phaseB - 512) < zeroCrossThreshold && firstZeroCross) {
zeroCrossB = micros();
timeB = zeroCrossB;
firstZeroCross = false;
} else if (abs(phaseB - 512) < zeroCrossThreshold) {
unsigned long currentTime = micros();
phaseShiftBC = calculatePhaseShift(timeB, currentTime);
timeB = currentTime;
}
// Детекция пересечения нуля для фазы C
if (abs(phaseC - 512) < zeroCrossThreshold && firstZeroCross) {
zeroCrossC = micros();
timeC = zeroCrossC;
firstZeroCross = false;
} else if (abs(phaseC - 512) < zeroCrossThreshold) {
unsigned long currentTime = micros();
phaseShiftCA = calculatePhaseShift(timeC, currentTime);
timeC = currentTime;
}
// Выводим значения в монитор порта для отладки
Serial.print("Фаза A: ");
Serial.print(phaseA);
Serial.print(" | Фаза B: ");
Serial.print(phaseB);
Serial.print(" | Фаза C: ");
Serial.println(phaseC);
// Выводим фазовые сдвиги
Serial.print("Фазовый сдвиг AB: ");
Serial.print(phaseShiftAB);
Serial.print("° | BC: ");
Serial.print(phaseShiftBC);
Serial.print("° | CA: ");
Serial.println(phaseShiftCA);
// Проверяем наличие всех трёх фаз
bool allPhasesPresent = (phaseA > voltageThreshold) &&
(phaseB > voltageThreshold) &&
(phaseC > voltageThreshold);
// Проверяем правильное чередование фаз с учётом фазового сдвига
bool correctPhaseSequence = checkPhaseSequenceWithShift(phaseShiftAB, phaseShiftBC, phaseShiftCA);
// Логика управления светодиодом
bool systemOK = allPhasesPresent && correctPhaseSequence;
if (systemOK) {
digitalWrite(ledPin, HIGH); // Всё в норме — светодиод горит
Serial.println("

Всё в норме: все фазы присутствуют, чередование правильное");
} else {
digitalWrite(ledPin, LOW); // Ошибка — светодиод не горит
if (!allPhasesPresent) {
Serial.println("

Ошибка: отсутствует одна или несколько фаз");
} else {
Serial.println("

Ошибка: неправильное чередование фаз");
}
}
delay(500); // Задержка 500 мс между измерениями
}