Estou desenvolvendo um circuito para controlar várias cargas resistivas por PWM com o pic16f876A, (projetinho de semestre da faculdade) a idéia é colocar o máximo de canais possíveis e os testes inicias foram com 8 porem estou com o seguinte problema.
O circuito detector de Zero está ok a cada cruzamento tenho um pulso perfeito de + - 200us, faço a leitura da borda de subida e aciono um led "tudo perfeito apenas para teste", porém quando faço o acionamento do optoacoplador, colocando o canal 1 do osciloscopio no detector de zero e o canal 2 na porta do pino do moc, o tempo de acionamento fica variando em relacao ao zero e por consequência a lâmpada fica com a intensidade variando. Ja fiz algumas tentativas de ligar e deligar o timer e a int 0 em pontos diferentes mas sem sucesso.
A idéia do software é a cada cruzamento por zero, ele liga o timer e a cada 200us ele faz um incremento, sendo assim ele permanece em zero ou liga o pino do moc, dividindo os 8.33ms por 200us eu teria aproximadamente 41 niveis, porém não inicializo do zero e vou até +-90% da potencia máxima.
A solução é conseguir ligar o pino da porta do moc sempre na mesma base de tempo, pois como está variando o triac é acionado em pontos difentes, eu não sei o que está gerando essa variação dentro do software, pois a rotina é praticamente travada, os botões estão no main principal.
Grato;
O código está meio poluido devido aos testes, e nesta versão acabei bagunçando algumas temporizações.... mas o que eu preciso entender é lógica de como posicionar melhor a hora de ligar e desligar as interrupções de forma geral.
Segue o código.
- Código: Selecionar todos
// Pic16f876 Controle de fase
// Cristal 20MHZ
//
#include <pic.h>
#include <stdlib.h>
#include <stdio.h>
#define RELOAD_TMR0() { TMR0 -= 6; } // 6
#define REF_FASE PB0
//#define BOTAO_1 PB5
//#define BOTAO_2 PB4
//#define BOTAO_3 PB3
//#define BOTAO_4 PB2
#define TRIAC_1 RC6 //6 //1
#define TRIAC_2 RC7 //7 //2
//#define TRIAC_0 RC0
#define TRIAC_3 RC3
#define TRIAC_4 RC4
#define TRIAC_5 RC5
#define TRIAC_6 RC6
#define TRIAC_7 RC7
#define BT_INC RB5//RD1
#define BT_DEC RB4//RD0
#define LEDC0 RC0
#define LEDC1 RC1
#define LEDC2 RC2
unsigned int tempo,tempo2,conta_tempo;
unsigned int Bounce;
unsigned char varredura,potencia_1,potencia_2;
unsigned char x,y;
unsigned char TimerContador;
__CONFIG( HS & WDTDIS & PWRTEN & UNPROTECT & BOREN & LVPDIS & DEBUGEN );
delay_ms (unsigned int tempo);
//escreve_adc(void);
unsigned int le_ad (unsigned char Canal_Adc); // Rotina Leitura Conversor A/D.
void main ()
{
//-----GERAL-----
//OPTION = 0b001000100; //
OPTION = 0b11000010; // 001 6 -> 200us. 010 6 --> 400us.
INTCON = 0b11110000; // habilita int global e perifericos .
//INTCON = 0b11111010; // habilita int global e perifericos .
//------I/O---------
TRISA = 0b11111111; // Configura 1 in / 0 out
TRISB = 0b11111111; // 18f877 00110001;
TRISC = 0b00000000;
// TRISD = 0b11111111;
PORTA = 0b00000000;
PORTB = 0b11111110; // 18f877 00000010;
PORTC = 0b00000000;
//PORTD = 0b01111111;
//-----SERIAL------ //8 bits / Baud
PIE1 = 0b00100000; // bit 5 = 1 serial modo de interrupcao
PIR1 = 0b00000000;
// x = 5;
// y = 5;
//TMR0IE = 0;
for(;;)
{
if(BT_INC == 0)
{
//TRIAC_0 = 1;
LEDC0 = 1;
Bounce = 500;
while( Bounce-- );
while( BT_INC == 0 );
x = x + 1;
if (x > 18) //26
{
x = 18;
}
LEDC0 = 0;
}
if(BT_DEC == 0)
{
// TRIAC_0 = 1;
LEDC1 = 1;
Bounce = 500;
while( Bounce-- );
while( BT_DEC == 0 );
x = x - 1;
if (x < 2 )
{
x = 2;
}
//TRIAC_0 = 0;
LEDC1 = 0;
}
/*while( BT_INC == 1 );
if(BT_INC == 1)
{
if (x == 0)
{
x = 12;
}
TRIAC_0 = 0;
}
*/
}
}
interrupt void ISR ( void ) // Rotina Timer 0.
{
if( TMR0IF && TMR0IE )
{
TMR0IF = 0; // limpa Flag do timer 0
RELOAD_TMR0(); // Faz recarga do Timer0.
// TRIAC_0 = 1;
//TRIAC_0 = 0;
if (TimerContador > 4)
{
if(TimerContador == x)
{
TRIAC_1 = 1;
}
/* if(TimerContador == x)
{
TRIAC_2 = 1;
}
//if(TimerContador == 3)
//{
// TRIAC_0 = 1;
//}
if(TimerContador == 1)
{
TRIAC_3 = 0;
}
if(TimerContador == 1)
{
TRIAC_4 = 0;
}
if(TimerContador == 1)
{
TRIAC_5 = 0;
}
if(TimerContador == 1)
{
TRIAC_6 = 0;
}
if(TimerContador == 1)
{
TRIAC_7 = 1;
}*/
}
if(TimerContador > 15)
{
TMR0IE = 0;
TRIAC_2 = 0;
TRIAC_1 = 0;
//TRIAC_0 = 0;
//TRIAC_3 = 0;
//TRIAC_4 = 0;
//TRIAC_5 = 0;
//TRIAC_6 = 0;
//TRIAC_7 = 0;
TimerContador = 0;
//INTF = 0;
}
TimerContador++;
if(conta_tempo)
conta_tempo--;
}
if(INTE && INTF)
{
TMR0IE = 1;
INTF = 0;
LEDC2 = 1;
LEDC2 = 0;
//TRIAC_0 = 1;
//TRIAC_0 = 0;
}
}
/*
delay_ms (unsigned int tempo)
{
conta_tempo = tempo + 1;
while( conta_tempo );
} */