Arduino - Modulação de potência

Pessoal preciso de ajuda,saber se estou certo.
Estou usando o arduino, e bolando um controle preditivo..., de perceber a tendência e desvio da variavel controlada e efetuar, a correção modulação. Isto tudo sem parametros de ganhos e ajustes;
Qual opinião do codigo, algo melhorar, há outra maneira mais eficaz?
Função preditivo -Faz a media das leituras e atribui um valor a varivel decordo com amplitude do desvio
Função regula - Recebe o valor de desvio e altera o valor da frequencia ou duty cycle
Função modulacao - Gera o PWM
Temos o PWM gerado pela codigo obtido na NET,exemplo segue:
ProtoThread protoThreads[NUMBER_OF_ACTIONS] = {
{0,600,action1}, //triggers every 600 millisecond -somente uma vez apos 600ms
{1000,1000,action2} //predelay 1000 milliseconds, then from then on always trigger every 1000 millisecond - REPETE CADA 1s
};
Estou usando o arduino, e bolando um controle preditivo..., de perceber a tendência e desvio da variavel controlada e efetuar, a correção modulação. Isto tudo sem parametros de ganhos e ajustes;
Qual opinião do codigo, algo melhorar, há outra maneira mais eficaz?
Função preditivo -Faz a media das leituras e atribui um valor a varivel decordo com amplitude do desvio
Função regula - Recebe o valor de desvio e altera o valor da frequencia ou duty cycle
Função modulacao - Gera o PWM
Temos o PWM gerado pela codigo obtido na NET,exemplo segue:
ProtoThread protoThreads[NUMBER_OF_ACTIONS] = {
{0,600,action1}, //triggers every 600 millisecond -somente uma vez apos 600ms
{1000,1000,action2} //predelay 1000 milliseconds, then from then on always trigger every 1000 millisecond - REPETE CADA 1s
};
void preditivo(){
/*Efetua a comparação de variação da temperatura determinando a tendencia e gerando variaveis para modulação da saida - aquecimento ou resfriamento*/
int a=0;
if(antes_temp[0] || antes_temp[1] || antes_temp[2] != 0){
//apos obtido tres leituras codigo executa
if(antes_temp[0] + antes_temp[1] < 2*settemp) a=-10;//temperatura diminuindo POUCO
if(antes_temp[1] + antes_temp[2] < 2*settemp) a=-100;//temperatura diminuindo RAZOAVEK
if(antes_temp[0] + antes_temp[1] > 2*settemp) a=+10;//temperatura aumentando POUCO
if(antes_temp[1] + antes_temp[2] > 2*settemp) a=+100;//temperatura aumentando RAZOAVEL
if(antes_temp[0] + antes_temp[1] + antes_temp[2] > 3*settemp) a=+1000;//temperatura aumentando MUITO
if(antes_temp[0] + antes_temp[1] + antes_temp[2] < 3*settemp) a=-1000;//temperatura diminuindo MUITO
if(antes_temp[0] == antes_temp[1] ) a=7;//temperatura estabilizando OTIMO
if(antes_temp[1] == antes_temp[2] ) a=3;//temperatura estabilizando BOM
if(antes_temp[0] == antes_temp[1] == antes_temp[2] ) a=2;//temperatura ESTABILIZADA
}//if do check de ZEROS
antes_temp[0]=antes_temp[1];
antes_temp[1]=antes_temp[2];
antes_temp[0]=temp_atual; //recebe a temperatura do sensor
regula(a);
}
//VARIAVEL GROBAL DA FUNCAO REGULA
long periodo_aquecedor;
unsigned char duty_aquecedor=50;
unsigned int memoria_regulagem=0;
void regula(unsigned int ajuste){
//define frequencia PADRAO
//Somente podemos iniciar o ACAO DE CONTROLE PREDITIVA APOS ter a FREQUENCIA PADRAO ou
//seja um CICLO ON-OFF do aquecedor em condições do DELTA permitido.
if(tempo[2][0] > 0 && memoria_regulagem==0){
memoria_regulagem=1; // ENTAO indicamos o inicio
periodo_aquecedor=tempo[1][0]-tempo[0][0]; //obtemos o tempo de ciclo do RESISTOR
//visualizar tempo de ciclo padrao
}
if(memoria_regulagem!=ajuste){
if(ajuste==1000) periodo_aquecedor + 1000;//frequencia deve descer
if(ajuste==-1000) periodo_aquecedor - 1000;//frequencia deve subir
if(ajuste==100) periodo_aquecedor + 100;//frequencia deve descer
if(ajuste==-100)periodo_aquecedor - 100; ;//frequencia deve subir
if(ajuste==10) ++duty_aquecedor;//duty-cicle deve ser incrementado
if(ajuste==-10)--duty_aquecedor;//duty-cicle deve ser decrementado
}else
if(ajuste==3)memoria_regulagem=3;//duty-cicle deve ser MEMORIZADO
if(ajuste==7){
memoria_regulagem*-1;//duty-cicle deve ser mantido e ultimo comando ++ ou -- deve ser invertido
duty_aquecedor=duty_aquecedor - memoria_regulagem;
}
if(ajuste==2)memoria_regulagem=2; //duty-cicle deve se suavizado
//COMPENSAÇÔES POR EXCESSO CORRECOES
if(duty_aquecedor > MAX_Duty_Cycle)periodo_aquecedor - 100;
if(duty_aquecedor < MIN_Duty_Cycle)periodo_aquecedor + 100;
if(MAX_Duty_Cycle > duty_aquecedor > MIN_Duty_Cycle)duty_aquecedor=50;
//Se variação de frequencia for ALEM EXTREMOS fora da faixa frequencia !!!
if (!(1/Hz_Max > periodo_aquecedor > 1/Hz_min) || periodo_aquecedor < 0); //completar a acao
modulacao(periodo_aquecedor,duty_aquecedor);
} //fim da funcao regula
void modulacao(long freq,unsigned char duty){
unsigned int z;
z=100-duty;
ProtoThread protoThreads[NUMBER_OF_ACTIONS] = {
{freq*duty/100,freq*duty/100,modula_ON}, //ciclo duty-cycle
{freq*duty/100,freq*z/100,modula_OFF} //ciclo de frequencia
};
/* +---------+ +--->
| | |
-->-----+ +-----+
^ action1 ^ action2^
*/
}
void modula_ON(){ temperatura_janela(1); //faz aquecer }
void modula_OFF(){ temperatura_janela(0); //faz resfriar }