jueves, 7 de abril de 2016

CONTROL TEMPERATURA PID --- REGULATOR - TEMP ---


Este proyecto consiste en el control de temperatura mediante un PID (Proporcional, Integral, Derivativa). Este PID controla digitalmente el disparo de un triac , que se dispara mediante un optoacoplador, y así seleccionamos la parte de la onda de alterna correspondiente.

En las especificaciones del proyecto era obligatorio el uso de un pic y un atmel y tener comunicación entre ellos, en mi proyecto he utilizado el pic 16F877A , este se encarga del control de una lcd 4x20 , y leer un potenciómetro con el que seleccionamos la temperatura, la temperatura seleccionada se la enviamos al atmel 328P (arduino uno) mediante comunicación serie y la mostramos por pantalla , el atmel recibe la temperatura seleccionada y lee la temperatura que tiene la sonda , realiza los calculos de tiempo que nos da el PID y por otro puerto serie que hemos habilitado le envía los valores a otro atmel 328P que se encarga de detectar el paso por cero (4N25) y con los datos que recibe hacer el disparo antes o después.

En el puerto serie habilitado le hemos conectado un dispositivo bluetooth      (hc-06) , que recibe los datos de temperatura seleccionados mediante un programa desarrollado con la aplicación app inventor.
                            



Para mi proyecto he reutilizado la vieja fuente de alimentación de un ordenador , puesto que disponía de ventilador ,entrada de de corriente por un enchufe y salida de corriente por otro enchufe.

GANT:

Programación del tiempo de ejecución de tareas:




COMPONENTES  :

Los componentes de mi proyecto y precios(unidad):


  • 1x PIC16F877A.                                            5€
  • 1X ZOCALO 40 PINES.                                   1.50€
  • 2x ATMEGA 328P.                                          2.50€
  • 2X ZOCALO 28 PINES.                                    1.50€
  • 3X CRITALES 16MHZ.                                     0.60€
  • 6X CONDENSADORES 22pF.                            0.30€
  • 1X LM7805.                                                    0.80€
  • 1X TRANSFORMADOR 230V A 15V.                   7.60€
  • 2X CONDENSADORES 2200uF.                         1.20€
  • 2X CONDENSADORES DE 100nF.                      0.30€
  • 1X INTEGRADO PUENTE DE DIODOS.                3.20€
  • 4X DIODOS RECTIFICADORES.                         0.30€
  • 2X RESISTECIAS DE 45K 2W.                           0.20€
  • 1X RESISTENCIA DE 10K.                                 0.05€
  • 2X RESISTENCIA 330ohm.                                0.05€
  • 1X RESISTENCIA 1K.                                        0.05€
  • 1X PULSADOR.                                                 0.50€
  • 2X TIRAS DE PINES.                                         0.80€
  • 2X LED.                                                           0.05€
  • 5X LED SMD.                                                    0.10€
  • 5X RESISTENCIAS 220ohm SMD.                       0.03€
  • 1X 4N25                                                          1€
  • 1X V534A63.                                                    1.20€
  • 1X BLUETOOTH.                                                3.50€
  • 1X SENSOR DE TEMPERATURA.                          3.50€
  • 1X LCD 4X20.                                                   6.20€
  • 1X BT139                                                         2.50€

SENSOR DE TEMPERATURA:

 Para mi proyecto he utilizaco un sensor de temperatura sumergible DS18B20 para utilizar este sensor hemos tenido que hacer uso de dos librerías: OneWire.h ,DallasTemperature.h.


CALCULOS PID:

Para realizar los calculos del PID lo hemos hecho en base a un hervidor que compré para realizar el proyecto, este hervidor pone que tiene una potencia de 2000w, aunque son ficticios la realidad es que la resistencia es de 30ohm , su intensidad 230v/30ohm=7.6 amp , 7.6ampx230v=1763w es su potencia real,la potencia máxima que podría soportar sabiando que el triac BT139 soporta hasta 16 amperios 230v x 16amp=3650w.

CURVA DE RESPUESTA HERVIDOR:


  CALCULOS :






 PRUEBAS:

 Antes del diseño de la placa comencé realizando los diferentes programas que  iba a utilizar en mi proyecto uno a uno y cuando tuve todo hecho comence ha    ensamblar las comunicaciones y a adaptar los programas. Para ello utilicé placas  arduino uno , una artesanal del pic 16f877A y una de potencia que hice para    simular con una bombilla, está placa de potencia llevaba un triac BT134 que solo soporta 4 amperios cuando la conecté a la resitesncia de 1700w se quemó y lo sustituí por el BT139 que soporta hasta 16 amperios.

Pruebas.


Primer diseño en placa perforada con triac bt134.


Placa con bt139, primer diseño con  pcb con un pequeño fallo que tube que cablear.

APLICACIÓN SMARTPHONE:

He desarrollado una aplicación para seleccionar la temperatura desde nuestro teléfono, con la aplicación app inventor.




EXPLICACIÓN DEL CONTROL:

En este proyecto para conseguir el voltaje deseado hemos ido seleccionando la parte de la onda de alterna necesaria , que conseguimos con el disparo del triac.







visualización en osciloscopio de como el triac hace los disparos y selecciona 210v y 115v.



 PROGRAMACIÓN:

Al empezar a desarrollar este proyecto me surgió un problema al mantener la comunicación entre el atmel y el arduino ;  el arduino tener que leer un sensor y realizar los calculos del PID , aunque estaba utilizando una interrupción me hacía a destiempo las interrupciones generando un gran descontrol al controlar el triac dejando pasar tensiones totalmente disparatadas, por eso finalmente ha este atmel le abrí un puerto serial para mantener comunicación con otro atmel que se encargara únicamente de recibir los datos y realizar los disparos en el tiempo calculado por el PID y  este mismo puerto serial recibir los datos del bluetooth.

El pic es el encargado de controlar la lcd y mostrar los valores seleccionados mediante un potenciómetro y los valores que recibe del atmega de lectura del sensor de temperatura.

PROGRAMACIÓN PIC16F877:



#include <16f877a.h>

#fuses hs,nowdt

#use delay(clock=16M)

#byte tris_a=0x06

#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9,stream=PORT1)



int  dato;

#int_RDA

void  RDA_isr(void)

{

dato=getc();

}

#define LCD_ENABLE_PIN  PIN_B0                                  
#define LCD_RW_PIN     PIN_B1                                    
#define LCD_RS_PIN      PIN_B2                                    
#define LCD_DATA4       PIN_B4                                    
#define LCD_DATA5       PIN_B5                                    
#define LCD_DATA6       PIN_B6                                   
#define LCD_DATA7       PIN_B7
#include <lcd.c>
#INCLUDE <stdlib.h>

   void main()
   {
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,1023,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);               
   lcd_init();
   lcd_gotoxy(1,1);
   printf (lcd_putc,"SELECCION TEMPRATURA");
   lcd_gotoxy(20,2);
   printf (lcd_putc,"   IES POLITECNICO  ");
   int a;

           while(true)
           {


             read_adc();
             a=read_adc();
             a=a/2;
             if (dato>0 && dato<100)
             {
              lcd_gotoxy(14,2);
              printf (lcd_putc,"%dC"dato);
              }
              if(a==1)
              {
              lcd_gotoxy(1,2);
              printf (lcd_putc,"BLUETOOTH");
              putc(a);
              }
              if(a<100 && a>1 )
             { 
              lcd_gotoxy(1,2);
              printf (lcd_putc,"%dC          "a);
              putc(a);
              }

              }
              }



PROGRAMACIÓN ATMEGA 328P(ENCARGADO DE LEER EL SENSOR Y LA DOBLE COMUNICACIÓN):


    #include <PID_v1.h>
    #define PIN_INPUT 0
    #define PIN_OUTPUT 3
    double Setpoint, Input, Output;
    double Kp=3.9, Ki=0.03, Kd=21.5;
    PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);  
   #include <OneWire.h>
   #include <DallasTemperature.h>
   #include <SoftwareSerial.h>
   SoftwareSerial portOne(10, 11);
   #define ONE_WIRE_BUS 4
   OneWire oneWire(ONE_WIRE_BUS); 
   DallasTemperature sensors(&oneWire);
    int salida=7;
    int blu=8;
    int pot=9;
    void setup()
   {
   Serial.begin(19200);
     while (!Serial) {
       }
    portOne.begin(9600);
    pinMode(salida,OUTPUT);
    pinMode(blu,OUTPUT);
    pinMode(pot,OUTPUT);   
    sensors.begin();
   myPID.SetMode(AUTOMATIC);
    }

     int estado=0,temperature,prueba,sut,var,set,copia=0;
     double valor=1;
     void loop()
     {  
  
      sensors.requestTemperatures();  
      Input=sensors.getTempCByIndex(0);
      prueba=Input;
      if(copia!=prueba){
     Serial.write(prueba);
     copia=prueba;
      }
  
     if (Serial.available() > 0 && var==0) {
    sut=Serial.read();
    Setpoint=sut; 
    digitalWrite(blu,LOW);
    }
  
    //portOne.listen(); 
    if (portOne.available() > 0 && sut<10 ) {
    set=portOne.read();
    set=set-48;
    var=set*10; 
   }
  
    if(var>0){
    Setpoint=var;
    digitalWrite(blu,HIGH);
    }
    copia=Setpoint;
    myPID.Compute();     //Calculo
    analogWrite(PIN_OUTPUT, Output);     //Salida de datos
    valor=map(Output,0,255,0,9);
    valor=9-valor;
    if(prueba==Setpoint || Setpoint<prueba){
     valor=10;
     }
   portOne.write(valor);  
   }


 PROGRAMACIÓN ATMEGA328P ENCARGADO DE DISPARAR EL TRIAC:
                     int salida=7;
                     void setup()
                     {
                     Serial.begin(9600);
                     pinMode(salida,OUTPUT);
                     attachInterrupt(0,interrupcion,RISING);


                   }
                   int valor=5,estado=0,tiempo;
                   void loop()
                  {
                   if (Serial.available() > 0 ) {
                  valor=Serial.read();
                  Serial.println(valor);
                  }
                  if (valor>0){
                 tiempo=valor;
                }
                  if (estado==1 && tiempo<10){
                 delay(tiempo);
                 digitalWrite(salida,HIGH);
                 estado=0;
                }
                digitalWrite(salida,LOW);
                delayMicroseconds(1);
                 }

                void interrupcion() {
                estado=1;
               digitalWrite(salida,LOW);
                }

 DISEÑO DE PLACA:

 La placa del proyecto es una única placa en la que hemos dividido en tres partes se diferencian a simple vista la parte de alimentación: esta formada por   un transformador de 230v a 15v , un puente de diodos y un LM7805;parte de señal: PIC16F877 y dos atmega 328P   y   parte de potencia: triac BT139.


   CIRCUITO ARES:
                                                                                                                     
  
La parte superior derecha corresponde al circuito de alimentación , la parte inferior derecha es el circuito de potencia y la mitad izquierda es el circuito de baja.



      NEGATIVOS:



  POSITIVOS:
  

   PLACA:
                    




    VISTA 3D:


   PLACA FINAL:




PLACA ENSAMBLADA  Y CONECTADA:





VIDEO DESCRIPCIÓN Y FUNCIONAMIENTO:
















No hay comentarios:

Publicar un comentario