Академический Документы
Профессиональный Документы
Культура Документы
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;
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;
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("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
}