Generador AC controlado por PI
Enviado por Manuel Sánchez • 28 de Octubre de 2019 • Tutorial • 1.784 Palabras (8 Páginas) • 127 Visitas
[pic 1][pic 2]
[pic 3]
Resumen.
En este presente informe se hablará sobre la creación, diseño, programación e implementación de control de un generador de corriente alterna, el cual es alimentado por un motor dc de 12 V, en el cual se controla la frecuencia de salida por un controlador PI programado en el Arduino NANO. Esto con el fin de obtener un seguimiento de una frecuencia preestablecida deseada.
Objetivos.
- Diseñar un controlador que haga que la salida del sistema siga la consigna preestablecida.
- Utilizar los métodos vistos en clases para poder obtener un controlador que sea óptimo para el generador.
Desarrollo.
[pic 4]
[pic 5]
[pic 6]
[pic 7][pic 8]
Para realizar el código primero hay que tener claro los componentes que se tienen.
- Tenemos un motor dc que se encarga de girar el rotor del generador.
- Para controlar el motor tenemos un puente H L293D el cual selecciona la dirección de giro de motor dc y al introducir una señal pwm en su enable, controla la velocidad del motor.
- Generador monofásico, para conectar el generador al arduino es necesario rectificar la señal para no dañar el arduino.
La parte del código encargada del motor, solo controla el integrado L293D. Este integrado nos permite contralar la velocidad del motor con una señal pwm. La señal pwm del arduino tiene un rango de 0 – 255 y este cambio de velocidad ( escalon unitario ) refleja un cambio de frecuencia de 0 – 45 Hz.
Para realizar la medición de la frecuencia, se empieza midiendo la tension rectificada del generador, la tension total del generador es de 1.5VAC y la tension máxima medida por el arduino es de 0.275V DC, esta tension en el arduino oscila y para poder medir su frecuencia:
- Se mide la tension del generador y se estima la tension máxima al comparar todas las tensiones previas.
- Se calcula un porcentaje de error en la medición de la tensión máxima ya que no siempre se va a medir la misma tensión máxima.
- Se cuenta solo una vez, cada vez que llega a límite establecido de la tensión máxima ( que sería la tensión máxima menos el porcentaje anterior ).
- Se calcula la distancia del tiempo entre cada conteo.
- Se divide 1/tiempo entre conteo, y asi se obtiene la frecuencia.
Al obtener la frecuencia, se introduce en la suma del sistema de control, pero para ello, se escala su valor en un valor pwm que entiende el pid, y según los valor usados de p , i , d . saldrá un valor pwm en la variable Output el cual determina la velocidad del motor.
Consideraciones:
La única forma de medir la frecuencia es realizando una medición lo más rápido seguido y en un periodo de tiempo constante. Esto se logra usando el timer interno del arduino. También se puede introducir la computación del pid en el timer pero se necesitaría aumentar el tiempo del timer y reduciría la precisión de la frecuencia aunque aumenta la velocidad del controlador.
//Codigo C++
//Esta biblioteca es compartida por la paginaWeb de Arduino para usar el Timer interno
#include "TimerOne.h"
//Esta biblioteca maneja todas las variables y la logica para medir frecuecia dada por una señal AC
#include "ACVolt_to_Frequency.h"
//Aqui se crea la instancia ( objeto ) de la biblioteca ACVolt_to_Frequency
//Empecemos de derecha a isquierda en la linea de texto
//ACVolt_to_Frequency es la clase ( archivo de texto .h ) que contiene todos los metodos que se van a crear con el comando 'new'
//La palabra new crea una direccion en la memoria ram con toda la informacion de la clase ACVolt_to_Frequency
//Frequency va a ser la variable que contiene toda informacion creada pero se nota el asterisco
//El asterisco ( * ) que esta a la par de Frequency transforma la variable en un puntero
//Un puntero es una variable que no guarda informacion, sino asocia la variable a una direccion de la memoria ram
//Asi que Frequency ahora obtiene su informacion de la parte de la memoria ram recien creada por new ACVolt_to_Frequency()
ACVolt_to_Frequency *Frequency= new ACVolt_to_Frequency();
//Esta biblioteca maneja todas las variables y la logica para usar el integrado L293D ( puente H )
#include "L293D.h"
L293D *motor= new L293D(6,2,3);
//Esta biblioteca maneja todas las variables y la logica para controlar facilmente la informacion que se mandara en forma serial ( UART ( bluetooth ) )
#include "Serial_Control.h"
Serial_Control Tx_Rx(0);
//Esta biblioteca es compartida por la paginaWeb de Arduino para realizar el pid
#include
//Variables del pid
double Setpoint, Input, Output;
float Vcc = 4.43;
float P=0.1;
float I=0.4;
float D=0;
float T=100;
boolean pidstart=false;
//Se crea la objeto myPID usando Input, Output y Setpoint como punteros lo que cualquier cambio dentro del objeto se vera afectado en las variables y viceversa
//Mejor dicho, & hace que Input sea visto dentro de myPID como una direccion ram, asi que cualquier cosa que se le haga a Input dentro de myPID actuara en esa parte de la ram
//asi que la variable afuera Input cambiara igual que la de adentro por se la misma informacion
//DIRECT - determina el tipo de crecimiento del controlador en forma creciente
//Mejor dicho, es la relacion directa entre la salida del controlador y su entrada
//Si el Output incrementa se espera que el Input incremente
//Si se usa INVERSE, la logica seria alreves, si el Output incrementa se espera que el Input disminuya
PID myPID(&Input, &Output, &Setpoint,P,I,D, DIRECT);
//Esta es la lista de comandos que el codico va a reconocer cuando se mande un mensaje por el Bluetooth
String List[] = {
"escalon",
...