Открыть симистор на пике напряжения
- Войдите на сайт для отправки комментариев
Сб, 29/02/2020 - 10:58
Решил сделать контроллер для точечной сварки. Вроде для трансформатора надо открыть симистор на пике напряжения. Мой код при симуляции на протеусе не всегда правильно отрабатывает. Насколько правильный мой код? или в этом случае другой подход нужен.
#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;
}
}
}
Точно на пике, вы ничего не перепутали, трансформатор же стартует в режиме КЗ выходной обмотки