terça-feira, 11 de outubro de 2016

Controlador de RPM Motor AC 127V

Olá pessoal!
Neste projetinho foi usado um PIC16F877A, fazendo a leitura do rpm de um motor AC e corrigindo a velocidade com o chaveamento de um triac BTA12
No calculo para a correção foi usado o sistema de malha fechada e controle PI (proporcional e Integral).

segue um link do primeiro teste:



Suporte do Sensor óptico:

Confecção da Placa











Partes do código:


//------------------------Disparo no triac-----------------------------------
void disparo()
{

         if(zc)
         {
             if(flag_ld)
             {
                 if((v_rpm==0)&&(hz>=120))
                 {
                     tempo=54;                 //aplica 30% da potencia na saida
                     }
        if((tempo==5) &&(Sp>Pv))
        {
            output_high(pin_a0);
            }
            else
            {            
            for(m=0;m<tempo;m++)
            {
                delay_us(100);
                }
               
            output_high(pin_a0);
            delay_us(200);
            output_low(pin_a0);
            }
            }
            zc=0;
        RESTART_WDT();               
          }
          return;
}
//----------------Interrupção externa pino RB0-----------------------------
#int_ext
void Trata_ac()

{
     if(INTF)
     {
         hz++;
         zc=1;
         INTF=0;
         }
         disparo();
}

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

//---------------------trata RPM------------------------------------
void trata_rpm()
{
            if(input(pin_a1))                //ler pino RA0 se 1
            {
                if(flag_rpm)                    //testa flag1 se 1
                {
                rps++;                        //soma rpm +1
                flag_rpm=0;                    //seta flag1 em 0
                }
            }       
            if(!input(pin_a1))                //ler pino RA0 se 0
            {
            flag_rpm=1;                        //seta flag1 em 1
            }
return;
}
//------------------------Calculo ganho-----------------------------
void calcula(void)
{
        sp=set_rpm*60;                //carrega a variável sp para calculos
        pv=v_rpm;                    //carrega a variável pv para calculos
    if(sp>pv)                    // set_point maior que leitura de rpm
    {                            // a rotacao esta abaixo do valor desejado
    dv=sp-pv;                    //calcula o desvio entre set_point e rpm lido
    dv=dv/100;                    //divide por 100 segundos   
    mv=erro-(kp*(dv+(ki*dv)));    //calcula a diferença que será subtraida do tempo de disparo
    erro=mv*0.2;                //calcula o erro como taxa de amortecimento para o próximo semi-ciclo
    }
    if(sp<pv)                    // set_point menor que leitura de rpm
    {                            // a rotacao esta acima do valor desejado
    dv=pv-sp;                    //calcula o desvio entre set_point e rpm lido
    dv=dv/100;                    //divide por 100 segundos
    mv=erro+(kp*(dv+(ki*dv)));    //calcula a diferença que será somada ao tempo de disparo
    erro=mv*ta;                    //calcula o erro com taxa de amortecimento para o próximo semi-ciclo
    }
   

        tempo=tempo+mv;            //tempo de dsiparo atualizado
           
        if(tempo>80)tempo=tempo-mv;    //verifica a variável tempo se esta dentro dos limites de disparo
        if(tempo<5)
        {
            tempo=5;        //verifica a variável tempo se esta dentro dos limites de disparo
            if(sp>pv)                    // set_point maior que leitura de rpm
    {
        output_high(pin_a0);
        }   
           
           
            }
    return;
    }

    void main()
    {
   
       output_a(0x00);  
       output_b(0x00);
       output_c(0x00);
       output_d(0x00);
       output_e(0x00);
       SET_TRIS_a(0x0A);
       SET_TRIS_b(0x01);
       SET_TRIS_c(0x0C);
       SET_TRIS_d(0x00);
       SET_TRIS_e(0x00);
      
       setup_adc_ports(NO_ANALOGS);//libera portas para digital
       setup_adc(ADC_OFF);//desliga conversor ad
       setup_timer_1(T1_DISABLED);//desliga timer 1  
       setup_comparator(NC_NC_NC_NC);//desliga comparadores
       setup_vref(FALSE);//desliga vref    
       SETUP_CCP1(CCP_OFF);     //desliga comparador1
        SETUP_CCP2(CCP_OFF);        //desliga comparador2
        SETUP_PSP(PSP_DISABLED);    //desliga comunicação paralela
       
        INTF=0;
        INTE=1;
        GIE=1;
        tempo=79;
        set_rpm=100;
        flag_ld=0;
        kp=0.2;
        ki=0.1;
        ta=0.2;
        output_high(pin_b5);
       lcd_init();
       delay_ms(100);       
        lcd_putc('\f');
        lcd_gotoxy(1,1);
        printf(lcd_putc,"Dimmer Teste\b");       
        delay_ms(100);
trata_memoria();
        lcd_gotoxy(1,2);                                    //direciona display coluna 1 linha 1
        printf(lcd_putc,"SET RPM:%lu rpm\b",memoria_rpm*60);    //apresenta no display valor set_rpm
        delay_ms(800);      
         while(1)
        {
           

              
    if(hz>=120)                    //testa se ocorreu 120 pulsos entrada AC
    {
        v_rpm=(rps/2)*60;        //tranforma valor de rps em rpm para calculos
        if(v_rpm==set_rpm*60)    //testa se valor setado = valor lido RPM
        {
             tempo=tempo;        //tempo recebe tempo
       
        }
        led=!led;
        output_bit(pin_b5,led);
       
if(flag_ld)                        //verifica se flag liga desliga= ligado
{
           
    calcula();                       

    }      

        lcd_putc('\f');                                        //limpa display
        lcd_gotoxy(1,1);                                    //direciona display coluna 1 linha 1
        printf(lcd_putc,"SET RPM:%lu rpm\b",set_rpm*60);    //apresenta no display valor set_rpm
        lcd_gotoxy(1,2);                                    //direciona display coluna 1 linha 2
        printf(lcd_putc,"RPM:%lu Disparo:%lu\b",v_rpm,tempo);//apresenta no display valor v_rpm e tempo
        lcd_gotoxy(1,4);                                //direciona display coluna 1 linha 4
        printf(lcd_putc,"MV:%2.1f erro:%2.1f\b",mv,erro);//apresenta no display
                                                        //valor de mv e erro
   
               
        if(flag_ld)                        //testa flag liga/desliga
        {
        lcd_gotoxy(1,3);                //direciona display coluna 1 linha 3
        printf(lcd_putc,"Ligado\b");    //apresenta no display ligado
        output_high(pin_c0);           
            }
            else
        {
        lcd_gotoxy(1,3);                //direciona display coluna 1 linha 3
        printf(lcd_putc,"Desligado\b");    //apresenta no display desligado
        tempo=80;        //carrega variável tempo com "80"x100us=8ms
        mv=0;            //zera variável mv
        erro=0;            //zera variável erro
        output_low(pin_c0);
            }
           
        hz=0;            //zera variável para contagem dentro de 1 segundo
        rps=0;            //zera variável para contagem dentro de 1 segundo
        }
       
       
    testa_sw();            //chama função do teclado
    trata_rpm();        //chama função leitura RPM
    RESTART_WDT();
        }
     }
//-----------------------------------------------------------------------------------------


Esquemático em arquivo .PDF


Espero que esta postagem ajude aos colegas que estão pesquisando na net!
Se gostou deixe o seu comentário.


Um teste final controle instalado na CNC

13 comentários:

  1. Olá Paulo, como faço para ter acesso ao projeto completo? Abraços.

    ResponderExcluir
    Respostas
    1. Olá Lira Junior postado o diagrama elétrico..
      Inscreva-se no nosso canal do youtube.

      https://www.youtube.com/channel/UCd2Fv8_CoJu3yxm7A-K8JGQ

      Excluir
  2. massa mesmo o controlador da tupia, recomendo ter lista de materiais usados e o procedimento da montagem passo a passo ajuda bastante quem ta querendo fazer um desses.

    ResponderExcluir
  3. Olá Denis pelo diagrama esquemático dá para verificar todas os componentes usados, sugiro montar o esquema no Proteus e simular p/ ver o funcionamento.. e gerar a lista de material. Agradeço o interesse...

    ResponderExcluir
  4. Paulo parabéns pelo projeto, fiquei muito interessado, pois estou construindo uma cnc e isso ajudaria muito em ter um melhor acabamento e também usinar materiais mais duros, o código postado seria o suficiente para o funcionamento(sou muito ruim com programação)? minha tupia é igual a sua, porem sendo 220 volts, teria alguma alteração de projeto?

    ResponderExcluir
    Respostas
    1. Olá Fernando, obrigado pelo comentário, creio que a única alteração seja na entrada do transformador, afinal ele fornece a tensão de trabalho para a placa e a passagem pelo zero da senoide da rede, esse transformador que usei tem a opção 127/220 na entrada, estou usando no 127v, o resto trabalha na tensão da placa.

      Excluir
  5. Paulo Furlan poderia me passar o esquema e a pcb do eagle me ajudaria muito se caso nao pude vou entender muito obrigado!

    ResponderExcluir
  6. Olá DiDi, aconselho a você que, salve a imagem do esquemático e redesenhe conforme os componentes que vc tiver disponível, com isso vc terá uma boa noção da placa e poderá repara-la em qualquer circunstância! vc pode tbm montar o circuito no Proteus para simular o funcionamento..

    ResponderExcluir
  7. Olá Paulo, vc vende esse controle montado já?

    ResponderExcluir
  8. Ótimo projeto, gotaria de saber se há muita perca de torque conforme vai abaixando a velocidade?

    Obrigado

    ResponderExcluir
    Respostas
    1. Olá Wesley Rafael, sim há perda de torque sim quanto menor for a velocidade menor será o torque, este sistema é um "dimmer" eletrônico em malha fechada, resumindo se houver "travamento" o sensor de rotação sente e tenta recuperar injetando mais tensão no motor. não é igual aos inversores que mudam a frequência.. Grato pelo interesse.

      Excluir
    2. Se inscreva no meu canal do youtube..

      Excluir