lunes, 1 de octubre de 2012
martes, 25 de septiembre de 2012
Control PI discreto de iluminacion con ATmega8a
La corriente eléctrica es
una señal alterna sinusoidal como la de la figura:
Funcionamiento:
El funcionamiento del programa es el siguiente:
La forma de la señal en el bombillo, que varía según el ángulo de disparo, hace que el
voltaje eficáz también varíe; en consecuencia la intensidad de iluminación se controla.
Al pasar esta corriente
eléctrica por el bombillo haremos que se ilumine al 100 %.
Si logramos hacer
que la señal aplicada al bombillo se recorte como se ve en la figura siguiente,
obtendremos valores de iluminación entre un 0% y un 100%.
El objetivo del proyecto es controlar el ángulo de
disparo de un TRIAC que estará conectado en serie con el bombillo, mediante el
controlador PI, de acuerdo a la intensidad de luz que perciba un sensor
LDR.
Etapas
Sensor y acondicionamiento
El sensor que se
utiliza es una fotorresistencia, el cual varía su valor, dependiendo de la
intensidad de luz que se le aplique. La señal de salida alta en caso de baja
intensidad de luz, y baja en caso contrario.
Como la salida del sensor (LDR) varia de
0-2.5v y la entrada del microcontrolador ATMEGA8 recibe voltajes de 0-5v,
amplificamos este valor en un factor de 2 para aprovechar la sensibilidad del
ADC del microcontrolador.
Referencia
Este potenciómetro se utilizará para
elegir la intensidad de luz de referencia que se requiera mantener. También irá
conectado a uno de los pines ADC del microcontrolador.
Control
El esquema muestra las conexiones de
los pines del microcontrolador.
Se utiliza este bloque de
circuito para poder sincronizar el programa con la señal sinusoidal del
circuito de potencia que se quiere controlar. Este circuito enviará un pulso de
interrupción cuando la señal cruce por 0, iniciando la rutina correspondiente
en el programa.
Circuito de Potencia
El diodo D1 se utiliza para proteger
al microcontrolador. El MOC3031 es un optotriac que enviará una señal de
activación al triac U6 cuando la salida del circuito de control sea 1 lógico (5
V), lo cual hará que el bombillo se encienda; caso contrario, si la salida del
circuito de control es 0 lógico (0 V) el bombillo no se encenderá.
Circuito Completo
Programa en Basic
$regfile = "m8def.dat" 'ATmega8 $crystal = 8000000 'Frecuencia de cristal=8 MHz $hwstack = 32 'Hardware Stack $swstack = 10 'Software Stack Config Portb = Output 'Puerto B como salida Config Portc = Input 'Puerto C como entrada 'Definicion de variables Dim Sensor As Word 'Dato medido en ADC1=Sensor Dim Ref As Word 'Dato medido en ADC0=Referencia Dim Ek As Single 'Error actual Dim Ek_1 As Single 'Error anterior Dim Pk As Single 'Componente Proporcional Dim Ik As Single 'Componente Integral actual Dim Ik_1 As Single 'Componente integral anterior Dim Kp As Single 'Ganancia Proporcional Dim Ki As Single 'Ganancia Integral Dim Uk As Single 'Señal de control Dim Uk_dig As Word Dim Ukmax As Word 'Límite máximo de Uk Dim Ukmin As Word 'Límite mínimo de Uk Dim T As Single 'Periodo de muestreo Dim Rampa As Word 'Señal escalón 'Configuracion ADC Config Adc = Single , Prescaler = Auto 'Configuracion de unterrupciones Config Timer1 = Timer , Prescale = 256 'Configuración TIMER1, f=31.25 KHz On Compare1a Int_timer1 'Interrupción por comparación Enable Compare1a 'Habilitación interrupción por comparación Config Int1 = Low Level 'INT1, flanco de bajada On Int1 Int_zc 'Interrupción externa INT1 Enable Int1 'Habilitación INT1 Enable Interrupts 'Habilitación global de interrupciones Timer1 = 0 Stop Timer1 'Programa principal Ik_1 = 0 Ek_1 = 0 T = 0.0083 'Periodo de muestreo T=1/120=0.0083 s Kp = 1 Ki = 0.04 Ukmax = 32 'Ukmax=32 escalones Ukmin = 0 'Ukmin=0 escalones Rampa = 0 'Reinicialización de Rampa Do nop 'Bucle infinito Loop 'Rutinas de interrupción 'Interrupcion cruce por cero Int_zc: Stop Timer1 Timer1 = 0 'Reinicialización de Timer1 Compare1a = 7 'Interrupción cada 7*1/31250= 0.22 ms = 7.5ms/32 Rampa = 0 'Reiniciar Rampa en cada Interrupción Portb.0 = 0 'Señal a Triac =0 'Obtensión de señales Referencia y Sensor Start Adc Ref = Getadc(0) Sensor = Getadc(1) Stop Adc 'control PI Ek = Ref - Sensor Pk = Ek * Kp ' P(k)=Kp*e(k) Ik = Ek + Ek_1 ' I(k)=I(k-1)+Ki*T*(e(k)+e(k-1))/2 Ik = Ki * Ik Ik = Ik * T Ik = Ik / 2 Ik = Ik + Ik_1 Uk = Pk + Ik ' u(k)=P(k)+I(k) Uk_dig = Uk + 1023 ' Ajuste en rango 0 - 32 escalones Uk_dig = Uk_dig / 63 Ek_1 = Ek Ik_1 = Ik 'limitación de rango de señal de control If Uk_dig > Ukmax Then Uk_dig = Ukmax Elseif Uk_dig < Ukmin Then Uk_dig = Ukmin End If Start Timer1 Return 'Interrupcion Timer cada 0.22 ms 32 escalones por semiciclo Int_timer1: Stop Timer1 Timer1 = 0 'Reiniciar Timer1 Rampa = Rampa + 1 'Incrementar rampa por cada interrupción 'Determinar instante en que se envia señal al TRIAC If Uk_dig > Rampa Then Portb.0 = 0 'Señal a Triac = 0 Else Portb.0 = 1 'Señal a Triac =1 End If Return End
Funcionamiento:
El funcionamiento del programa es el siguiente:
- Se establece un nivel de iluminación deseado en un ambiente mediante el potenciómetro RV1.
- La iluminación se debe mantener en el nivel deseado, ya sea por acción del bombillo o por fuentes externas, como por ejemplo luz solar.
- El programa principal no realiza ninguna operación (se puede implementar alguna rutina). El control se realiza mediante una rutina de interrupción, por lo que no se tendrá al microcontrolador ocupado todo el tiempo.
- La rutina de interrupción, que se ejecuta en cada cruce por cero de la señal de potencia, consiste en un control PI discreto, en el que se implementan los siguientes algoritmos:
Se debe determinar el periodo de muestreo:
La
señal de interrupción se genera en los cruces por cero. En la rutina de
interrupción se obtienen las
señales del ADC, por lo tanto el periodo de
muestreo es igual al periodo de los pulsos de interrupción:
T=1 / (120 Hz) = 8.33 ms
- Se implementa una segunda rutina de interrupción por comparación que se ejecuta 32 veces en cada semiciclo de la señal de potencia. En cada interrupción una señal rampa se incrementa en una unidad y se reinicia en cada interrupcion de cruce por cero.
Se determina el valor en Compare1a:
El programa debe ejecutar una interrupción por comparación cada:
t = 7.5 ms / (32 escalones) = 0.23 ms
Frecuencia de Tiner1:
f = 8 MHz/256 = 31.25 KHz
Valor numérico en Compare1a:
Compare1a = 0.23 · 10^(-3) · 31.25 · 10^(3) = 7.18
Compare1a = 7
- Esta señal rampa se utiliza junto a la señal de control para determinar el ángulo de disparo del TRIAC.
La
señal de control “Uk” puede tomar un valor 0 -32 dependiendo de la intensidad
de
iluminación (mayor intensidad àUk mayor y viceversa).
iluminación (mayor intensidad àUk mayor y viceversa).
Si Uk > Rampa entonces el TRIAC no se dispara, el bombillo no se enciende.
Si Uk <= Rampa entonces el TRIAC se dispara, el bombillo se enciende.
voltaje eficáz también varíe; en consecuencia la intensidad de iluminación se controla.
Control de Temperatura con ATmega8a
Este circuito se implementa para
mantener un ambiente dentro de un rango de temperatura, el caso más práctico es
una incubadora. El controlador se encargará de hacer las correcciones
necesarias cuando el sistema no cumpla las condiciones deseadas.
Funcionamiento
El funcionamiento del programa es el siguiente:
Temp = 10· Vin
En este caso, el controlador de
temperatura tendrá el papel de calefactor; ya que cuando el ambiente disminuya su
temperatura respecto de la mínima del rango, el controlador se activará y lo calentará
hasta que la temperatura regrese al intervalo. Ahora, cuando el sector aumente
su temperatura respecto de la máxima del rango, el circuito se desactivará
dejando de calentarlo para que éste se enfríe con el ambiente.
Para proveer de calor el sector
mencionado se utilizará un bombillo incandescente el cuál se encenderá y
apagará según sea el caso.
Etapas
Sensor de temperatura y acondicionamiento:
El LM35 es un sensor de temperatura
que, según la configuración utilizada, entrega en su salida 10mV/oC;
es decir, si la temperatura es de 25oC entonces la salida será 0.25
V.
El ADC del microcontrolador trabaja
en el rango 0 – 5V, por lo tanto, para aprovechar mejor su sensibilidad, debemos
amplificar la señal del LM35 10 veces. Es por ello que se utiliza el
amplificador activo que puede implementarse en la configuración mostrada o
utilizar la configuración básica con un LM741.
Referencia
Este potenciómetro se utilizará para
elegir la temperatura de referencia que se requiera mantener. También irá
conectado a uno de los pines ADC del microcontrolador.
Control
El esquema muestra las conexiones de
los pines del microcontrolador.
Circuito de potencia
El diodo D1 se utiliza para proteger
al microcontrolador. El MOC3031 es un optotriac que enviará una señal de
activación al triac U6 cuando la salida del circuito de control sea 1 lógico (5
V), lo cual hará que el bombillo se encienda; caso contrario, si la salida del
circuito de control es 0 lógico (0 V), el bombillo no se encenderá.
Circuito Completo
Programa en Basic
'configuracion de microcontrolador $regfile = "m8def.dat" 'Microcontrolador a utilizar $crystal = 8000000 'Frecuencia de oscilador interno =8 MHz $hwstack = 32 'Hardware stack $swstack = 10 'Software stack Config Timer1 = Timer , Prescale = 64 'Configuracion de TIMER1 F=Fosc/64 Config Portb = Output 'Puerto B como salida Config Adc = Single , Prescaler = Auto 'Configuracion de ADC 'Definicion de variables Dim Vsensor As Word Dim Vref As Word Dim Tmin As Single Dim Tmax As Single Dim Tempref As Single Dim Temp As Single 'Habilitacion de interrupcion por comparacion Enable Interrupts On Compare1a Interrupcion Enable Compare1a 'Inicializacion de registros para comparacion Timer1 = 0 Compare1a = 62500 'Programa principal Do nop 'Ninguna operacion Loop 'Rutina de interrupcion Interrupcion: 'Rutina de ADC Start Adc 'Iniciar ADC Vsensor = Getadc(1) 'Vsensor= Canal 1 de ADC Vref = Getadc(0) 'Vref= Canal 0 de ADC Stop Adc 'Convertir valor obtenido de ADC a valor de temperatura Temp = Vsensor / 1023 Temp = Temp * 50 Tempref = Vref / 1023 Tempref = Tempref * 50 'Establecimiento de rango de temperatura Tmin = Tempref - .5 Tmax = Tempref + .5 'Control de temperatura en rango Tempref +/- 2 If Temp < Tmin Then 'Si Temp<Tmin encender foco Portb.6 = 1 Portb.5 = 0 Elseif Temp > Tmax Then 'Si Temp>Tmax apagar foco Portb.6 = 0 Portb.5 = 0 If Temp > 32 Then Portb.5 = 1 End If End If 'Reinicializacion de registros para comparacion Timer1 = 0 Return 'Retorno de interrupción End 'Fin de programa
Funcionamiento
El funcionamiento del programa es el siguiente:
- Se establece una temperatura de referencia mediante el potenciómetro RV2.
- la temperatura se mantendrá en el rango Trmpref +/- 0.1ºC.
- La rutina principal no realiza ninguna operación, en este caso, pero si se desea se podría mantener al microcontrolador realizando alguna tarea y el control de temperatura sólo será una rutina de interrupción que no lo mantendrá ocupado todo el tiempo.
- La rutina de interrupción se ejcutará cada 0.5s, hace falta calcular el valor en Comapare1a:
La frecuencia del TIMER1 es:
f=fosc/64=8 MHz / 64 = 125 KHz
La cuenta en el TIMER1debe llegar hasta un cierto valor, inicializado en COMPARE1A,en 0.5 s
para que se ejecute la rutina de interrupción.
N·T = N / f = 0.5 s
f=fosc/64=8 MHz / 64 = 125 KHz
La cuenta en el TIMER1debe llegar hasta un cierto valor, inicializado en COMPARE1A,en 0.5 s
para que se ejecute la rutina de interrupción.
N·T = N / f = 0.5 s
N = 0.5 · f=0.5 · 125000
N = 62500
- Se sensa la temperatura de referencia y de salida del sistema. El ADC lo convierte a un valor digital de 0 - 1023. Es necesario llevarlo al rango 0 - 50ºC:
Vadc=Vin · 1023 / 5
Vin = 5·Vadc / 1023
En este caso el valor numérico de
temperatura es 10 veces el valor numérico de voltaje,
es decir:
es decir:
Temp = 10· Vin
Por lo tanto para obtener el valor
numérico de temperatura se realizan las
operaciones:
Temp=50·Vadc/1023
- En la rutina de interrupción se observa que se crea un rango Tmin - Tmax. en el que se quiere mantener al sistema.
Si Temp<Tmin entonces se enciende el bombillo para que actúe como calefactor.
Si Temp>Tmax entonces se apaga el bombillo para que el ambiente baje de temperatura.
El proceso se repite indefinidamente, pero si por alguna razón se sobrepasara una temperatura máxima, en este caso 32ºC, se activará una alarma en el pin 5 del Puerto B.
Suscribirse a:
Entradas (Atom)