Вы находитесь на странице: 1из 3

#include <math.

h>
int analogPin = 0;

int analogPin1= 1;
// outside leads to ground and +5V
float temperatura = 0.0; // variable to store the value read
float temperaturaProm = 0.0;
float temperaturaLeida = 0.0;
double contador=0;
float consigna = 0.0;
float consignaProm = 0.0;
float consignaLeida = 0.0;
float T,q0=0.0,q1=0.0,q2=0.0,uk=0.0,uk1=0.0,ek=0.0,ek1=0.0,ek2=0.0;
double tiempo;

float kp=3.124;
float ki=0.01539;
float kd=0.0;

unsigned int aux=200;

void setup()
{

Serial.begin(9600);
cli(); // stop interrupts
attachInterrupt(0, cruceCero, RISING);
//-------------------------------------------------------------- VALORES CONTROL
PID
T=0.368;
q0=kp+kd/T;
q1=-kp-2*kd/T+ki*T;
q2=kd/T;
uk=0;
uk1=0;
ek=0;
ek1=0;
ek2=0;
//------------------------------------------------------------- CONFIGURACI�N
TIMER1
TCCR1A=0; //FUNCIONAMIENTO NORMAL
TCCR1B=0; //FUNCIONAMIENTO NORMAL
TCNT1=0;

ICR1 = 13888; // = 16000000 / (8 * (144)) - 1 define el TOP value


OCR1A= 100; // VALOR QUE VA DE 0-13888 CORRESPONDIENTE DE 0-100% CICLO DE TRABAJO
CANAL A
OCR1B= 100; // VALOR QUE VA DE 0-13888 CORRESPONDIENTE DE 0-100% CICLO DE TRABAJO
CANAL B
TCCR1A |= (1 << WGM11)|(0 << WGM10); // activar modo FAST PWM CON FRECUENCIA
DEFINIDA POR ICR1
TCCR1B |= (1 << WGM13)|(1 << WGM12); // configurando WGM1x donde x=0,1,2,3

TCCR1A |= (1 << COM1A1)|(1 << COM1A0); // activar modo invertido de PWM PARA
HAL�GENO CANAL A
TCCR1A |= (1 << COM1B1)|(0 << COM1B0); // activar modo NO-Invertido de PWM PARA
VENTILADOR CANAL B
TCCR1B |= (0 << CS12) | (1 << CS11) | (0 << CS10); // prescalador = 8

pinMode(8, OUTPUT);
digitalWrite(8, LOW);
TIMSK1 |= (1 << TOIE1);// enable timer compare interrupt
sei();//allow interrupts
pinMode(11, OUTPUT);

pinMode(12, OUTPUT);
}

void loop()
{
if(contador==13000){
contador=0;
for (int i = 0; i <= aux; i++) {
temperatura = 0.2943*analogRead(analogPin)-0.2135;
temperaturaProm+=temperatura;
consigna =analogRead(analogPin1)*300.0/737.0; // lazo abierto
//consigna =300-analogRead(analogPin1)*300.0/1023.0; //lazo cerrado
consignaProm+=consigna;
if(i==aux){
temperaturaLeida=temperaturaProm/aux;
consignaLeida=consignaProm/aux;
temperaturaProm=0;
consignaProm=0;
}
}
ek=consignaLeida-temperaturaLeida;
uk=uk1+q0*ek+q1*ek1+q2*ek2;
if(uk>=300.0){
uk=300.0;
}
if(uk<=0.0){
uk=0.0;
}

uk1=uk;
ek2=ek1;
ek1=ek;

Serial.println("Temperatura Actual: ");


Serial.println(temperaturaLeida);

Serial.println("Consigna: ");
Serial.println(consignaLeida);
Serial.println("Senal control: ");
Serial.println(uk);
tiempo=millis()/1000.0;
Serial.println("Tiempo: ");
Serial.println(millis());
Serial.println("---------------------");

}
contador++;
}

void cruceCero(){
OCR1A=13888-round(consignaLeida*13888.0/300.0); //control en lazo abierto.
//OCR1A=13888-round(uk*13888.0/300.0); //control en lazo cerrado
TCCR1B |= (0 << CS12) | (1 << CS11) | (0 << CS10); // prescalador = 8
}

ISR(TIMER1_OVF_vect){
TCCR1B&= B11111000; // PARAR TIMER1
}

Вам также может понравиться