Открыть симистор на пике напряжения

fid
Offline
Зарегистрирован: 20.12.2014

Решил сделать контроллер для точечной сварки. Вроде для трансформатора надо открыть симистор на пике напряжения. Мой код при симуляции на протеусе не всегда правильно отрабатывает. Насколько правильный мой код? или в этом случае другой подход нужен. 

#include <avr/io.h>
#include <avr/interrupt.h>
#define triak 13
#define  button  11

volatile byte count_Imp = 5; // количество импульсов
volatile bool button_f = 0; // флаг нажатия кнопки
double time_but = 0; // время нажатия

// таймер 1 совпадение
ISR(TIMER1_COMPA_vect) {
  
  if (count_Imp < 5) {
    if (button_f)
      digitalWrite(triak, 1);
  }
  else{
    button_f = 0;
    digitalWrite(triak, 0);
  }
  count_Imp++;
}
// при начале полупериода обнуляем таймер 1
void sin_imp(){
   if (button_f){
  TCNT1 = 0x00; // обнуление таймера 1 
  }
}

void setup()
{
  pinMode(triak, OUTPUT);
  pinMode(button, INPUT);
  // инициализация Timer1
  cli(); // отключить глобальные прерывания
  TCCR1A = 0; // установить регистры в 0
  TCCR1B = 0;
  TCNT1 = 0x00;
  //OCR1A = 15624; // установка регистра совпадения 1 сек
  OCR1A = 79;// установка регистра совпадения 5 mсек
  TCCR1B |= (1 << WGM12); // включение в CTC режим

  // Установка битов CS10 и CS12 на коэффициент деления 1024
  TCCR1B |= (1 << CS10);
  TCCR1B |= (1 << CS12);

  TIMSK1 |= (1 << OCIE1A);  // включение прерываний по совпадению
  
  sei(); // включить глобальные прерывания 
  attachInterrupt(0, sin_imp, RISING); 
}
void loop() {
  if (digitalRead(button) == 0) {
    if ((millis() - time_but) > 300){
      time_but = millis();
      count_Imp = 0;
      button_f = 1;      
    }
  }  
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Точно на пике, вы ничего не перепутали, трансформатор же стартует в режиме КЗ выходной обмотки