Buenas a todos, necesito que me ayuden a aclarar unas dudas para poder determinar si podre implementar un control PID de temperatura a mi proyecto.
Empiezo, mi proyecto usa el PIC18F4620 x2 con un crystal de 20 Mhz, uso el CCS 5.015. Como periféricos de salida tiene una patalla glcd 128x64, un buzzer y 2 triacs.
De entrada estoy usando el sensor DHT22, 3 pulsadores, 2 finales de carrera.
Es una incubadora de huevos y actualmente funciona bien con el control on/off. Un triac para un motor AC y otro para una lampara incandescente.
Ahora el problema que tengo es al incorporar el pid. Realice por separado en control de angulo de fase, hice los cálculos del pid y demas.
Este es el código del control de angulo de fase con el triac que funciona bien.
#include <18F4620.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,PUT
#use delay(clock=20M)
int T;
int angle;
#INT_EXT2
void intrb2(){
if(angle <= 0){
output_high(PIN_A2);
} else if(angle >= 180){
output_low(PIN_A2);
}
else if(angle<180 && angle > 0){
output_low(PIN_A2);
T= ((angle*10.0)/180);
delay_ms(T);
output_high(PIN_A2);
}
}
void main()
{
enable_interrupts(int_ext2);
ext_int_edge(2,L_TO_H);
enable_interrupts(GLOBAL);
while(TRUE)
{
//TODO: User Code
angle=35;
}
}
Ahora soy consiente que el uso de delays en interrupciones no es lo adecuado y ahi es donde se genera mi problema. Al añadirlo a mi código principal:
1. Para que lo compile tengo que crear otra instancia de #use delay(clock = 20000000) pero congela todo mi proceso. Varia la intensidad de la lampara pero estropea todo los demás. (asumo que es pq realiza la interrupción cada 10mS).
2. He intentado usar una bandera en la interrupción para no crear la segunda instancia del delay y redireccionar sus operaciones a una función. El control de fase ya no funciona correctamente, pienso que es debido a que el código principal es un poco largo y interfiere con el disparo del Triac y obviamente no lo hace instantáneamente como es en el caso de que lo haga dentro de la interrupcion.
Alguien puede sugerirme alguna otra alternativa para su implementacion? Es una placa ya armada y no puedo añadirle ningún otro componente.
Quizás no fui muy claro con la explicación, espero que me puedan dar una mano, saludos!!