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
Olá Paulo, como faço para ter acesso ao projeto completo? Abraços.
ResponderExcluirOlá Lira Junior postado o diagrama elétrico..
ExcluirInscreva-se no nosso canal do youtube.
https://www.youtube.com/channel/UCd2Fv8_CoJu3yxm7A-K8JGQ
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.
ResponderExcluirOlá 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...
ResponderExcluirPaulo 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?
ResponderExcluirOlá 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.
ExcluirPaulo Furlan poderia me passar o esquema e a pcb do eagle me ajudaria muito se caso nao pude vou entender muito obrigado!
ResponderExcluirOlá 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..
ResponderExcluirOlá Paulo, vc vende esse controle montado já?
ResponderExcluirAté posso montar um para venda...
ExcluirÓtimo projeto, gotaria de saber se há muita perca de torque conforme vai abaixando a velocidade?
ResponderExcluirObrigado
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.
ExcluirSe inscreva no meu canal do youtube..
Excluir