Página 1 de 1

Rotinas em "C" para controle PI de temperatura

MensagemEnviado: 12 Jan 2007 10:10
por neovet
Prezados colegas, sou novo aqui no forum e gostaria de saber como escrevo em "C" no compilador PCWH uma rotina de controle PI de temperatura...Já calculei os ganhos Kp e Ki do controle...

Preciso urgênte saber. Conto com a colaboração dos colegas!

MensagemEnviado: 13 Jan 2007 07:25
por MOR_AL
OLá neovet.
A sua equação (no domínio da frequência) não seria?

H(s) = kp + ki /(s/a + 1)?

Que fazendo a transformada inversa de Laplace (no domínio do tempo) daria:

h(t) = kp Uo(t) + ki exp (- t/a)

Esta equação é que teria de ser implementada no seu programa.

Outra solução, e que é a mais apropriada para ser resolvida com circuitos digitais, utiliza a transformada z, em que a função (temperatura) é amostrada em pequenos intervalos de tempo e a equação da sua função de transferência é composta por um somatório de valores obtidos com as parcelas amostradas no conversor AD e deslocadas umas em relação às outras. Muito mais eficiente (rápido).

Já estou um pouco enferrujado no assunto, mas na internet tem até e-books disponíveis sobre transformada z, alguns grátis.

Este é apenas um pontapé inicial no sentido certo. Eu teria que relembrar (estudar) para poder continuar daqui. O assunto é interessante e vale a pena.

Boa sorte

MOR_AL

MensagemEnviado: 13 Jan 2007 16:10
por ÁgioFelipe
MOR_AL: Vc é da área de controle?

MensagemEnviado: 13 Jan 2007 22:41
por MOR_AL
Caro ÁgioFelipe.

Trabalhei com controle. Minha área de atuação era eletrônica analógica. Agora, aposentado, brinco com o PIC.

Sabe como é ... os eletrons ainda passeiam pela minha corrente sanguínea.

MOR_AL

Primeiro código do controle PI...será que funciona?

MensagemEnviado: 14 Jan 2007 14:46
por neovet
Caro MOR_AL, muito obrigado pelas dicas.....O que você acha do código abaixo?

erro = PV - SP;

P = erro * Kp;

if(P >= 1023)
P = 1023;
if(P <= -1023)
P = -1023;

I_atual = I_anterior + Ki * (erro + erro_anterior);

if(I_atual >= 1023)
I_atual = 1023;
if(I_atual <= -1023)
I_atual = -1023;

PI = P + I_atual;

if(PI >= 1023)
PI = 1023;
if(PI <= 0)
PI = 0;

erro_anterior = erro;
I_anterior = I_atual;

MV = (long int)PI;

set_pwm1_duty(MV);

MensagemEnviado: 14 Jan 2007 17:39
por MOR_AL
Caro neovet.

Vamos por partes. Considerarei mais como um pseudo-código ok?:

1 – Faltou definir PV e SP.

a) De onde eles vem?
b) Quais são suas dimensões? Acho que deve ser corrente porque uma das parcelas do “erro” é I_anterior certo? Caso seja, está em Amperes, mA? Qual é a relação entre SP e PV com a corrente? Como eles interagem com seu sistema?

2 – Observando a equação de PI, acredito que seu sistema seja algo assim:
http://rapidshare.com/files/11718658/Re ... 4.JPG.html

a) O que há no bloco “?” ?
b) De onde surgiu a equação de PI?
c) Porque I_anterior não está sendo multiplicado nem por kp e nem por ki?

3 – Porque você simplesmente eliminou os possíveis valores negativos de PI? Não seria mais plausível considerar toda a excursão de PI e acomodá-la entre 0 e 1023? O mesmo não seria válido para I_atual e P?

Estas são as minhas dúvidas. Mesmo assim estou acostumado com circuitos analógicos. Como lhe falei, preferiria estudar transformada z para usar em um sistema digital.

Boa sorte.

MOR_AL

ps. Como faço para aparecer a figura na mensagem?

MensagemEnviado: 15 Jan 2007 12:18
por neovet
Ok MOR_Al...vou explicar melhor o meu projeto.

Estou usando um microcontroledor PIC18F452 para digitalizar um sinal analógico de 0 ~ 5V vindo de um circuito usando PT100. A intenção é mostrar a temperatura no display e fazer o controle de uma resitência e um refrigerador. Quando a temperatura for maior que SP ele controla o refrigerador e quando for menor ele controla a resistência....certo?

O A/D interno do PIC tem 10 bits (0 ~ 1023) de resolução.

Já estou escrevendo no display a temperatura 0V = -10ºC e 5V = +40ºC, falta agora fazer o controle da planta usando o PI.

Este código escrevi somente para iniciar uma discução....já baixei algumas apostilas e estou estudando, mas sou novo no assunto de controle digital...

MensagemEnviado: 15 Jan 2007 18:57
por MOR_AL
neovet.

Eu acho que a primeira coisa a saber é:
1 - Medir a temperatura atual (Tatual).
2 - Ligar o resistor por um período T1.
3 - Monitorar o acrécimo de temperatura em função do tempo.
Aguarde a temperatura baixar para a ambiente.
4 - Medir a temperatura atual (Tatual).
5 - Ligar o refrigerador por um período T2.
6 - Monitorar o acrécimo de temperatura em função do tempo.

Agora você sabe que para aumentar a temperatura em tantos graus precisa ligar a corrente por um período T1. E para reduzir a temperatura em tantos graus, precisa acionar o refrigerador por um período T2.
Faça diversas medidas com períodos diferentes ( com fatores de 2) e monte uma tabela.

Aplique calor ou frio (durante o período obtido na tabela) em função da diferença de temperatura desejada. A sua taxa será variável, equivalente ao período da tabela. Poderá atualizar o seu sistema cada vez após o período aplicado. Isso garante que a temperatura não formará um "overshoot".
Com isso você foge da transformada z, de circuitos de controle complicados e de PWM. Aliás você não poderá usar PWM em um refrigerador normal né? Não é o ótimo, mas é bom e seu sistema fica pronto mais rápido.

MOR_AL

MensagemEnviado: 15 Jan 2007 22:26
por Haroldo Coelho
NEOVET, tem exemplo de PID no site da MICROCHIP. Um exemplo é a AN 937.

Dá uma olhada.