Dimmer com PIC
Dimmers são dispositivos utilizados para variar a intensidade de uma tensão elétrica média em uma carga.
VERSÃO COM PIC16F628A
VERSÃO COM PIC16F877A E POTENCIÔMETRO
Principio de Funcionamento: O circuito de detecção de passagem por zero ou Zero Crossing Detector, é um circuito que produz um pulso positivo de curta duração, quando o sinal senoidal de entrada passar pelo seu ponto de 0V. Esse sinal vai para o pino RB0/INT, gerando uma interrupção externa. Para cada interrpção gerada, também é gerado um pulso, com um atraso controlado, na saída do pino RB3. Esse pulso (pulso de trigger) irá disparar o TRIAC.
Na versão com PIC16F877A utilizou-se um potenciômetro para variar a tensão. Já na versão com PIC16F628A, foi utilizado dois botões.
No PIC16F628A, utilizou-se o próprio oscilador interno de 4Mhz.
Na versão com PIC16F877A utilizou-se um potenciômetro para variar a tensão. Já na versão com PIC16F628A, foi utilizado dois botões.
No PIC16F628A, utilizou-se o próprio oscilador interno de 4Mhz.
Pulso de disparo
Forma de Onda( AZUL: pulso de trigger; AMARELO: Sinal de Entrada; VERMELHO: Sinal Seifado pelo Triac)
DOWNLOAD:
Versão com PIC16F628A
Firmware: Dimmer.hex;
Arquivo de simulação do Proteus: dimmer.DSN;
Versão com PIC16F877A
Firmware: DimmerV2.hex;
Arquivo de simulação do Proteus: dimmerV2.DSN;
CÓDIGO-FONTE:
PIC16F628A
unsigned short nivel; bit oldstate, oldstate1; unsigned short i; void main() { TRISB=0b00000111;//pino rb0,rb1,rb2 entradas e rb3 saida oldstate=0; oldstate1=0; nivel=1; while(1) { //A cada passagem por zero if(INTCON.INTF) { //atraso controlado for(i=0;i<nivel;i++) { delay_us(100); } //pulso de trigger PORTB.F3=1; delay_us(100); PORTB.F3=0; INTCON.INTF=0; } //Botao pra diminuir a tensao if(PORTB.F1) oldstate=1; if(!PORTB.F1 && oldstate) { nivel++; if(nivel>70) nivel=1; oldstate=0; } //Botao pra aumentar a tensao if(PORTB.F2) oldstate1=1; if(!PORTB.F2 && oldstate1) { nivel--; if(nivel < 1) nivel = 70; oldstate = 0; } } }PIC16F877A
unsigned nivel,i; void main() { TRISB=0b00000011; nivel=1; while(1) { if(INTCON.INTF) { for(i=0;i<nivel;i++) { delay_us(100); } PORTB.F3=1; delay_us(100); PORTB.F3=0; INTCON.INTF=0; } nivel = ADC_Read(0); nivel = (20 * nivel) / 290; } }
Não estou conseguindo adaptar para o 12F675. Pode me ajudar? Segue o código feito no MikroC.
ResponderExcluirint nivel,i;
void main(){
TRISIO = 0b00101111;
ANSEL = 0b00000001;
CMCON = 0x07;
GPIO = 0;
nivel=1;
while(1){
if(INTCON.INTF){
for(i=0;i<nivel;i++){
Delay_us(100);
}
GPIO.F1=1;
Delay_us(100);
GPIO.F1=0;
INTCON.INTF=0;
}
nivel = ADC_Read(0);
nivel = (20 * nivel) / 290;
}
}
GP0 - DIV RES - POTENCIOMETRO
GP1 - SAIDA TRIAC
GP2/INT - PULSO PASS. ZERO
GP3 - NC
GP4 - NC
GP5 - NC
Clock Interno 4Mhz
Obrigado.
Patrick Ramos
Veja que vc definiu GP1 como saida, mas no codigo está como entrada(TRISIO = 0b00101111); O certo é 0b00101101;
ResponderExcluirObrigado Tiago, eu corrigi, mas ainda nada de rodar.. Já fiz de tudo, não acho onde estou errando.. =/
ExcluirVocê está simulando no Proteus?
ExcluirPorque eu utilizei esse mesmo codigo, e a simulação funcionou perfeito!!!
Sim, proteus. Você simulou com meu código no 12F675? Com o F877 eu tbm testei e tá tudo beleza, o negocio está sendo comigo mesmo.. hehehe
ResponderExcluirEra algum problema com o compilador. Depois de reinstalar foi resolvido. Estranho, pq com o 877 funcionou..
ResponderExcluirTem algum jeito de colocar outro botão para fazer a simulação reversa. Por exemplo: A intensidade está baixando e eu aperto o outro botão e ela começa a aumentar.
ResponderExcluirAlterei o código, coloquei um outro botão ligado ao pino RB2!
ExcluirTiago... teria como você colocar o codigo em c para que eu consiga compilar no ccs? Obrigado
ResponderExcluirPessoal... troquei o Potenciometro por um LM35... para fazer a variação da luminosidade da lampada com o aumento da temperatura... segue abaixo o codigo:
ResponderExcluir#define use_portd_lcd true
#include
#use rs232(baud = 9600, parity = N, xmit = PIN_C6, rcv = PIN_C7, bits = 8)
int x;
float i;
float transf;
float temperatura, tensao_real, sensor;
void trata_interrupcao(void);
#int_EXT
void EXT_isr(void)
{
x = 1;
trata_interrupcao();
}
void trata_interrupcao()
{
if(x == 1)
{
// for(i = 0 ; i < transf; i = i + 0.3819)
for(i = 0 ; i < transf; i = i + 0.31)
{
x = 0;
delay_us(100);
}
x = 0;
output_low(pin_B3);
delay_us(30);
output_high(pin_B3);
delay_us(30);
output_low(pin_B3);
}
i = 0;
}
void main()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
ext_int_edge(H_TO_L);
set_adc_channel(0);
lcd_init();
while(true)
{
sensor = (float)(read_adc()); // Leitura do sensor
//delay_ms(10);
//Calculo para LM35
tensao_real = (5000.0/1024.0)*(sensor); //10 bits (5v / pela resolução)
temperatura = (tensao_real)/(10);
printf(lcd_putc, "\f Tensao= %f \n Temp.= %f", tensao_real, temperatura);
delay_ms(100);
//transf = (float)(0.065*(temperatura) + 0.3819);
//transf = (float)(0.120*(temperatura) + 0.3819); ok!
transf = (float)(0.120*(temperatura) + 0.31);
printf("%2.1f\r", (float)temperatura);
delay_ms (100); // Dá um tempinho
}
}
Estou usando o PIC 16F877A com cristal de 16 MHz...
O problema quando eu conecto o fio que sai do transistor para ligar na interrupção externa a lampada apaga... e se eu tiro esse fio funciona normalmente... o estranho ainda que a simulação no proteus ocorre perfeitamente.
Ja tentei trocar o delay por um delay utilizando o timer 2... e nada...
Valeu pela akjuda
Olá! Colega, estou me matando mas não consigo fazer esses circuitos de dimmer funcionar. Já tenho o circuito montado em protoboard. quando tento gravar seu programa (16F877A), dá erro nos fuses. Por favor, você poderia postar um circuito de dimmer que rodasse no CCS, completo, desde os #define. Por favor, me ajude. Não é preguiça. Já tentei por várias semanas fazer esse dimmer, mas está faltando um empurrãozinho para coisa andar. Obrigado!
ResponderExcluirOlá, Estou tentando utilizar o arquivo acima do 877, no meu compilador e não estou conseguindo.
ResponderExcluirVocê poderia me enviar o arquivo em "C" para rodar no PCW?
Obrigado.
GOstaria de saber o motivo de ter o delay de 100us no programa... na parte do atraso controlado.
ResponderExcluirNão precisaria ter algum tempo relacionado com a senoide? 8.3ms por ex... ?
Att.
Preciso saber também o motivo de quando o brilho está baixo, a lampada fica oscilando bastante..
ResponderExcluirtentei usar capacitores na entrada do AD, mas não está resolvendo...
Ola pessoal como eu posso gerar um sinal triangular e senoidal mediante linguagem c.
ResponderExcluirA ideia e um gerador de sinal, como eu posso matematicamente fazer uma função capaz de gerar um grafico
Olá tem como me passar o PC817?? agradeço desde ja! rafaelmmoraes91@gmail.com
ResponderExcluirProjeto muito bom parabéns, já fiz algo parecido com o Arduíno + Processing variando a intensidade com o mouse.
ResponderExcluirhttp://bragamarcos.blogspot.com.br/2013/12/controle-de-angulo-de-disparo.html
Qual seria um equivalente ao PC817?
ResponderExcluirBoa noite. Esses dois GND no U2-PC817 pino 1 e 3 são ambos alternados VCA? Ou somente no pino 1, sendo o pino 3 contínuo VCC? Grato.
ResponderExcluirBom dia. Alguém pode dar dica (não precisa do programa) de como eu possa fazer uma rampa de aceleração e desaceleração (carga indutiva), pois se coloco valores e espero delay, o programa para ali. Grato.
ResponderExcluirEm um programa estruturado, sem RTOS, a sequencia de instruções não pode ficar parada em uma função (como delays), e sim verifica-la de tempo em tempo, através de interrupções... Como no programa acima... Assim, por exemplo, a cada 1 ms que entra na interrupção, o Código verifica o andamento do processo daquela função para verificar se o processo já acabou ou não, retornando a interrupção, e tomando suas devidas providencias.... Assim o microcontrolador poderá efetuar diversas funções ao mesmo tempo...
ResponderExcluir***************** esquemas.org - ordemferme.org ********************************
Obrigado Julio.
ResponderExcluirpreciso adaptar para o 18f4550, algéum poderia me ajudar, não estou conseguindo
ResponderExcluirSão dois que estão com o mesmo problema
ExcluirParabéns pelo blog e pelo ótimo trabalho !
ResponderExcluirSó tenho uma duvida, porque você multiplica a variavel nivel por 20 e divide por 290 ?
Grato
Olá, muito obrigado.
ExcluirÉ por causa do delay de no máximo 7000ms ( 70 * 100 ). Multplicando a variavel por 20 e dividindo por 290 faz com que varie de 0 até 70.
Abraços.
Cara eu estou utilizando um cristal de 4MHz, o que você me sugere para que funcione corretamente, desde já muito obrigado !
ExcluirAbraços.
Olá tudo bem ?
ResponderExcluirEstou fazendo um projeto de controlador de temperatura e preciso de uma ajuda pois não estou entendendo a parte de programação em relação ai TRIAC,eu vou usar o lm35 para a medição da temperatura e vou visualizar os valores das saídas no display.
Estou com dificuldade nessa parte do TRIAC poderia me ajudar ?
Desde ja obrigado !
Não pode acionar um TRIAC sem o uso de um optoacoplador, neste caso pode ser usado um MOC3010 que tem DIAC
ResponderExcluirCara parabens. Ficou top
ResponderExcluirO transistor Q1 é usado apenas pra inverter a fase do sinal dos optos? Obrigado
ResponderExcluircual seria la cabezera del condigo 16f877a+
ResponderExcluirParabens, ótimo projeto.
ResponderExcluirFiz aqui em casa, mas apresentou um problema.
A lampada incandescente fica piscando. Alguem pode me dar uma ajuda?
A tensão de entrada é 127v alternado mesmo? não precisa de nenhum tratamento antes do opto-acoplador?
ResponderExcluirmuito legal o projeto. um dia fiz algo bem parecido mas com função ON - OFF com a intensidade memorizada. valeu por compartilhar
ResponderExcluir