Добрый день. Есть диммер переменного тока на тини13, для плавного запуска торцовочной пилы. На данный момент плата диммера и блок питания подключены после силовой кнопки торцовки. То есть при нажатии кнопки плата включается и запускает пилу, при отжатии плата полностью обесточивается. Подумал что не совсем правильно постоянно вкл/откл плату управления и хочу блок питания включить до силовой кнопки и пока кабель пилы включена в розетку плата с тини13 всегда включена. Нажимая силовую кнопку подаем питание только на силовую часть, но при этом нужно как то сбрасывать duty(коэф заполнения, 0-255) при отжатой силовой кнопке, если этого не делать при втором нажатии duty будет 255(симистор открыт полностью) и на мотор сразу подается 230В.
Сделал так, переменную my_tmr сравниваю с millis и если разность более 10мсек(полупериод синусоиды 50Гц), я поставил 15мсек, то duty сбрасываем в ноль иначе плавно увеличиваем duty до 255.
Работает ПОЧТИ как надо. Если точнее после подачи напряжения на силовую часть плавно включается какое то время работает, сбрасывается в ноль, опять плавно включается и так по кругу. Все это дело происходит с рандомной частотой. Не пойму в чем проблема.
P.S. Тесты на лампе накаливания. При отсутствии силового напряжения(230В) на входе детекции нуля +5В постоянно, по схеме это видно. Класс таймера брал с примеров GyverDimmer. Отлаживаю на Arduino Nano, на самом плавном пуске стоит Tiny13.
Сделал так, переменную my_tmr сравниваю с millis и если разность более 10мсек(полупериод синусоиды 50Гц), я поставил 15мсек, то duty сбрасываем в ноль иначе плавно увеличиваем duty до 255.
Работает ПОЧТИ как надо. Если точнее после подачи напряжения на силовую часть плавно включается какое то время работает, сбрасывается в ноль, опять плавно включается и так по кругу. Все это дело происходит с рандомной частотой. Не пойму в чем проблема.
P.S. Тесты на лампе накаливания. При отсутствии силового напряжения(230В) на входе детекции нуля +5В постоянно, по схеме это видно. Класс таймера брал с примеров GyverDimmer. Отлаживаю на Arduino Nano, на самом плавном пуске стоит Tiny13.
C++:
class TimerUs {
public:
bool ready() {
if (state && micros() - tmr >= prd) {
tmr = micros();
return true;
}
return false;
}
void stop() {
state = false;
}
void restart() {
tmr = micros();
state = true;
}
void setPeriod(uint32_t period) {
restart();
prd = period;
if (prd == 0) prd++;
}
private:
bool state = 0;
uint32_t tmr = 0, prd = 0;
};
TimerUs timer;
// -------- НАСТРОЙКИ ---------
#define FB_pin 2
#define Dimmer_pin 13
// ------- БИБЛИОТЕКИ -------
#include <GyverDimmer.h>
Dimmer<Dimmer_pin> dim; // указать пин диммера
// ------- ПЕРЕМЕННЫЕ -------
volatile uint8_t duty = 0; // Начальное значение мощности
uint32_t my_tmr = 0;
// --------- SETUP ----------
void setup() {
Serial.begin(9600);
//Инициализация прерываний
attachInterrupt(0, myInt, RISING); //если использ. прерыв. в стиле ардуино
}
void myInt() {
// вызывать в прерывании детектора нуля
// если tickZero() - true - нужно перезапустить таймер с периодом getPeriod()
if (dim.tickZero()) timer.setPeriod(dim.getPeriod()); //
else timer.restart();
my_tmr = millis();
}
//-----------Основной цикл------------
void loop() {
if (timer.ready()) { // если таймер готов(отсчитало нужное время)
dim.tickTimer(); // вызвать tickTimer(подать сигнал на пин диммера)
timer.stop(); // остановить таймер
}
if(millis() - my_tmr >= 15) duty = 0;
else softStart();
dim.write(duty);
debug();
}
//------------------ФУНКЦИИ-----------------
void softStart() {
static uint32_t tmr;
if (millis() - tmr >= 20) {
tmr = millis();
if(duty < 255) duty += 1;
}
}
void debug() {
static uint32_t tmr;
if (millis() - tmr >= 50) {
tmr = millis();
Serial.print("Коэф. заполнения - ");
Serial.print(duty);
Serial.println(". ");
}
}
Вложения
-
71.1 KB Просмотры: 8
Изменено: