pid

Circuitos eletrônicos, topologias, diagramas elétricos, etc...

Moderadores: 51, Renie, gpenga

pid

Mensagempor styg » 16 Set 2010 14:59

o que acham desse codigo aí para um simples controlador PID?

Imagem

O autor diz que funciona bem para a maioria dos casos, o meu caso é para o aquecimento de uma resistência.

O código deve ser usado assim:

Imagem

Como nunca mexi com isso, não entendi direito, por exemplo:

1- leio meu ad, vamos supor que me de 100°C
2- eu quero 200°C então mando para essa função o erro (200-100), e a posição atual (100)
3 - blz, a função calcula os ganhos
4 - ela retorna um número 700, e aí, o que faço com esse número? sei lá acho q tá faltando alguma peça do quebra-cabeça...
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor Francesco » 16 Set 2010 16:25

Imagina isso como um loop infinito...
O resultado fica algo assim:

Imagem

E quando bem sintonizado, algo assim:

Imagem


Dá uma olhada no PID que eu fiz a alguns anos:
http://www.epopeiaeletronica.com/v3/index.php?option=com_content&view=category&id=56&Itemid=84

Francesco
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor Djalma Toledo Rodrigues » 16 Set 2010 16:46

IGain ?
DGain ?

No PID só Proporcional tem Ganho

Integrador tem é Velocidade de Integração o que é diferente.

Vale o mesmo para o Derivativo.

E é por essas e outras que o Controlador Analógico , com seu Subtrator, Integrador etc.
etc. Seu somador ...
tem melhor desempenho.

(Não é culpa do µC, rs)

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor styg » 16 Set 2010 17:43

francesco, no teu projeto também usas um fator multiplicativo para o P, o I, e o D, como nesse código aqui.

o que eu não entendi bem, é: quais os dados entram nessa função, e quais dados saem
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor enigmabox » 17 Set 2010 07:35

Outra dica, na prática, dependendo da aplicação, somente uma resolução de 8 bits é pouco.
Por exemplo, para PID com acionamento de motores, fica bom com resolução acima de 12bits e o sistema eletronico de calculo deve ser rapido, pois se houver lentidão, poderá ocasionar uma falsa integração do PID.
Em alguns PIDs digitais que usei, quando havia um erro a ser corrigido, entre o valor Real e valor Offset, o sistema não corrigia de imediato esta diferença de valores, usando mais proporcional e integral do que derivada para corrigir o erro, pois se corrige imediato o valor, o sistema pode entrar em oscilação. Isso é mais ou menos na prática, do que se vê entre os dois graficos postados pelo Francesco.
Francesco legal o seu projeto, li tambem um artigo similar que saiu na Elektor onde usavam um sistema de PID para controlar uma esfera.
Já trabalhei com sistemas analogicos de PID e digo que são mais faceis de usar, para simular um sistema analogico atraves de digital este tem que ser bem feito, senão fica pior que um analogico. Hoje trabalho com sistemas digitais com controle PID para impressão grafica, viscosidade e temperatura.
enigmabox
 

Mensagempor MOR_AL » 17 Set 2010 09:04

Olá styg! Tudo bem?
Não sei se vai lhe ajudar.
Fiz um pequeno tutorial, escrito de forma simples, que mostra os princípios da realimentação em sistemas.
Acho que este seria o primeiro passo para entender do assunto.
Dê uma lida no arquivo a seguir.

http://www.datafilehost.com/download-2549d95c.html

MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor styg » 18 Set 2010 20:21

mor_al eu li esse seu documento e gostei, realmente bem didático.

o que eu nao to conseguindo é como que o controle é aplicado no programa.

vou dar um exemplo:

minha temp atual é 40°C, estou com meu pwm em 20%
eu quero 100°C, então meu erro é de +60°C

ai mando pra função a temp atual 40°C, e a requerida, 100°C

daí a função me devolve um valor nada a ver, tipo, 300.

o que eu faço com isso? porque nao posso jogar direto no pwm.

entenderam qual o x da questao?
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor MOR_AL » 18 Set 2010 22:04

Bom.
Primeiramente o uC não reconhece temperatura (100ºC, 40ºC, etc.).
O uC reconhece valor do byte (vamos supor que sua variável está representada em um byte).
Então os 40ºC, depois de ser convertido no CAD, vai valer (por ex.) 80 (em 256 valores), e os 100ºC vai valer 200.
Aí você quer achar o ERRO. Você não pode ter um valor negativo em um byte, já que você considerou isso em algum instante do projeto.
Então, para saber qual é o erro, ou a diferença entre os dois valores, você primeiro tem que saber qual é o sinal que a operação de subração vai dar. Como o valor DESEJADO é de 100ºC, que o uC identifica como 200, e o valor MEDIDO é 40º, que o uC identifica como 80, a diferença
valor DESEJADO menos valor MEDIDO vai dar positivo 200 - 80 = 120
Se o valor DESEJADO fosse MENOR que o valor MEDIDO, a diferença daria negativa.
Portanto, primeiramente você TEM que identificar qual será o sinal do resultado. Você faz isso fácil fácil, tanto em assembler como em outra linguagem de um nível um pouco maior.
Não vou entrar na questão do controle PID. Vou só procurar fazer você entender o processo.
Após identificar o sinal.
Se for positivo, significa que DESEJADO é maior que o MEDIDO. Logo você tem que AUMENTAR o valor MEDIDO, aumentando o período Ton (caso de um PWM)
Se for negativo, significa que DESEJADO é menor que o MEDIDO. Logo você tem que DIMINUIR o valor MEDIDO, diminuindo o período Ton (caso de um PWM).
O sinal referente a esse ERRO vai indicar se o Ton vai aumentar ou diminuir.
Mas, de quanto?
Bom, aí é que começa a ter que analisar a rapidez com que já está se aproximando de um erro nulo.
Imagine uma locomotiva a 100 km/h e a 300 m da parada. Apesar de ainda não ter chegado, você sabe que TEM que diminuir. Você usou uma realimentação via observação e aciona o controle da locomotiva, sabendo que tem que frear.
Agora imagine que você está em um velocípede, a 100km/h e tem que parar na mesma distância de 300m. Hora a massa total agora é muito menor. Provavelmente, se você não pedalar mais nem vai chegar aos 300m que faltam.
Aí é que entra o controle PID.
Ele leva em consideração a distância , a velocidade e a aceleração, para chegar ao final dos 300 metros com velocidade zero.
Como você normalmente não sabe quanto acelerar, nem frear, ou manter a velocidade, e quando deve isso acontecer, aí você tem que ajustar os coeficientes do seu PID. O kp, o ki e o kd.
Existem métodos para isso.
Repare que em alguns casos, por algum motivo, você não pode fazer esse ajuste em tempo real. Aí tem que conhecer a física envolvida em cada bloco do seu sistema, tais como a massa do que está sendo movimentada, a força (o momento) que o motor possui, a capacidade do freio, o atrito envolvido, etc. Conhecendo isso, você pode calcular os valores de kp, ki e kd. Não é simples.
Voltando aos bits do uC.
Você sabe que o ERRO encontrado (módulo e sinal), sozinho não diz muita coisa. Olha o exemplo do trem e do velocípede, onde o erro é o mesmo e a atitude é diferente.
Você tem que saber também se o erro (de velocidade, no exemplo do trem) está aumentando ou diminuindo e de que valor. Isso é responsável pelo kd (que multiplica a derivada da velocidade).
O ERRO é a própria velocidade. Kp multiplica esse erro.
Mas e a posição (os 300 metros que faltam para chegar)?
Para saber a posição, você deve multiplicar a velocidade pelo tempo (dá a distância percorrida). Integrar cada distância. Ao final, se você for somando cada distância, ela tem que coincidir com os 300 metros, com velocidade nula e aceleração nula também (trem parado na estação).
Repare que se o seu controle atuar sobre o período Ton de um PWM, por exemplo, a única informação que ele recebe (o PWM) é qual o Ton. O uC não sabe o que é velocidade, aceleração, posição, temperatura, etc. Ele apenas sabe que o Ton pode possuir 256 valores (8 bits).
Mas então para que os K's todos? Os K's servem para informar qual deverá ser o próximo valor de Ton, baseado no erro e sua variação.
O valor do próximo Ton (entre 0 e 255), é função de cada k, do erro, de sua variação e do valor final. Ton(seguinte) = kp*erro(atual) + ki*somatório dos erros anteriores + kd*variação do erro(atual). Essa expressão tem que ter um resultado entre 0 e 255.
Certa vez, há cerca de um ano, eu fiz um controle simples de uma impressora. Até cheguei a montar um filmezinho no YouTube.
O controle era bem simples. "Se faltar, avance. Se passar, volte".
Não me preocupei com o PID, e até que não ficou ruim não.
Terminando.
Repare que o que você exemplificou, que a temperatura desejada era de 100ºC e a medida era de 40ºC, corresponde a um degrau de 60ºC de temperatura.
Se o seu sistema for correto, a temperatura desejada será alcançada em um tempo menor possível e sem passar dos 100ºC.
Isso é que um controle PID faz. Observe as duas figuras do Francesco.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor RobL » 19 Set 2010 12:33

minha temp atual é 40°C, estou com meu pwm em 20%
eu quero 100°C, então meu erro é de +60°C

ai mando pra função a temp atual 40°C, e a requerida, 100°C

daí a função me devolve um valor nada a ver, tipo, 300.

o que eu faço com isso? porque nao posso jogar direto no pwm.

entenderam qual o x da questao?


Isso aí, o seu PWM tem que entender o que significa suas 300 unidades e converter isto em um Ton (aumentar potência) de forma a diminuir o erro.
Aí vai verificar a saída novamente, suponha deu algo menor que 300, Ton foi reduzido...
Portanto tem que ter um função similar a pwm = f (K*erro) no programa que faça a tradução das n unidades em potência ("mais vapor") e menos potência a medida que se aproxima do setpoint.

O programa é isso mesmo, mede a saída compara com o setpoint traduz a diferença em uma unidade U, que aplicada a um hardware faça a correção do erro (no exemplo variação do Ton "potência") e fica neste looping.

Sugestão: Faça um controle somente proporcional inicialmente, esqueça o resto, por exemplo, use o escrito pelo MorAl e o Francesco, mas use somente a parte proporcional.
Depois vai para a parte integral, se necessário, pois vai depender da exatidão requerida. A maioria das aplicações podem ser resolvidas somente com o ajuste da parte proporcional.
Conforme aplicação, talvez nem precise da diferencial.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor styg » 20 Set 2010 09:50

mor_al, excelente!

valeu robl!

vou ver se consigo fazer funcionar com essas informações e posto aqui o resultado.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.


Voltar para Circuitos Diversos

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes

x