Многоканальный диммер на 220В

scherkhan
Offline
Зарегистрирован: 22.04.2013

Может кто-нибудь делал многоканальный диммер на 220 на базе Ардуино. В сети нашел несколько скетчей, но все на один канал, т.к. испульзуют в функциях delay(). Мне бы желательно на 4. Подскажите куда копать.

ни же скетчь на один канал:



int AC_pin = 7;						//Выход диммера - OptoTriac
byte dim = 100;            			  	//Начальный уровень диммирования от 0 до 255

void setup() {
  Serial.begin(9600);					// для теста, управление через сериал
  pinMode(AC_pin, OUTPUT);				// установим выход диммера
  attachInterrupt(0, light, FALLING);	// Если на конт. 2 FALLING из HIGH в LOW, вкл. процедуру light!
}

void light() {
  if (Serial.available()) {				// Если активен сериал, то запустим фунцию
    dim = Serial.read();				// Прочитаем, что в сериале
    if (dim < 1) {                  	// Выключим TRIAC если dim равен 0
      digitalWrite(AC_pin, LOW);
    }
    if (dim > 254) {					// Вклюичим TRIAC есил dim равен 255
      digitalWrite(AC_pin, HIGH);
    }
  }
  if (dim > 0 && dim < 255) {			// Утановим диммирование, если dim не равен 0 или 255
    delayMicroseconds(34*(255-dim));
    digitalWrite(AC_pin, HIGH);
    delayMicroseconds(500);
    digitalWrite(AC_pin, LOW);
  }
}

void loop() {
}

 

maksim
Offline
Зарегистрирован: 12.02.2012
scherkhan
Offline
Зарегистрирован: 22.04.2013

maksim, а вы пробовали делать многоканальный диммер?

zhuki
Offline
Зарегистрирован: 12.10.2011

А разве с таким подходом нельзя использовать ШИМ?  Трудно представить что остаётся после синусоиды

carduino.ru
Offline
Зарегистрирован: 06.12.2011
Osseum
Offline
Зарегистрирован: 25.04.2013

#define mpin1 2 // 1<<1 пины выходов
#define mpin2 4 // 1<<2
#define mpin3 8 // 1<<3
#define mpin4 16 //1<<4

unsigned char c1=5; // скважности каналов
unsigned char c2=173;
unsigned char c3=219;
unsigned char c4=8;

volatile unsigned char a=0;
volatile unsigned char mask=0;
void setup ()
{
  Serial.begin(9600);
  TIMSK2  &= ~( (1<<OCIE2A) | (1<<OCIE2B) | (1<<TOIE2) );
  TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
  TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
  ASSR &= ~(1<<AS2);  //Выбор источника синхронизации таймера если AS2=0 от системного генератора 

  TCCR2B = (TCCR2B & ~( (1 << CS22) | (1 << CS21) ) ) | (1 << CS20) ;
  TIMSK2  |= (1<<TOIE2);
  for (int i=1; i<=13; i++)
    pinMode(i, OUTPUT); 
  PORTD=PORTD & ~(mpin1 | mpin2 | mpin3 | mpin4);
}

ISR(TIMER2_OVF_vect)
{
  PORTD=PORTD^mask;
  mask=0;
  if (a==0)
    mask=mpin1 | mpin2 | mpin3 | mpin4;
  if (a==c1)
    mask=mask^mpin1;
  if (a==c2)
    mask=mask^mpin2;
  if (a==c3)
    mask=mask^mpin3;    
  if (a==c4)
    mask=mask^mpin4;
    a++;
}

void loop ()
{
}

Надо проверить на ошибки. Небольшая частота: 16 000 000/(256*256)=244Гц (Можно немного увеличить, переведя таймер в CTC режим)

Osseum
Offline
Зарегистрирован: 25.04.2013

Ну и есть вариант сделать 4 ШИМа на 4-х таймерах-счётчиках, там будет нормальная частота.

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Ну так сначала сделайте проверьте , а потом пишите.

Вы хотябы прочитали как работает Dimmer с переменным напряжением

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

схему бы хоть показали, чем вы там мигаете... на переменке  как минимум нужно определять переход через 0, а просто открывать симистор через шим как то не очень... да и соседи вам спасибо не скажут :)

 

кстати поиск рулит, вот например, народ замутил

http://cyber-place.ru/showthread.php?t=525

scherkhan
Offline
Зарегистрирован: 22.04.2013

сделал, как приведен пример по этой ссылке http://cyber-place.ru/showthread.php?t=525, все работает замечательно!