Disparar TRIAC com MOC e PIC !!!

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Disparar TRIAC com MOC e PIC !!!

Mensagempor Andre_Cruz » 12 Jan 2009 22:06

Bom pessoal estou fazendo um aquecedor com PIC, e o principio é o do dimmer, estou simulando no PROTEUS 7, com um TRIAC acionado por um resistor baixo de 10R eu consigo disparar o TRIAC, mas com o MOC não consegui de jeito nem um.

Para testes iniciais eu vou usar os 12VaC que vem do trafo, para controlar uma lâmpada de 12V e uns 3Watts.
Porém no PROTEUS o TRIAC não aciona nem a pau, montei o esquema que tem no data sheet do MOC, e mesmo assim não dispara.

Vou começar a montar o detector de zero amanhã e assim que ele ficar razoavél, vou passar para essa parte do acionamento do TRIAC com o MOC3020.

Abraço
André
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor ffcprog » 13 Jan 2009 07:12

Certo, você esta utilizando MOC com zero crossing, ou modelo que é apenas um diac ?
MOC que tem zero crossing, é utilizado em sistemas com thyristores em acionamento de carga, sem controle de disparo em angulo de fase.
Se for para isolação galvânica, e controle de disparo em angulo, você deve utilizar ou um trafinho, ou um MOC com definição de opto diac.

O Moc com zero crossing, dispara o triac, apenas na borda de subida e com tensão a baixo de 7V.

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Re: Disparar TRIAC com MOC e PIC !!!

Mensagempor andre_luis » 13 Jan 2009 07:59

Já postei nesse fórum um circuito baseado em PIC/MOC. Dá uma pesquizada.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Andre_Cruz » 13 Jan 2009 08:17

ffcprog

Tem razão !

Os MOCs do PROTEUS 7 são com Zero Crossing (MOC3031 até o MOC3043).
Para teste comprei o MOC3020 é opto diac, ainda não montei, você ja deve ter trabalhado com ele e me diz uma coisa, o pulso que o PIC vai dar na posição desejada da senoide, para acionar o TRIAC conduzir, deve ser curto, mas curto em quanto tempo ?
100uS é suficiente ?
Procurei no data sheet do MOC3020 e não encontrei.

É necessário usar um BC pra acionar o LED do MOC ??

Obrigado por sanar a dúvida ffcprg

André
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor ffcprog » 13 Jan 2009 08:24

bem, se olhar no 3020.
Alguns fabricantes, colocam um grafico assim.
Tibum na orelha do led, quanto tempo demora para o diac perceber a tensão ficar a baixo de 30V ?
alguns dizem 400uS, outros 800
Eu padronizei a média de 200uS,e mais 400 tempo acionado.

Ou seja se eu quiser disparar em X, é X-200, e seguro o led por 400uS.

Para mim sempre funcionou, satisfatóriamente...

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor Andre_Cruz » 13 Jan 2009 09:20

Olá andre_teprom, eu procurei no forum este assunto antes de postar um novo topico, mas mesmo assim eu vou procurar com mais calma, se você tiver pra me passar o link agradeço.

ffcprog, estou usando o X com 500uS e estou segurando no LED do MOC 400uS, isso simulando no PROTEUS 7.

Desculpa mas eu procurei essa sua informação "Alguns fabricantes, colocam um grafico assim.
Tibum na orelha do led, quanto tempo demora para o diac perceber a tensão ficar a baixo de 30V ?" e não achei rsrsrss

Mas sua informação ja foi de grande utilidade !

Obrigado !

André
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor ffcprog » 15 Jan 2009 22:01

IT´S VERY BOY!!
Se achase algo parecido com esta minha definição, eu realmente iria ficar maluco, e jamáis iria comprar nada deste fabricante...rsrs

falow meu querido.

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor menegola » 11 Fev 2009 07:52

Tenta ver os datasheets no link abaixo.
eu fiz conforme descrito sempre funcionou, no PROTOBORD.
não sei se ajuda.



http://www.google.com.br/search?hl=pt-B ... 3023&meta=
menegola
Word
 
Mensagens: 683
Registrado em: 08 Dez 2008 12:11

Mensagempor _blackmore_ » 24 Mai 2009 18:34

estou com o mesmo problema. .. fiz o circuito indicado no datasheet do MOC mas o bixo não funfa ...

http://www.fairchildsemi.com/ds/MO/MOC3041-M.pdf

estou usando um MOC com detecção de zero crossing e tentando ativá-lo por um pic .. mas mesmo sem dar qqer sinal no MOC ele liga a carga, que no meu caso é indutiva.
No Triac é um BTA41 ...
O que será que acontece?

Edit:

Pessoal, encontrei o problema ... na montagem eu inverti a posição de A1 e A2 do Triac e por isso não dava certo ... desmontei a protoboard ... e na re-montagem encontrei o meu erro ... pronto . está funcionando ...

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Re: Disparar TRIAC com MOC e PIC !!!

Mensagempor roquetti » 25 Mai 2009 00:15

roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor Andre_Cruz » 02 Jun 2009 10:10

roquetti,

Esta legal seu circuito.
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Andre_Cruz » 05 Jun 2009 08:18

Obrigado pessoal, consegui montar o meu dimmer.

Usei o MOC3020 e o TIC226.

Abraço

André
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor ÁgioFelipe » 01 Dez 2009 09:48

Posta o circuito ai André!
ÁgioFelipe
Word
 
Mensagens: 626
Registrado em: 27 Out 2006 20:04

Mensagempor diogo_18sp » 01 Dez 2009 14:01

andre de uma olhada no codigo que fiz pro dimmer que fiz ele tem display e usei um bt 139 e um moc 3021



asm code
;*********************************** dimmer digital***************************************
;
; diogo franscisco da silva 25/04/2009
; este projeto em um dimmer digital com display de sete segmento onde sera indicado
; a potencia que a onda sera controlada via disparo do pic.
;
;******************************************************************************************

;***********************************descriçoes das portas**********************************
; rb0 saida bcd a
; rb1 saida bcd b
; rb2 saida bcd c
; rb3 saida bcd d
; rb4 entrada entrada do sincronismo
; rb5 entrada chave prog
; rb6 entrada chave menos
; rb7 entrada chave mais
;
; ra0 saida display unidade
; ra1 saida display dezena
; ra2 saida display centena
; ra3 saida rele
; ra4 (saida disparo?)
;********************************************************************************************

;*********************************configuraçoes do pic***************************************

radix hex
list p=16f84a
#include <p16f84A.inc>
__config _xt_osc & _cp_off & _wdt_off & _pwrte_on

;*********************************************************************************************

;**********************************registradores de uso geral*********************************

cblock 0x0c
tempograva
unidade
dezena
centena
controle
delaychave
somadez
auxisoma
TEMPODIMMER
grave
dado
auxizera

endc
;**********************************************************************************************

;***********************************definiçoes*************************************************

#define duni porta,0 ;saida que controla display unidade
#define ddez porta,1 ;saida que controla display dezena
#define dcen porta,2 ;saida que controla display centena
#define rele porta,3 ;saida que controla o rele

#define sinc portb,4 ;entrada do sincronismo 60 Hz
#define ch_up portb,7 ;chave que aumenta valor da potencia
#define ch_don portb,6 ;chave diminui o valor da potencia
#define prog portb,5 ;chave de programaçao

;***********************************************************************************************

;*************************************inicializaçao dos port************************************

org 0x00 ;endereço inicial do banco de memoria
bcf status,rp0 ;seleciona o banco 0
clrf portb ;limpa o portb
clrf porta ;limpa o porta
bsf status,rp0 ;seleciona o banco 1
movlw 0xf0 ;carrega com 11110000
movwf trisb ;0000 saidas 1111 entradas
movlw 0x00 ;carrega com 00000
movwf trisa ;00000 saidas
movlw 0x01 ;prescaler 1:4, tmr0,pull up habilitado
movwf option_reg ;definicoes
movlw 0x00 ;carrega com 00000000*****************
movwf intcon ;nenhuma interrupçao sera tratada
bcf status,rp0 ;seleciona o banco 0
;**************************************************************************************************
;*************************************************************************************************
;gravaçao da memoreia com os valores do dimmer
movlw 0xf0
movwf tempograva

varreprog
nop
btfsc prog ;botao prog ta pressionado?
goto naoprog ;ele naum esta pressionado
decfsz tempograva,f ;dec variavel
goto varreprog ;volta ver a chave
goto cleareg ;limpa registradore s da memoria
;****************************************************************************************************
;neste ponto e onde vai ser limpado o banco de memoria para aa gravaçao dos registradores
cleareg
movlw 0x40 ;carrega com 64 referente as posiçoes de memoria
movwf auxizera ;registrador que auxilia na limpeza da memoria


escram

bcf status,rp0 ;banco 0
bcf eecon1,eeif ;zera o flag da eprom
clrf dado ;limpa dado
movf auxizera,w ;endereço da memoria
call grava ;rotina que grava a ram
decfsz auxizera,f
goto escram

bcf status,rp0 ;banco 0
bcf eecon1,eeif ;zera o flag da eprom
clrf dado ;limpa dado
movf auxizera,w ;endereço da memoria
call grava ;rotina que grava a ram

call le_ram ;ler os dados da memoria
goto principal ;inicio do programa
;............................................................................................................
le_ram
movlw 0x01
call le
movwf unidade

movlw 0x02
call le
movwf dezena

movlw 0x03
call le
movwf centena

movlw 0x04
call le
movwf grave
return


le
Movwf EEADR ;EEADR (endereço da eeprom)
Bsf STATUS,RP0 ;banco 1 onde está o EECON1
Bsf EECON1,RD ;inicia a leitura, leva um ciclo de
nop ;máquina
Bcf STATUS,RP0 ;volto ao banco 0 onde está o EEDATA
Movf EEDATA,W ;W=EEDATA( w= 10H eeprom )

return

;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;grava na memoria valores

grava
Movwf EEADR ;EEADR (endereço da eeprom)
Movf dado,w ;w
Movwf EEDATA ;EEDATA(dado a ser gravado)

Bsf STATUS,RP0 ;banco 1 onde está o EECON1
bsf EECON1,WREN ;Habilita a escrita na EEPROM
movlw 0x55 ;W=55H
movwf EECON2 ;EECON2 = 55H
movlw 0xAA ;W=AAH
movwf EECON2 ;EECON2 = AAH
bsf EECON1,WR ;WR=1 (inicia a gravação)
bsf EECON1,WREN ;desabilita a escrita na EEPROM

espera
btfss EECON1,EEIF ;testa flag de término de gravação
goto espera ;EEIF=0 então espera terminar
bcf EECON1,EEIF ;EEIF=1 então zera o flag p/ próximo
;uso
Bcf STATUS,RP0 ;volto ao banco 0

return
;_____________________))))))))))))))))))))________________))))))))))))))))))))))))_____________________))))))))
naoprog
btfss grave,0 ;ve se e a primeira ves que limpa banco da memoria
goto cleareg ;aki limpa a memoria
call le_ram
goto principal
;000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

;*****************************************zeramentodas variaveis***********************************
principal
clrf auxisoma
clrf tempodimmer
; clrf unidade
; clrf dezena
; clrf centena
clrf controle
clrf delaychave
goto inicio

;*****************************************************************************************************

;******************************************inicio do programa*****************************************

inicio

call atual1 ;aqui vai para rotina atualizar display multiplexado
inicio1
call atual ;aqui vai para rotina atualizar display multiplexado
call chave ;aqui vai para subrotina testa chave incremento e decremento
call chaveprog ;testa pra ver se pode começar a controlar onda

goto inicio1
;******************************************************************************************************

;**************************************dimmer**********************************************************
;aki começao controle de potencia do dimmer os displays seram todos apagados para facilitar o controle
;da onda,

dimmer
bcf duni ;apaga display unidade
bcf ddez ;apaga display dezena
bcf dcen ;apaga display centena
;00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
bsf grave,0 ;seta bit de zeramento da memoria

bcf status,rp0 ;banco 0
bcf eecon1,eeif ;zera o flag da eprom
movf unidade,w ;valor programado
movwf dado ;coloca valor em dado
movlw 0x01 ;endereço 1 da memoria
call grava ;rotina que grava

bcf status,rp0 ;banco 0
movf dezena,w ;valor programado
movwf dado ;coloca valor em dado
movlw 0x02 ;endereço 2 da memoria
call grava ;rotina que grava

bcf status,rp0 ;banco 0
movf centena,w ;valor programado
movwf dado ;coloca valor em dado
movlw 0x03 ;endereço 3 da memoria
call grava ;rotina que grava

bcf status,rp0 ;banco 0
movf grave,w ;valor programado
movwf dado ;coloca valor em dado
movlw 0x04 ;endereço 3 da memoria
call grava ;rotina que grava
call le_ram
;00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000



movlw 0xfa ;carrega com 255 em decimal
movwf delaychave ;coloca o valor no registrador espera 1ms para começar a rotina

nop
decfsz delaychave,f ;decrementa e zero
goto $-2 ;volta decrementa
goto conta ;somar os registradores


;¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨

conta
clrf somadez ;limpa
clrf auxisoma ;limpa

clrw ;limpa w
movf centena,w ;coloca o valor em w
xorlw 0x01 ;compara se e 1
btfss status,z ;e 1?
goto somaini ;busca no banco de memoria o valor correspondente

movlw 0x64 ;carrega com 100
movwf auxisoma ;crrega 100
goto valordimmer ;busca no banco de memoria o valor
somaini

movlw 0x0a
movwf somadez ;coloca valor 10
soma
clrw ;limpa w
movf dezena,w ;coloca valor de dezena em w ex:9
addwf auxisoma,f ;guarda o valor em f; 0+9........90
decfsz somadez,f ;e igual a zero
goto soma ;ainda naum

movf unidade,w ;coloca unidade em w
addwf auxisoma,f ;soma unidade com dezena 90 +9
goto valordimmer

;_______________________________________________________________________________________________________
;aqui inicia a conversao do display para o tempo de disparo do dimmer

valordimmer
call veonda ;espera sinal pra sincronismo
call timerpera ;aki oprograma cria um atrasopara deposi começar o disparo
call converte ;aki trata tempo que vaio ser disparado o dimmer

btfsc prog ;botao pra sai do modo dimmer
goto valordimmer
nsolto
btfsc prog
goto vbsolto
goto nsolto
vbsolto
goto inicio1
;¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨*************************************************




;))))))))))))))))))))))))))))))))))veonda_______________________________________________________________________

veonda

naoe
btfsc sinc ;a onda e zero?
goto naoe
goto sime
sime
btfss sinc
goto sime ;aqui a onda naum foi a 1
return ;aqui e onda foi 1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

timerpera

movlw 0x64 ;carrega com 100 *****************
movwf tempodimmer
naoacabo
nop
decfsz tempodimmer,f ;decrementa
goto naoacabo ;naum acabou tempo de 1 ms
return
;*****************************************************&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*******************
;converte o valor do registrador para procurar o valor na tabela de tempo
;tamanho pulso de atraso de cada disparo

converte
movf auxisoma,w
sublw 0x65 ;carrega com 101
movwf tempodimmer ;subtrai 101 do registrador
voltala
bcf intcon,t0if ;limpa flag
movlw 0xf0 ;243 (240)**********************************
movwf tmr0
btfss intcon,t0if ;testa pra ver se tem interrupçao
goto $-1

decfsz tempodimmer,f ;e zero
goto voltala ;naum

;tempo de 300us para disparo da onda

bsf rele ;ativa disparo dimmer
bcf intcon,t0if ;reseta bit
movlw 0xb4 ;carrega com 1oo000000 75
movwf tmr0 ;carrega timer
btfss intcon,t0if
goto $-1
bcf rele ;desliga saida
bcf intcon,t0if
return

;******************************************************************************************************

;**************************************inicia chave prog***********************************************
;aqui entra o modo de operaçao para ver se a chave prog esta acionada para funcionamento do dimmer

chaveprog

movlw 0x64 ;carrega com 100 em decimal
movwf delaychave ;coloca o valor no registrador

vchaveprog

btfsc prog ; a chave prog esta pressionada ?
return ;volta para o programa principal
decfsz delaychave,f ;decrementa o registrador anti ruido da chave
goto vchaveprog ;volta pois nao acabou o tempo

vchavednovo

btfss prog ;chave esta solta?
goto perai ;vai atualizar display quando a chave naum esta solta
goto dimmer ;aqui vai começar usar o dimmer
perai
call atual ;atualiza display
goto vchavednovo
;*************************************atualiza display multiplexado************************************

atual
btfss intcon,t0if ;houve interrupçao?
return ;nao houve interrupçao volta para rotina principal

btfss controle,0 ; e um trata display unidade
goto testa ;testa dezena
goto atual1 ;trata unidade
testa
btfss controle,1 ;e um trata display dezena
goto testa1 ;testa o proximo bit
goto dez ;vai tratar dezena
testa1
btfss controle,2 ; e um trata display centena
goto atual ;*******indica qu e houve erro
goto cen ;trata display centena


atual1
bcf controle,0 ;apaga o bit e indica que vai atualizar dezena
bcf dcen ;apaga display centena
bcf ddez ;apaga display dezena
bsf controle,1 ;seta o bit e indica que vai atualizar a dezena
movf unidade,w ;coloca o valor em w
movwf portb ;coloca o valor no portb
bsf duni ;seleciona display unidade
goto timer ;tempo para multiplexaçao

dez bcf controle,1 ;apaga bit pois ja passou por ai
bcf duni
bcf dcen
bsf controle,2 ;seta o bit e indica que vai atualizar a centena
movf dezena,w ;coloca o valor em w
movwf portb ;coloca o valor no portb
bsf ddez ;seleciona display dezena
goto timer ;tempo para multiplexaçao
cen
bcf controle,2
bcf duni
bcf ddez
bsf controle,0 ;seta o bit e indica que vai atualizar a unidade
movf centena,w ;coloca o valor em w
movwf portb ;coloca o valor no portb
bsf dcen ;seleciona display centena
goto timer ;tempo para multiplexaçao

;*****************************************************************************************************

;********************************************timer****************************************************
timer
bcf intcon,t0if ;zera flag do tmr0
clrf tmr0 ;limpa o registrador tmr0
movlw 0x05 ;carrega com 5
movwf tmr0 ;inicia timmer com 5

return ;volta a rotina principal

;********************************************************************************************************

;********************************************chave*******************************************************
;aqui nessa subrotina vai ser excecutado os teste das chave up e donw para incremento e decremento do display

chave
movlw 0x64 ;carrega com 100 em decimal
movwf delaychave ;coloca o valor no registrador

chave1
btfsc ch_up ;a chave esta pressionada ?
goto vchave ;ve a chave donw
decfsz delaychave,f ;decrementa o registrador anti ruido da chave
goto chave1 ;volta pois nao acabou o tempo
chavsolta
btfss ch_up ;chave ta solta
goto atualch
goto incrementa ;incrementa o display

atualch
call atual
goto chavsolta

vchave
movlw 0x64 ;carrega com 100 em decimal
movwf delaychave ;coloca o valor no registrador
chave2
btfsc ch_don ;a chave e esta pressionada
return ;volta para o programa principal
decfsz delaychave,f ;decrementa o registrador anti ruido da chave
goto chave2 ;volta pois nao acabou o tempo
chavsolta1
btfss ch_don
goto atualch1
goto decrementa ;decrementa display
atualch1
call atual
goto chavsolta1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

incrementa
movf centena,w
xorlw 0x01 ;aqui verifica se o valor do display e cem pois ele eo maximo
btfss status,z ;e 100?
goto podeinc ;nao e 100
return ;volta ao programa principal
podeinc
incf unidade,f ;incrementa contagem
movf unidade,w
xorlw 0x0a ;compara ja passou de 9 ou seja e 10?
btfss status,z ;ve se a comparaçao houve estouro
goto fim
clrf unidade ;limpa unidade e incrementa dezena

incf dezena,f ;incrementa dezena
movf dezena,w ;coloca dezena em w
xorlw 0x0a ;compara ja passou de 9 ou seja e 10?
btfss status,z ;ve se a comparaçao houve estouro
goto fim
clrf dezena ;limpa dezena

incf centena,f ;incrementa centena
goto fim ;atualiza display

decrementa
movf unidade,w
btfss status,z
goto podedec

movf dezena,w
btfss status,z
goto podedec

movf centena,w
btfss status,z
goto podedec
return ;display encontra em 000 entao naum decrementa



podedec
movf unidade,w
xorlw 0x00
btfss status,z
goto dec_uni ;pode decrementar
movlw 0x09
movwf unidade
goto dec_dez
dec_uni
decf unidade,f ;decrementa unidade
;goto dec_dez
return
dec_dez
movf dezena,w
xorlw 0x00
btfss status,z
goto decdez ;pode decrementar
movlw 0x09
movwf dezena
goto dec_cen
decdez
decf dezena,f
;goto dec_cen
return
dec_cen
movf centena,w
xorlw 0x01
btfss status,z
return
decf centena,f
goto fim
fim

call atual ;atualiza display
return ;volta ao programa principal
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
end
diogo_18sp
Byte
 
Mensagens: 117
Registrado em: 14 Jan 2008 18:12
Localização: Amparo ,SP

Mensagempor ÁgioFelipe » 03 Dez 2009 13:22

diogo_18sp

Poderia postar o circuito?
ÁgioFelipe
Word
 
Mensagens: 626
Registrado em: 27 Out 2006 20:04

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x