Autor Tópico: Controle_PID_PIC18F2480  (Lida 16829 vezes)

Description:

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

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re: Controle_PID_PIC18F2480
« Resposta #15 Online: 01 de Novembro de 2010, 21:50 »
Recebeu a mensagem personalizada?

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re: Controle_PID_PIC18F2480
« Resposta #16 Online: 11 de Novembro de 2010, 22:51 »
Olá, posso enviar o código com algumas correções que eu fiz?

Grato

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Controle_PID_PIC18F2480
« Resposta #17 Online: 12 de Novembro de 2010, 00:46 »
Ola Vinícius,

Pode mandar seu programa. Já foi atualizado?

Abraços,

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re: Controle_PID_PIC18F2480
« Resposta #18 Online: 13 de Novembro de 2010, 02:46 »
Na verdade fiz pequenas atualizações, queria tirar um dúvida quanto ao anti-windup. Eu tinha feito na função setPWM mas acho que não viu. Acho que fica o mesmo efeito. Eu gostaria de saber se precisa add mais alguma coisa nesta função, tipo a questao do sentido da rotação do motor. Seria necessario duas portas configuradas para o PWM? uma para o lado + e outra para o -. Quanto aos valores de kp,kd e ki ainda não foram definidos pois meu orientador não me passou os dados da planta (resistencia,momento de inercia, coeficiente viscoso,...)

Grato

ps: Posso te enviar o código por onde?

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Controle_PID_PIC18F2480
« Resposta #19 Online: 13 de Novembro de 2010, 08:19 »
Vinicius,

Na verdade fiz pequenas atualizações, queria tirar um dúvida quanto ao anti-windup. Eu tinha feito na função setPWM mas acho que não viu. Acho que fica o mesmo efeito. Eu gostaria de saber se precisa add mais alguma coisa nesta função, tipo a questao do sentido da rotação do motor. Seria necessario duas portas configuradas para o PWM? uma para o lado + e outra para o -.

Basta um bit do PIC (uma saída PWM), onde o controle PWM associado ao controlador PID podem ser implementados com alguns cuidados:

Assumindo que, numa saída PWM:
(1) Ciclo de trabalho 5% - motor em máxima velocidade no sentido horário-CW (por exemplo)
(2) Ciclo de trabalho 50% - motor parado
(3) Ciclo de trabalho 95% - motor em máxima velocidade no sentido anti-horário-CCW

Isso é facilmente implementado usando uma ponte H de transistores comandando o motor.

O controlador PID:

(1) Em des-equilibrio (erro<0), tem: saída < 50% (motor rodando em CW)
(2) Em equilibrio (erro=0), tem: saída = 50% (motor parado)
(3) Em des-equilibrio (erro>0), tem: saída > 50% (motor rodando em CCW)


ps: Posso te enviar o código por onde?

Não sendo "secreto".... pode mandar nesse tópico, assim, mais pessoas podem acompanhar o assunto.

Senão..., pode mandar em PVT.

Abraços,

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #20 Online: 11 de Fevereiro de 2011, 23:24 »
Oi minilathe
No momento estou de ferias, aproveitei e trabalhei na sintonia do PID para calcular Kp e Kd com bases nas especificações. Queria testar o algoritmo no proteus, só que não ainda como. Também ainda não tenho de como escolher Ts. Queria realizar este teste no proteus.

Grato

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Controle_PID_PIC18F2480
« Resposta #21 Online: 12 de Fevereiro de 2011, 00:08 »
Olá Vinicius,

Para testar no Proteus é necessário desenhar um circuito, sugiro usar um potenciômetro que possa simular a entrada e monitorar a saída num osciloscópio.
 

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #22 Online: 21 de Fevereiro de 2011, 23:16 »
Vou tentar montar o circuito e entro em contato com vc?
Em relação ao algoritmo que desenvolvi foi para o PID em geral. Só que eu fiz o projeto para planta do motor CC um P&D com realimentação de Velocidade visto que a planta já contem um integrador e que o PD clássico acrescenta um zero (causando instabilidade).
Então precisarei ajustar um pouco o algoritmo por conta da mudança do sinal de controle.

//---- Principal---------
  while (true)
  {
      if(kbhit()) //verifica se tem um dado no buffer da Usart, espera receber 10 bits
      {
         
         setPoint = getc(); // recebe o valor do  buffer - recebe o byte mais significativo
         setPoint = (setPoint >> 8) + getc(); // recebe outro byte
         
      }
 
      set_adc_channel(0);
      delay_us(20);
      actual_position = read_adc();
     
      //printf("A Posicao atual e: %Ld\r\n",actual_position);
      //printf("A Saida atual e: %Ld\r\n", control);
     
      error = setPoint - actual_position;
      integral = integral + erro*Ts;
      derivative = (error - previous_error)/Ts;
      control = Kp*error + Ki*integral + Kd*derivative + control; (Terei que mudar esta linha)
     // para control = Kp*error - Kd*derivative + control;
      previous_error = error
     
      setPWM(control); // envia para saída PWM a posicao controlada
     
      delay_us(Ts);
     
  }
Concorda?

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Controle_PID_PIC18F2480
« Resposta #23 Online: 22 de Fevereiro de 2011, 11:23 »
Vinicius,

Pelo que entendi, seu controlador atuará como controlador mestre de um segundo controlador (arranjo tipo cascata)?

O seu algoritmo PID precisa algumas melhorias:
(1) Falta uma limitação da ação integral, para que esta não passe de 100%  ou vá abaixo de 0% na escala de saída
(2) Implemente uma escala consistente de saída do PID, do tipo 0 a 100%
(3) É necessário compatibilizar a saída com o sinal de entrada de comando do PWM, para que a coisa funcione, ou seja, 100% de saída do PID corresponda a 100% do PWM e o mesmo com o 0%.
(4) Qual a frequência de execução do seu PID? Ts?
(5) Ao interromper o laço de controle para ler o SP, ocorre uma descontinuidade no controle, que pode não ser nada grave, mas causa uma interrupção de sua execução, ocasionando instabilidades no controle. Melhor seria fazer a comunicação de maneira concorrente com o controle, usando interrupções. Ou escalonamento de tempo, uma fatia fixa do tempo (período do Scan Time - Ts) para comunicar, a outra para controlar.
« Última modificação: 22 de Fevereiro de 2011, 11:28 por minilathe »

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #24 Online: 22 de Fevereiro de 2011, 20:05 »
Obrigado por responder,
Em relação a configuração do P&D está no anexo da mensagem anterior.
Em relação as melhorias:

(1) Não vou usar o integrador (Ki) pois a planta já a contém. Por isso somente o proporcional e derivativo.
(2)(3) Vc fala quando uso o setPWM? Se sim, esta acho que já faz isto.
(4) Isso ainda realmente escolhir, não conseguir achar algum material para q eu possa tomar uma decisão. Por enquanto o valor seria escolhido empiricamente.
(5) Concordo com vc mas por enquanto queria resolver os problemas anteriores para depois verificar se esta questao vai interferir (muito) ou não no resultado.
Em relação a linha //control = Kp*error + Ki*integral + Kd*derivative + control; (Terei que mudar esta linha).
Concorda que seria atualmente control = (Kp*error) - (kd*derivative*control) + control; ?

Posso te mandar o código completo.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Controle_PID_PIC18F2480
« Resposta #25 Online: 23 de Fevereiro de 2011, 06:55 »
(1) Não vou usar o integrador (Ki) pois a planta já a contém. Por isso somente o proporcional e derivativo.

Precisa da ação derivativa? O que seria "a planta"?

(4) Isso ainda realmente escolhir, não conseguir achar algum material para q eu possa tomar uma decisão. Por enquanto o valor seria escolhido empiricamente.

Deve ser escolhido em função da velocidade de resposta do seu sistema a ser controlado (sua planta??)

(Em relação a linha //control = Kp*error + Ki*integral + Kd*derivative + control; (Terei que mudar esta linha).
Concorda que seria atualmente control = (Kp*error) - (kd*derivative*control) + control; ?

Posso te mandar o código completo.

A linha esta correta.

Ok.


Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #26 Online: 04 de Março de 2011, 21:36 »
(1) A planta é um Motor CC, onde a função de transferencia é a posição em relacao a tensao.
(4) Como assim? Em função da velocidade de resposta do seu sistema?.

Obrigado pela ajuda!

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #27 Online: 03 de Abril de 2011, 09:43 »
[Ts] Como assim? Em função da velocidade de resposta do seu sistema?.
Já trabalhou com comunicação usb? No momento estou utilizando o protocolo CDC (emula a serial).


Grato

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Controle_PID_PIC18F2480
« Resposta #28 Online: 03 de Abril de 2011, 12:20 »
Vinicius,

[Ts] Como assim? Em função da velocidade de resposta do seu sistema?.

Todo sistema físico / químico, ... possui um tempo de reação. De modo que, se você aplicar um degrau na variável manipulada, a variável controlada variará com uma certa curva de reação. Dessa curva, é possível determinar o tempo de reação do sistema.

Tomando como premissa o que você disse, que seu motor já possui um controlador de posição, ou seja, é um sistema onde a posição varia com a tensão, conforme você disse.
 
Nesse caso, imaginemos que o controlador do seu motor opera com um sinal de  0 a 10V e a carga movida está numa determinada posição. Ao aplicar +10V, a posição de seu motor muda ao longo do tempo até atingir a posição correspondente a 10V. Medindo o tempo que o motor leva de uma posição até a outra dá uma noção do tempo de reação do seu sistema.

O seu sistema de controle mestre, que vai comandar o controle de posição do motor, deverá ter um tempo de varredura (Ts) no máximo a metade do tempo determinado acima.

 
Já trabalhou com comunicação usb? No momento estou utilizando o protocolo CDC (emula a serial).

Ainda não, no microcontrolador diretamente, mas já usei conversores USB/Serial com microcontroladores. Atente que em muitas aplicações o pessoal usa a interface USB como se fosse uma porta serial RS-232, inclusive limitada a 115 kbps, devido ao tipo de driver disponível no PC.  Nesse caso, não vejo vantagem, a não ser economizar num conversor. Acho que o esforço vale a pena se for trabalhar num modo mais rápido da USB, aí a velocidade vai para a casa dos Mega bps e requer drivers de USB especiais do lado do PC.

Mas é necessário avaliar se é necessário partir para uma comunicação USB rápida. Uma porta RS232 operando a 115 kbps envia ou recebe 10 bits (1 start + 8 data bits + 1 stop) em 87 micro segundos,  Se o programa for bem planejado, é possível fazer o ciclo de leitura, processamento e escrita em centenas de microsegundos, que poderia ser mais que suficiente para a sua aplicação.
« Última modificação: 03 de Abril de 2011, 12:23 por minilathe »

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #29 Online: 03 de Abril de 2011, 18:13 »
Obrigado pela resposta.
Acho que entendi a questão do tempo de amostragem.

Fiz um teste ake em casa pra testar a comunicação usb entre o micro e software (em java). A leitura por parte do software funcionou (apesar de oscilar um pouco ante de se estabilizar) mas a recepção por parte do micro não funcionou adequadamente. Não sei ainda ao certo se o erro está por parte do metodo de enviar do software ou de recepção do micro. No momento estou enviando o dado numerico como string. No micro capturo como string e converto para long.
No micro estou fzd da seguinte forma: Parte de recepção
===== Rs232 normal
 if(kbhit()){     
               gets(setPoint);
               setPointt = atol(setPoint);
         }
======================= Usb CDC
//if(usb_cdc_kbhit()) //verifica se tem um dado no buffer da Usart, espera receber 10 bits
        //    {
         
               //setPoint = usb_cdc_getc(); // recebe o valor do  buffer - recebe o byte mais significativo
               //setPoint = (setPoint >> 8) + usb_cdc_getc(); // recebe outro byte

               //setPoint = get_long(); //Deu erro de compilação
               //setPoint = get_float_usb(); // Deu erro de compilação

               //setPoint = getc(); // recebe o valor do  buffer - recebe o byte mais significativo
               //setPoint = (setPoint >> 8) + getc(); // recebe outro byte
       

            //} 

 

/** * */