диммер на 220в без таймеров

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброе время суток!

Делаю на базе ардуино контроллер для управления освещением. Один из источников освещения - обычная люстра с лампами 220в, соответственно распаял схему диммера (http://mp3car.ru/blog/arduino/2.html) и залил скечт. Все работает, но есть нюанс. Программа использует Timer1, который в свою очередь использует пины 9 и 10 (PWM) для реализации, а они у меня заняты управлением светодиодными лентами и светильниками.

Пробую реализовать тоже самое без таймеров, на счетчике micros, но пока не получается.

Ниже код. В нем закоментированные строки с кодом про таймер, если их раскомментировать то все работает, но отключабтся пины 9 и 10.

 



void setup() 

Dimmer1=190; attachInterrupt(1, detect_up, LOW); // настроить срабатывание прерывания на pin 3 на низкий уровень
//StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
//StopTimer1(); //остановить таймер }

//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{

tic++; //счетчик
if(Dimmer1 < tic )
digitalWrite(4, HIGH);
}

void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic=0; //обнулить счетчик
timer=true;
//ResumeTimer1(); //запустить таймер
attachInterrupt(1, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}

void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
//StopTimer1(); //остановить таймер
timer=false;
digitalWrite(4, LOW);
tic=0; //обнулить счетчик
attachInterrupt(1, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
//*************************************************************************

void loop()
{
if (timer==true){
currentMicros = micros();
if(currentMicros - previousMicros > 40) {
// сохраняем время последнего переключения
previousMicros = currentMicros;
halfcycle();
//timer=false;
}
}
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

gonzales, тут дело не в пинах 9 и 10, таймер в коде диммера их не использует. Видимо сам таймер1 у вас занят в коде  управления лентами. Городить на микросе -и не думайте. Шим делают только на таймере. Поэтому либо диммер, либо светодиодные ленты вам нужно перевести на другой таймер. И кстати вставляете код в сообщения по правилам, принятым на нашем форуме http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

gonzales
Offline
Зарегистрирован: 13.07.2015

это про таймеры

http://arduino.ru/Tutorial/Arduino_Interrupts_part2

dimax пишет:
Городить на микросе -и не думайте. Шим делают только на таймере. Поэтому либо диммер, либо светодиодные ленты вам нужно перевести на другой таймер. 

Вот эту фразу не понял. Но в принципе проблема решилась

//********************обработчики прерываний*******************************
void halfcycle()  //прерывания таймера
{ 

  tic++;  //счетчик  
  if(Dimmer1 < tic ) 
  digitalWrite(4, HIGH);
}

void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту
{  
 tic=0;             //обнулить счетчик
 timer=true;
 //ResumeTimer1();   //запустить таймер
 attachInterrupt(1, detect_down, HIGH);  //перепрограммировать прерывание на другой обработчик
}  

void  detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту
{   
 //StopTimer1(); //остановить таймер
 timer=false;
 //D4_Low;  //логический ноль на выходы
 digitalWrite(4, LOW);
 tic=0;       //обнулить счетчик
 attachInterrupt(1, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
} 
//*************************************************************************



void loop() 
{
    if (timer==true){   
   currentMicros = micros(); 
  if(currentMicros - previousMicros > 25) {
    // сохраняем время последнего переключения
    previousMicros = currentMicros; 
   halfcycle();
  }
  }

так что, если кому надо, код рабочий. 255 - полностью выключено, 0 - полностью включено