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

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

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

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

01int AC_pin = 7;                     //Выход диммера - OptoTriac
02byte dim = 100;                         //Начальный уровень диммирования от 0 до 255
03 
04void setup() {
05  Serial.begin(9600);                   // для теста, управление через сериал
06  pinMode(AC_pin, OUTPUT);              // установим выход диммера
07  attachInterrupt(0, light, FALLING);   // Если на конт. 2 FALLING из HIGH в LOW, вкл. процедуру light!
08}
09 
10void light() {
11  if (Serial.available()) {             // Если активен сериал, то запустим фунцию
12    dim = Serial.read();                // Прочитаем, что в сериале
13    if (dim < 1) {                   // Выключим TRIAC если dim равен 0
14      digitalWrite(AC_pin, LOW);
15    }
16    if (dim > 254) {                 // Вклюичим TRIAC есил dim равен 255
17      digitalWrite(AC_pin, HIGH);
18    }
19  }
20  if (dim > 0 && dim < 255) {         // Утановим диммирование, если dim не равен 0 или 255
21    delayMicroseconds(34*(255-dim));
22    digitalWrite(AC_pin, HIGH);
23    delayMicroseconds(500);
24    digitalWrite(AC_pin, LOW);
25  }
26}
27 
28void loop() {
29}

 

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
01#define mpin1 2 // 1<<1 пины выходов
02#define mpin2 4 // 1<<2
03#define mpin3 8 // 1<<3
04#define mpin4 16 //1<<4
05 
06unsigned char c1=5; // скважности каналов
07unsigned char c2=173;
08unsigned char c3=219;
09unsigned char c4=8;
10 
11volatile unsigned char a=0;
12volatile unsigned char mask=0;
13void setup ()
14{
15  Serial.begin(9600);
16  TIMSK2  &= ~( (1<<OCIE2A) | (1<<OCIE2B) | (1<<TOIE2) );
17  TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
18  TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
19  ASSR &= ~(1<<AS2);  //Выбор источника синхронизации таймера если AS2=0 от системного генератора
20 
21  TCCR2B = (TCCR2B & ~( (1 << CS22) | (1 << CS21) ) ) | (1 << CS20) ;
22  TIMSK2  |= (1<<TOIE2);
23  for (int i=1; i<=13; i++)
24    pinMode(i, OUTPUT);
25  PORTD=PORTD & ~(mpin1 | mpin2 | mpin3 | mpin4);
26}
27 
28ISR(TIMER2_OVF_vect)
29{
30  PORTD=PORTD^mask;
31  mask=0;
32  if (a==0)
33    mask=mpin1 | mpin2 | mpin3 | mpin4;
34  if (a==c1)
35    mask=mask^mpin1;
36  if (a==c2)
37    mask=mask^mpin2;
38  if (a==c3)
39    mask=mask^mpin3;   
40  if (a==c4)
41    mask=mask^mpin4;
42    a++;
43}
44 
45void loop ()
46{
47}

Надо проверить на ошибки. Небольшая частота: 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, все работает замечательно!