Bem, eu desenhei um malha teórica e uma malha "prática" para desenvolver o sistema do forno:
A malha teórica não tem nada de mais, é a clássica realimentação e controle proporcional.
O forno, poderia ser modelado como um sistema de primeira ordem 1/(s+a), para a temperatura, em relação a uma fonte de calor constante. Para um degrau unitário de tensão, a resposta seguiria uma exponencial, igual a carga de um capacitor em um circuito RC série:
Ao aplicar a tensão máxima, alguma hora a temperatura estabilizaria em algum valor e seria possível, utilizando um cronômetro, encontrar a constante de tempo do seu forninho além do "ganho" presente (100v -> 250ºC = 2,5ºC/V)
Isso apenas de forma "didática" para simular a resposta por algum software (matlab, simulink, ou o free scilab).
A malha prática seria o circuito que seria necessário para implementar esse sistema.
Temos um potenciômetro que varia o set point (0 a 3v3) sendo convertido esse valor no ADC1 de 12 bits. Pode-se perceber que os cálculos internos serão todos em relação a escala de 0 a 4096 por uma questão de comodidade, mas nada impede de você utilizar outras escalas.
O Kadc = 4095/3,3 = 1240,9 passos/v
O ganho do controlador é somente o "Kp" que será multiplicado pelo sinal de erro:
Error_Signal = (ADC1_value - ADC2_value) * Kp;
Esse sinal de erro deverá ser inserido na escala correta do PWM, que seria de 0 a 100%:
PWM_Signal = 100*Error_Signal / 4095;
Então o PWM seria acionado, gerando uma tensão (e não potência, atente para o fator quadrático já explicado pelo Renato!) que seria proporcional ao sinal de erro.
Logicamente, você poderia aplicar o fator quadrático para transformar todo a malha em uma malha de potência, elevando o sinal de erro ao quadrado:
Error_Signal_power = Error_Signal * Error_Signal;
E então:
PWM_Signal_power = 100*Error_Signal_power / 4095;
Esse sinal seria aplicado ao forninho e teríamos a elevação da temperatura.
Na parte de realimentação, eu exemplifiquei um sensor linear de 0 a 12v para uma temperatura de 0 a 240ºC. Ou seja, Ks = 0,05 V/ºC. Essa escala não poderia ser aplicada diretamente no microcontrolador (12v queimaria o ADC), então é necessário um divisor de tensão de 3,3/12 = 0,275.
Então Kdiv = 0,275 V/V.
O coeficiente teórico geral do sensor então seria:
Kgeral = Ks*Kv
Kgeral =0,1375 V/ºC
Que é convertido novamente na escala de 0 a 4095 pelo ADC2, fechando a malha.
Bem, esse foi um exemplo mais prático. Atente para o fato da mudança dos seus componentes e valores. Esses K calculados são apenas de efeito didático para uma simulação e você observar o resultado na tela nas escalas corretas.
Desculpe pelo rascunho feito a mão, mas acho que dá para entender.
Outros problemas que você pode ter é a saturação da sua malha com ganhos elevados, tanto em relação ao PWM (que é apenas de 0 a 100%) com nos valores internos que irá depender unicamente do tipo de dado que você está usando (um int 32 terá uma resolução muito melhor que um int 16).
Em relação ao PID com o termo integral e derivativo, você pode tanto adicionar os termos em série como em paralelo ao Kp. Como no caso real, onde indutores e capacitores são armazenadores de energia, você também precisará "armazenar" os dados para o cálculo dos termos com um buffer de memória.
sistem_control_loop (Error_Data,...)
{
static previous_Error_Data;
k
d
(moderador, peço que me suspenda do fórum) = (Error_Data - previous_Error_Data);
Ki = (Error_Data + previous_Error_Data);
...
(código)
...
previous_Error_Data= Error_Data ;
}
Mas ai aparecem outros problemas como a escala que deverá ser positiva e negativa (sem offset) e o tempo entre uma amostra e a amostra anterior ser imprescindível para o cálculo correto... Além de ruídos no termo derivativo e saturação do termo integrativo (que devem ser tratados por outras linhas de código, como filtragens e zerar o acumulador depois de n ciclos de loop).
Enfim! Ai já é outra conversa.......
Abaixo um link muito interessante (e em português sobre o assunto) vale muito a pena ler.
http://www.embarcados.com.br/controlador-pid-digital-uma-modelagem-pratica-para-microcontroladores-parte-1/ Um abração!
Eduardo