CLEUBER COSTA ROMUALDO
30/10/2024 14:02:05
Boa tarde, professor!
Estou desenvolvendo um controlador de carga para um alimentador vibratório e utilizando como referência um exemplo que o senhor enviou há algum tempo. No entanto, estou enfrentando dificuldades no controle da potência de uma bobina eletromagnética, que está impedindo o controle ideal.
Quando a bobina está operando sem o alimentador, que pesa cerca de 20 kg, o controle de vibração é satisfatório. Mas ao acoplar o alimentador, a potência não é suficiente para manter a velocidade adequada, e a vibração se torna quase inexistente.
Seguem os passos que tomei para identificar possíveis causas do problema:
Na programação, também ajustei o cálculo para aumentar o atraso após a detecção da passagem por zero, mas isso não resolveu.
Observei o seguinte: no registrador de configuração T0CON, o bit 5 está configurado para o ciclo de máquina interno (0). Minha dúvida é a seguinte: se estou usando um oscilador externo de 8 MHz e recebendo um sinal de passagem por zero no pino RB0 (INT0), que deveria sincronizar o Timer0 para overflow, não seria ideal configurar o bit 5 com 1 para permitir a contagem com base no sinal externo?
Não sei se ainda tem o exemplo que me enviou, não estou conseguindo anexar para que possa consultar está dando erro se possível me informe outroa maneira de anexar o documento.
CLEUBER COSTA ROMUALDO
01/11/2024 19:14:31
Professor, entendo!
Acredito que a sincronização entre a passagem por zero e o disparo do TIMER0 esteja funcionando corretamente. Realizei o cálculo a partir da frequência da rede (60Hz), e consigo detectar a passagem por zero no osciloscópio, bem como o disparo na porta de saída.
O que está acontecendo é o seguinte:
O ajuste feito com a bobina eletromagnética está funcionando bem, consigo controlar a intensidade de vibração, e a bobina vibra com força já na seleção 1.
Porém!
Quando o alimentador helicoidal é acoplado à bobina eletromagnética, a vibração fica quase nula, e a potência não é entregue à carga de forma eficiente.
Meu circuito de potência está bem dimensionado e suporta até 10A, com uma margem de segurança. O sistema requer 10A, considerando um pico que pode chegar a 8A. Realizei um teste isolando o controle, apenas com o TIMER0 piscando a saída a cada 200ms, e o resultado foi bom.
Agora, não consigo identificar o que pode estar causando o problema!
Segue parte do código:
******************************************************************************************************
void init_ticks(void)
{
T0CON = 0B00000011;
TMR0H = (char)(TMR0_VALUE >> 8);
TMR0L = (TMR0_VALUE & 0xff);
TMR0IF_bit = 0;
TMR0IP_bit = 1;
TMR0ON_bit = 0;
TMR0IE_bit = 1;
}
******************************************************************************************************
void interrupt_high() iv 0x0008 ics ICS_AUTO
{
//Zero Crossing detectado?
if (INT0IF_bit == 1 && INT0IE_bit == 1)
{
LATC.RC0 = 0; //desliga triac
INT0IF_bit = 0;
TMR0H = (char)(TMR0_VALUE >> 8);
TMR0L = (TMR0_VALUE & 0xff);
ticks = 0;
TMR0IF_bit = 0;
TMR0ON_bit = 1; //liga timer.
O atraso no disparo é definido pela variável 'tempo', o qual será incrementado
//por botões em intervalos multiplos de 1 milisegundos.
}
//estouro a cada 1ms
if (TMR0IF_bit == 1 && TMR0IE_bit == 1)
{
ticks++;
TMR0H = (char)(TMR0_VALUE >> 8);
TMR0L = (TMR0_VALUE & 0xff);
TMR0IF_bit = 0;
//talvez a rotina abaixo sirva para desligar o triac caso por ventura
//o circuito não detecte a passagem por zero;
#define TIME_MAX 16 //ms -> este intervalo não poderia ser maior que 1/60hz;
if(ticks >= TIME_MAX) {
LATC.RC0 = 0; //desliga triac
TMR0ON_bit = 0; //desiga o timer
return;
}
//if(ticks >= tempo) //a variável 'tempo' define quanto 'ticks' irá incrementar... (ORIGINAL)
if(ticks >= (TEMPO_MAXIMO - tempo)) // Inverte a lógica de controle de acordo com o novo valor de 'tempo'
// Professor alterei essa parte do código, incluí TEMPO_MAXIMO para inverter a contagem no displai.
{
TMR0ON_bit = 0; //desliga timer0
//se desligar o TIMER e a detecção do zero falhar, o triac permanecerá ligado constantemente
LATC.RC0 = 1; //liga triac
}
}
}
******************************************************************************************************
Já alterei os valores de TEMPO _MAXIMA eTIME_MAX e não resolveram.
o atraso no disparo é definido pela variável 'tempo' a cada 1 milisegundo, teria alguma dica para resolver esse problema ?
Microgenios Tecnologia e Educação
01/11/2024 16:15:09
Olá, Cleuber.
T0CKI (1) habilita o modo contador do TIMER0. A seleção da borda de disparo do sinal (subida ou descida), para alguns microcontroladores, pode ser configurada através de TMR0SE. De qualquer maneira, mesmo que utilize T0CKI, a interrupção do TIMER0 teria que ser configurada a cada passagem por zero detectada. Não tenho certeza de quanto é efetiva a troca de INT0 por T0CKI no seu projeto.
Talvez utilizar outros modelos de microcontroladores PIC seja melhor, segue um material da Microchip sobre Zero-Cross Detection: https://ww1.microchip.com/downloads/en/appnotes/90003138a.pdf
At.
Equipe Microgenios