Paso 4: El arduino código
En el paso siguiente discutimos cómo controlar este circuito con el código de Arduino. Simplemente descargar y ejecutar nuestro código. El resto de este paso va en los detalles más escabrosos de cómo funciona el código. Tenga en cuenta que algunas partes de nuestro código se basan en la fase de AC de Arduino controlar tutorial hemos reutilizado alguna parte de ese código como es.
La placa Arduino UNO contiene un ATmega328P microprocesador de 16MHz. Para activar el circuito de control fase AC en exacto el tiempo de intervalos utilizamos las funciones de interrupción del temporizador de hardware del ATmega328. Así que, si no está familiarizado con conceptos como temporizadores, desbordamiento del registro y escala, que este artículo explica mejor.
Antes de entrar en codificación que tenemos que hacer algunos cálculos básicos. Es la señal de AC 60 Hz. (no se preocupe si usted tiene 50Hz en su país, usted puede volver a calcularlo fácilmente) es decir, la señal de AC cruza cero, alcanza el pico de tensión positiva, cruces de cero otra vez, alcanza el pico de tensión negativo y vuelve a cero 60 veces cada segundo. El período (longitud de tiempo que esto lleva) es 1/60 o 0,01667 segundos (16,67 milisegundos). Así, un ciclo medio o el tiempo entre dos pulsos de cruce por cero se produce en 8,33 milisegundos.
De aquí en adelante, será determinar intervalos de tiempo en el código de cuenta de reloj, no por segundos. El reloj de Arduino funciona a 16 MHz, que es 16.000.000 de ciclos por segundo: un ciclo de reloj toma 0,0625 microsegundos. Solo que la mitad del ciclo de la señal de AC de 60 Hz contiene 133.333 ciclos de reloj. El 16-bit timer (timer1) de Arduino Uno puede contar solamente a 65535. Así que tenemos configurar con un prescaler. En este código hemos utilizado un prescaler de 256. Con el prescaler de 256, la mitad de un ciclo significa aproximadamente 520 incrementos del timer. Por razones prácticas (ligeros cambios en la fuente de frecuencia y triac retrasos operacionales) se consideraron como 450. Esto asegura que el conductor del triac tiene tiempo de apagar antes el siguiente medio ciclo. Así controla el tiempo de espera antes de conectar el triac dentro de la gama 1-450 dentro de cada medio ciclo para controlar la potencia de salida. Utilizamos comparador partido interrupciones para esto. Utilizamos interrupciones de desbordamiento del temporizador para controlar la señal al gate del triac y el ancho de pulso a 4 cuentas de temporizador. Aquí, cuando el pulso es enviado a la puerta del triac, enciende la fuente de CA y permanecerá ON incluso después de retirar el pulso hasta la próxima vez que la onda de CA llegue a cero. (Si no está familiarizado con el operación es un buen artículo de Triac). Por esta razón no necesita preocuparse de apagar el triac.
Siguiente fragmento de código muestra la fase AC control de lógica.
#define detectar 2 / /detectar cero cruz
#define puerta 9 / /puerta del triac
#define pulso 4 / /gatillo ancho de pulso (cuentas)
configurar Timer1(16-bit)
OCR1A = 100; inicializar el comparador
TIMSK1 = 0 X 03; permitirá comparador A y desbordamiento de interrupciones
TCCR1A = 0 X 00; control temporizador registra sistema de
TCCR1B = 0 X 00; funcionamiento normal, temporizador desactivado
configuración cero interrupción del cruce
attachInterrupt (0, zeroCrossingInterrupt, RISING);
cero cruz detectado
void zeroCrossingInterrupt() {}
TCCR1B = 0 X 04; comenzar el cronómetro con división por 256 de entrada
TCNT1 = 0; resetear contador de tiempo - cuenta desde cero - cuentas hasta que coincida con el valor de comparación
}
partido de comparador - alcanzada el retraso esperado
{ISR(TIMER1_COMPA_vect)}
digitalWrite(GATE,HIGH); ajuste compuerta triac de alta - encienda el suministro de
TCNT1 = 65536 PULSOS; anchura de pulso de gatillo
}
desbordamiento del Timer1 - pulso alcanza su anchura
{ISR(TIMER1_OVF_vect)}
digitalWrite(GATE,LOW); apague el gate del triac
TCCR1B = 0 X 00; desactivar el temporizador para evitar desencadenantes no deseados
}
Control de temperatura
Ahora hemos terminado con la parte más delicada de nuestro código. El siguiente es para el control de potencia (o el tiempo de retardo) según el valor actual de la temperatura y la temperatura deseada. Para leer el valor de temperatura se utilizó la biblioteca Adafruit_MAX31855. Para implementar el mecanismo de control se utilizó la lógica de control PID. No te preocupes si suena un poco complejo. Por suerte tenemos una librería de Arduino para. El siguiente fragmento de código muestra el código para eso.
#define 3
#define CS 4
#define CLK 5
Adafruit_MAX31855 termopar (CLK, CS, DO);
doble valor de ajuste de entrada, salida; Definir Variables a conectarse
doble Kp = 2, Ki = 6, Kd = 1; Especificar los enlaces y los parámetros de ajuste iniciales
PID myPID (entrada y salida & setPoint, Kp, Ki, Kd, directa);
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits (0, 449); establecer el rango
en el método de lazo
doble c = thermocouple.readCelsius();
Si (isnan(c)) {}
i = 450; Ir a energía mínima si algo salió mal
}
Else {}
Entrada = c; myPID.Compute();
i = salida de 450; reducir la demora, mayor el poder
}
OCR1A = i; comparador de valor i
Delay(400); / / esperar siguiente temperatura leída
Interfaz de usuario
Para la interfaz de usuario del programa utilizamos olimex biblioteca de protector de pantalla lcd junto con biblioteca de alambre de Arduino. Usted puede descargar la biblioteca de olimex desde sitio web Olimex.