Go Down

Topic: (Resolvido) controlando dimmer com 2 lampadas (Read 2987 times) previous topic - next topic

BigRol

Mar 28, 2013, 04:47 pm Last Edit: Apr 05, 2013, 07:34 pm by BigRol Reason: 1
Ola

o que estou a fazer mal?? :-)

Estou a tentar controlar 2 lampadas com dimmer, tenho um opto 4N25 para fazer a detecção por zero e um MOC3021 a fazer o disparo do Triac (TIC246M). Assim com uma lampada funciona perfeitamente, quando duplico o MOC3021 e outro TRIAC (a deteção por Zero mantive o mesmo, penso k basta 1) nao consigo controlar a segunda lampada, ela tem o comportamento da primeira lampada.

Este é o codigo para 1 lampada e k funciona bem.

Code: [Select]
/*

AC Light Dimmer - Inmojo
AC Voltage dimmer with Zero cross detection

Author: Charith Fernanado http://www.inmojo.com charith@inmojo.com
License: Released under the Creative Commons Attribution Share-Alike 3.0 License.
http://creativecommons.org/licenses/by-sa/3.0
Target:  Arduino

Attach the Zero cross pin of the module to Arduino External Interrupt pin
Select the correct Interrupt # from the below table

Pin    |  Interrrupt # | Arduino Platform
---------------------------------------
2      |  0            |  All
3      |  1            |  All
18     |  5            |  Arduino Mega Only
19     |  4            |  Arduino Mega Only
20     |  3            |  Arduino Mega Only
21     |  2            |  Arduino Mega Only

*/

int AC_LOAD = 5;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
 pinMode(AC_LOAD, OUTPUT);      // Set the AC Load as output
 attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
 // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
 // (10000us - 10us) / 128 = 75 (Approx)
 int dimtime = (75*dimming);      
 delayMicroseconds(dimtime);    // Off cycle
 digitalWrite(AC_LOAD, HIGH);   // triac firing
 delayMicroseconds(10);         // triac On propogation delay
 digitalWrite(AC_LOAD, LOW);    // triac Off
}

void loop()
{
 
 dimming = 100;  
 delay(1000);
 dimming = 75;  
 delay(1000);

}


Este é o codigo k fiz para a segunda lampada e k nao funciona
Code: [Select]
/*

AC Light Dimmer - Inmojo
AC Voltage dimmer with Zero cross detection

Author: Charith Fernanado http://www.inmojo.com charith@inmojo.com
License: Released under the Creative Commons Attribution Share-Alike 3.0 License.
http://creativecommons.org/licenses/by-sa/3.0
Target:  Arduino

Attach the Zero cross pin of the module to Arduino External Interrupt pin
Select the correct Interrupt # from the below table

Pin    |  Interrrupt # | Arduino Platform
---------------------------------------
2      |  0            |  All
3      |  1            |  All
18     |  5            |  Arduino Mega Only
19     |  4            |  Arduino Mega Only
20     |  3            |  Arduino Mega Only
21     |  2            |  Arduino Mega Only

*/

int AC_LOAD = 5;    // Output to Opto Triac pin
int AC_LOAD2 =6;
int dimming = 128;// Dimming level (0-128)  0 = ON, 128 = OFF
int dimming2 = 128;

void setup()
{
 pinMode(AC_LOAD, OUTPUT);      // Set the AC Load as output
 pinMode(AC_LOAD2, OUTPUT);
 attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
 // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
 // (10000us - 10us) / 128 = 75 (Approx)
 int dimtime = (75*dimming);      
 delayMicroseconds(dimtime);    // Off cycle
 digitalWrite(AC_LOAD, HIGH);   // triac firing
   delayMicroseconds(10);         // triac On propogation delay
 digitalWrite(AC_LOAD, LOW);  // triac Off
 int dimtime2 = (75*dimming2);
 digitalWrite(AC_LOAD2, HIGH);
 delayMicroseconds(10);         // triac On propogation delay
 digitalWrite(AC_LOAD2, LOW);
}

void loop()
{
 
 dimming = 100;  
 dimming2 = 75;
 delay(1000);
 dimming = 75;
 dimming2 = 100;  
 delay(1000);

}




Agradeço desde já qualquer ajuda.

Abraços

HugoPT

#1
Mar 28, 2013, 07:13 pm Last Edit: Mar 28, 2013, 07:20 pm by HugoPT Reason: 1
Quote
quando duplico o MOC3021 e outro TRIAC (a deteção por Zero mantive o mesmo, penso k basta 1) nao consigo controlar a segunda lampada, ela tem o comportamento da primeira lampada.

Ou eu nao estou a entender bem mas se estas a usar a mesma interrupçao para controlar 1 lampada e duplicas-te o circuito nao é de esperar que a 2º lampada faça o mesmo?
Outra questao é usares delays dentro da rotina de interrupçao.Algo que nao deve ser feito
Quote
Note also that due to the fact that interrupts are blocked and timers are stopped during the ISR processing, inside the attached function, delay() won't work and the value returned by millis() will not increment. Serial data received while in the function may be lost. You should declare as volatile any variables that you modify within the attached function.      

O sumo disto que que as variaveis usadas dentro da rotina de interrrupçao teem de ser declaradas como volatile e nao podes usar o delay.



Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

BigRol

Boas HugoPT

eu neste momento ja nao sei nada  :)

eu nao dupliquei o detector por zero, pk penso k basta um ... ou seja ... a passagem por zero vai ser sempre a mesma, agora dupliquei o MOC3021 e o triac para controlar a segundo triac com um angulo diferente do primeiro triac... e nao estou a ver como o fazer :( penso k tem a ver com os tempos ... mas nao tou a lá chegar

em relação ao delay dentro da interrupção eu sei k nao se deve usar ... mas tá somente para simplificar.

HugoPT

#3
Mar 28, 2013, 10:41 pm Last Edit: Mar 28, 2013, 11:36 pm by HugoPT Reason: 1
Quote
detector por zero

Podes dizer melhor em que consiste este termo que utilizas?
Tens circuito disso para ver?
Acho que te devo um pedido de desculpas por uma informaçao errada que te dei quanto aos Delays.
Ha pouco fui ler melhor pois questionei me porque é que o autor do codigo que estas a tentar usar la usou a funçao delayMicroseconds()
Defacto esta funçao funciona dentro das interrupçoes :)
Mas a funçao delay() nao pois depende inteiramente da funçao millis() que nao é incrementada devido a interrupçao estar desativada a quando dentro da rotina de interrupçao.
Assim podes usar delayMicroseconds() para provocar delays pequenos.
Comprovei isto com um analisador de Logica e está confirmado.
Se no entanto tentar usar a funçao delay() a funçao perde toda a logica temporal pois o que é reproduzido pela funçao delay nada tem a ver com o tempo que reflete no codigo.



Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

BigRol

Ola HugoPT, antes de mais obrigado pelo tempo k tem despendido a olhar para o meu problema

O Detector de Passagem por Zero ou Zero Crossing Detector é um circuito que produz um pulso positivo quando o sinal senoidal passa por zero Volt para saber quando fazer o "disparo" ao TRIAC.

Sei k utilização do Delay realmente nao é a correcta Hugo... No entanto este circuito está incompleto, entao reduzi o mais possivel na tentativa de resolver este problema, daí o delay estar no codigo, foi a forma mais rapida de o fazer. Mas no 1º codigo k publiquei aqui, em k está somente um MOC e um TRIAC o delay tá lá e o sistema funciona na perfeição. No entanto tb ja alterei o codigo o substitui o delay, mas ficou na mesma.

o circuito é este:



Tal como está neste circuito e com o primeiro codigo k postei funciona, depois dupliquei o MOC e o Triac e alterei o Codigo (o segundo codigo k postei) e é aí k nao funciona :(

relembrando o k desejo fazer ... controlar o Dimmer de 2 lampadas de forma independente 1 da outra.

HugoPT

#5
Mar 28, 2013, 11:50 pm Last Edit: Mar 28, 2013, 11:54 pm by HugoPT Reason: 1
Para comprovar na rotina de interrupçao alterei a de forma a ela gerar um sinal que mude o tempo e medi-los
Code: [Select]

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
 digitalWrite(AC_LOAD, HIGH);   // triac firing
 delayMicroseconds(100);         // triac On propogation delay
 digitalWrite(AC_LOAD, LOW);    // triac Off
 delayMicroseconds(200);         // triac On propogation delay
 digitalWrite(AC_LOAD, HIGH);   // triac firing
 delayMicroseconds(300);         // triac On propogation delay
 digitalWrite(AC_LOAD, LOW);    // triac Off
}

void loop()
{

}

Aqui esta a prova:
Esta é uma daquelas liçoes praticas quem tenta ensinar acaba por aprender :)

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

HugoPT

#6
Mar 29, 2013, 12:10 am Last Edit: Mar 29, 2013, 12:16 am by HugoPT Reason: 1
Tens isso ligado tal como no esquema ?
Esse 4n25SRV se inda nao morreu vai daqui a nada.
Sabes que la dentro tem um led e nao estas a limitar a corrente dele nem tao pouco a tensao.Vai entrar em curto ...
Quantos Volts saem apos a ponte retificadora??
O led interno do moc so gosta de tensoes de cerca de 3V !!!
Quando dizes que para uma lampada funciona como sabes?
Ou melhor consegues regular a intensidade dela como?


Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

BigRol

Tenho 2 resistencias de 100K em paralelo ao pino 1 do 4n25

o dimmer ta a funcionar pk a luz aumenta e diminui conforme o loop... agora ... é as 2 lampadas ao mesmo tempo :-(

void loop()
{
 
  dimming = 100; 
  delay(1000);
  dimming = 75; 
  delay(1000);

}

Go Up