Autor Tópico: Controle_PID_PIC18F2480  (Lida 16815 vezes)

Description:

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

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 #30 Online: 03 de Abril de 2011, 20:53 »
Vinicius,

Eu tentaria primeiramente usar um programa emulador de terminal antes, para ver se a comunicação com o microcontrolador está ok, usando caracteres ASCII. Ex.: Hyperterminal, Tera Term, ... E depois fazer o seu programa em Java.

Eu já fiz vários programas de comunicação usando Python (RS232, TCP/IP, Modbus-RTU, ...), é simples e funciona bem. Há uma biblioteca chamada PySerial que funciona muito bem e permite escrever programas simples e funcionais, de maneira portável (Linux, Windows,...), assim como o Java. Já programei em Java, mas hoje prefiro o Python.

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #31 Online: 04 de Abril de 2011, 12:19 »
No momento estou testando a parte de recepção do micro. Utilizei o software Advanced Serial Port Terminal. E tentei enviar uma string mas não aconteceu nada. Gostaria de saber se o código que postei anteriormente está com algum problema?.

Obrigado

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 #32 Online: 04 de Abril de 2011, 16:04 »
Poderia enviar todo o seu código? O pedaço que enviou não permite verificar se está tudo correto.

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #33 Online: 04 de Abril de 2011, 19:00 »
Claro que posso! Segue em anexo. Este código é de outro projeto meu (que deu certo) por isso estou testando a comunicação nele.

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 #34 Online: 04 de Abril de 2011, 23:34 »
Acho que falta a parte do RS232....

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #35 Online: 05 de Abril de 2011, 23:34 »
Qual parte?
Eu coloquei a #use rs232...

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 #36 Online: 06 de Abril de 2011, 01:04 »
O use é uma inicialização da porta apenas. Onde estão os comandos de leitura, escrita, ...?

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #37 Online: 06 de Abril de 2011, 01:13 »
A escrita:
 printf(usb_cdc_putc," %f\r\n",temp_medio); (Consigo enviar normalmente)

A Leitura:
Com usb cdc (emula serial) e normal.  Está comentados algumas linhas devido aos testes.

if(usb_cdc_kbhit()) //verifica se tem um dado no buffer da Usart, espera receber 10 bits
           {
         
               //setPointt = usb_cdc_getc(); // recebe o valor do  buffer - recebe o byte mais significativo
               //setPointt = (setPointt >> 8) + usb_cdc_getc(); // recebe outro byte
               setPointt = get_long();
               //setPoint = get_float_usb();
               //setPoint = getc(); // recebe o valor do  buffer - recebe o byte mais significativo
               //setPoint = (setPoint >> 8) + getc(); // recebe outro byte

         //if(kbhit()== true){     
               //gets(setPoint);
               output_high(pin_b0);
               //setPointt = atol(setPoint);
               //setPointt = getc(); // recebe o valor do  buffer - recebe o byte mais significativo
               //setPointt = (setPointt >> 8) + getc(); // recebe outro byte
               //setPointt = get_long();
         }
            //}

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 #38 Online: 06 de Abril de 2011, 06:24 »
O que parece não funcionar, ou não estar sendo usado corretamente, é a função kbhit().

Faça um programa bem simples, sem kbhit(), que apenas envia e recebe pela UART, do tipo:

int      c;

while( TRUE ) {
     c = getchar();
     putchar( c );
}

ou então:

char     c;

while( TRUE ) {
     c = getch();
     putch( c );
}

Note que a função kbhit não é padronizada (não é ANSI C), portanto o uso e o comportamento desta devem ser entendidos na leitura do manual do seu compilador. Existem outras funções de entrada, getc(), getcUART() e getch(), algumas não padronizadas, que leem da UART e podem ser avaliadas. Entender o que o compilador faz é essencial nesse caso.

Qual é o seu compilador?


Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #39 Online: 06 de Abril de 2011, 12:40 »
O compilador é o CCS.
Essas funções que estou utilizando são do CCS (Kbhit, getc,...)

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 #40 Online: 06 de Abril de 2011, 14:24 »
Tente os programas que eu sugeri.

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #41 Online: 21 de Abril de 2011, 14:34 »
Ok ! Vou testar...
e dou um retorno

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #42 Online: 27 de Abril de 2011, 01:17 »
Testei seu exemplo e deu certo. Conseguir adequar (receber uma string) para usb também. Utilizei o hyperterminal, vou utilizar agora como teste o software em java. Dando certo, vou colocar a comunicação no firmware do projeto (controle do motor) para enfim realizar os testes "finais".
Qualquer dúvida ou sucesso postarei ake.

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 #43 Online: 27 de Abril de 2011, 04:34 »
Ok.

Offline vinigusto

  • Novato
  • *
  • Posts: 45
  • Sexo: Masculino
  • GUIA-CNC
Re:Controle_PID_PIC18F2480
« Resposta #44 Online: 01 de Maio de 2011, 19:20 »
Oi amigo,
descobrir um erro no algoritmo do controlador PD por realimentação de velocidade, pois

o sinal de controle do PD clássico é u(t) = Kp*erro+ Kd*de(t)/dt,
onde derivada = (erro-erro_anterior)/Ts

só que o sinal de controle do PD por realimentação de velocidade é u(t) = Kp*erro -  kd*dy(t)/dt
onde y(t) é a saída.
então o algoritmo certo seria:

erro = setPoint - actualPosition(lido do adc);
derivative = (actualPosition - previous_actualPosi tion)/Ts;
control = kp*error -  Kd*derivative + control;
previous_actualPosi tion = actualPosition;

correto?

Fiz o teste com o Proteus e com software supervisorio e pude verificar que o software não estar enviando corretamente. Vou tentar consertar.

grato
« Última modificação: 01 de Maio de 2011, 19:26 por vinigusto »

 

/** * */