Autor Tópico: Tacômetro com PIC16F877A e controle de velocidade em motor AC  (Lida 1901 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Offline Paulo_lumens

  • Hobby
  • ****
  • Posts: 269
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Charqueada-SP
Tacômetro com PIC16F877A e controle de velocidade em motor AC
« Online: 19 de Agosto de 2016, 16:12 »
Olá Amigos.
Alterei o primeiro projeto que estava com PIC16F628A para um com PIC16F877A.
A principio usei uma placas de outros projetos, mas estarei confeccionando uma especifica para essa aplicação.

Depois de pesquisar bastante na net achei alguns exemplo e adaptei para minha aplicação.
A resposta do sistema esta um pouco lenta, e com uma variação pequena também.

Uma duvida é como diminuir o tempo de display que esta causando uma falha em meia onda as vezes numa onda completa, dando uma oscilação ou corte de potencia.
O controle de potencia esta sendo calculado com P+I, talvez o mais correto seria usar o P+I+D = PID

Segue abaixo um vídeo do teste.
Opiniões dos amigos serão bem vinda!

https://youtu.be/QzjybHuCEoY

Offline Paulo_lumens

  • Hobby
  • ****
  • Posts: 269
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Charqueada-SP
Re:Tacômetro com PIC16F877A e controle de velocidade em motor AC
« Resposta #1 Online: 21 de Agosto de 2016, 09:35 »
Problema resolvido com a interferência do display.

Antes o disparo do triac estava dentro do main(), com isso se o programa estivesse executando a atualização do display e ocorresse uma interrupção externa ele lia a interrupção para depois voltar no display e continuar até o disparo, com isso ele falhava meia onda ou uma onda. O problema foi resolvido fazendo uma chamada para o disparo dentro da interrupção. segue parte do código resolvido. ps. o tempo de resposta do sistema tbm ficou mais rapido.
Código: [Selecionar]
//------------------------Disparo no triac-----------------------------------
void disparo()
{

     if(zc)
     {
     if(flag_ld)
     {
     if((v_rpm==0)&&(hz>=120))
     {
     tempo=54; //aplica 30% da potencia na saida
     }
for(m=0;m<tempo;m++)
{
delay_us(100);
}
output_high(pin_a0);
delay_us(200);
output_low(pin_a0);
}
zc=0;

      }
      return;
}
//----------------Interrupção externa pino RB0-----------------------------
#int_ext
void Trata_ac()

{
     if(INTF)               //testa registrador da interrupção externa
     {
     hz++;
     zc=1;
     INTF=0;    //zera registrador da interrupção externa para o próximo ciclo.
     }
     disparo(); //chama a rotina do disparo
}

//----------------------------fim interrupção externa------------------------

Offline Paulo_lumens

  • Hobby
  • ****
  • Posts: 269
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Charqueada-SP

 

/** * */