Algoritmo de perturbacion y observacion

Este es un lugar dedicado a los genios del teclado y los lenguajes de programación. Si tu virtud está dedicada a programar, a sumar líneas de código para alcanzar realizaciones asombrosas, éste es tu espacio. ¡Por supuesto! ¡También será el lugar para aprender de los que más saben del tema!

Moderador: HJ

Algoritmo de perturbacion y observacion

Notapor jcristhian_1 » Mié Mar 27, 2013 7:47 pm

Bueno no se si ponerlo aca, pero es la simulacion de un panel Solar + un convertidor DC-DC el cual es controlado por un algoritmo de perturbacion y observacion simple. Adjunto una simulacion en Simulink.
El caso es que, lo que me parece que cuando el algoritmo llega al punto de maxima potencia comienza a oscilar en torno a este, se que hay muchas soluciones para mejorar esto como logica difusa u otras tecnicas, quisiera que me den una idea de como mejorar este algoritmo de perturbacion y observacion, que esta implementado dentro de una funcion embebida de matlab.
esta es la simulacion:
http://www.4shared.com/file/Y8efcS6m/es ... solar.html

este es el algoritmo implementado:
%__________________________________________________________________
% Algoritmo de perturbacion y observacion aplicado a un buck converter
function referencia = pert_and_obs(pow)
persistent ref
persistent old_pow
inc=10/1023;
if isempty(ref)% para inicializar la variable
ref=0.5;
end
if isempty(old_pow)% para inicializar old_power
old_pow=0;
end
if pow<=old_pow
inc=-inc;
end
ref=ref+inc;
if ref>1
ref=1;
end
if ref<0
ref=0;
end
old_pow=pow;
referencia=ref;
end
%___________________________
Electrónica - Programación - Software Libre.
http://voltiosybytes.blogspot.com/
Avatar de Usuario
jcristhian_1
 
Mensajes: 103
Registrado: Mié Mar 27, 2013 12:54 am
Ubicación: Piura

Re: Algoritmo de perturbacion y observacion

Notapor elgarbe » Mié Mar 27, 2013 7:58 pm

si bien he trabajado bastante en matlab en la facu, estoy medio olvidado. creo que para ver lo que planteas necesitaríamos la simulacion completa...
ahora bien, el problema que planteas es que cuando el dc-dc llega a entregar la máxima potencia empieza a oscilar? asumo que esto es por la realimentacion que usas en el dc-dc? la salida del dc-dc es tensión constante o corriente constante?

estoy entendiendo bien?

saludos!

edito: ya vi la simulacion... lastima que no tengo matlab instalado... unas imágenes?
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: Algoritmo de perturbacion y observacion

Notapor jcristhian_1 » Mié Mar 27, 2013 8:06 pm

coloque la simulacion con el archivo mdl en el enlace de 4shared, la idea es generar tension proveniente del panel solar para cargar una bateria, lo cual se hara por etapas, pero en la fase Bulk (es cuando la bateria esta mas descargada) de carga de la bateria es cuando se hace seguimiento del punto de maxima potencia para estar disponible para la bateria.

En el archivo de simulink esta el esquema de lo que estoy simulando.

De lo que tengo estudiado hasta ahora, en el seguimiento de l punto de maxima potencia (mppt) de un panel solar, la tension de salida no es tan importante, mas importante es la tension y la corriente que "ve" el panel solar ya que estas deben adaptarse para que el panel trabaje en el Punto de maxima potencia
Electrónica - Programación - Software Libre.
http://voltiosybytes.blogspot.com/
Avatar de Usuario
jcristhian_1
 
Mensajes: 103
Registrado: Mié Mar 27, 2013 12:54 am
Ubicación: Piura

Re: Algoritmo de perturbacion y observacion

Notapor elgarbe » Mié Mar 27, 2013 8:15 pm

ya veo. voy a ver si tengo matlab en alguna pc para pegarle una mirada. por las dudas, con que version trabajas?
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: Algoritmo de perturbacion y observacion

Notapor jcristhian_1 » Mié Mar 27, 2013 8:16 pm

estoy trabajando con la version 2009
Electrónica - Programación - Software Libre.
http://voltiosybytes.blogspot.com/
Avatar de Usuario
jcristhian_1
 
Mensajes: 103
Registrado: Mié Mar 27, 2013 12:54 am
Ubicación: Piura

Re: Algoritmo de perturbacion y observacion

Notapor jcristhian_1 » Jue Mar 28, 2013 10:46 am

Ayer olvide colocar una imagen, aqui va:
Imagen

Esta es una captura, de la Potencia del panel, el ideal son 65W, segun el modelo matematico del panel fotovoltaico:
Imagen

Este es el rizado en la potencia del panel
Imagen
Electrónica - Programación - Software Libre.
http://voltiosybytes.blogspot.com/
Avatar de Usuario
jcristhian_1
 
Mensajes: 103
Registrado: Mié Mar 27, 2013 12:54 am
Ubicación: Piura

Re: Algoritmo de perturbacion y observacion

Notapor fer650 » Vie Abr 05, 2013 7:37 pm

Hola, no soy amigo de las simulaciones, pero cuando tengan algún circuito electrónico puedo dar una mano.
Saludos,

Fernando
Avatar de Usuario
fer650
 
Mensajes: 81
Registrado: Jue Mar 21, 2013 7:50 pm

Re: Algoritmo de perturbacion y observacion

Notapor jcristhian_1 » Mié Abr 10, 2013 2:52 pm

Ya tengo unas placas para empezar a probar el diseño, cualquier consulta estare por aca.
Electrónica - Programación - Software Libre.
http://voltiosybytes.blogspot.com/
Avatar de Usuario
jcristhian_1
 
Mensajes: 103
Registrado: Mié Mar 27, 2013 12:54 am
Ubicación: Piura

Re: Algoritmo de perturbacion y observacion

Notapor jcristhian_1 » Mié May 29, 2013 3:02 am

No se si ponerlo aqui o en el otro post que abrieron sobre controlador de carga de Panel fotovoltaico y bateria, pero bueno ya que este tema lo inice yo, aqui lo pongo, para guardar continuidad.

Estoy colocando la simulacion en proteus de lo que pretende ser un controlador de carga, por ahora solo es un buck converter con entrada de panel fotovoltaico (modelado a traves de un diodo con unos parametros modificados) y un microcontrolador sensando tension y corriente del panel fotovoltaico y tension de salida, aun no esta del todo correcta la simulacion, falta adecuar bastante el programa, pero si alguein se anima a darle una ojeada bienvenido sea,por ahora pienso simular unicamente con una resistencia como carga, y en funcion de esta hacer un algoritmo que converja al punto de maxima potencia, tengo una placa para probar, pero he decidido probar primero en simulacion, para aclararme todas las dudas con respecto al programa.

Adjunto Archivo de SImulacion del Sistema, y archivo de simulacion de una celda/panel solar
COdigo CCS de lo que va hasta el moemnto


http://www.4shared.com/rar/u1r1yU8V/controlador.html
Electrónica - Programación - Software Libre.
http://voltiosybytes.blogspot.com/
Avatar de Usuario
jcristhian_1
 
Mensajes: 103
Registrado: Mié Mar 27, 2013 12:54 am
Ubicación: Piura

Re: Algoritmo de perturbacion y observacion

Notapor jcristhian_1 » Dom Jun 09, 2013 1:30 pm

Hola, estaba analizando el algoritmo mppt que implemente en ccs, y había encontrado varios problemas.
-Cuando parte de un valor duty cicle lejano del óptimo (por ejemplo cero), se demora mucho en encontrar el punto de máxima potencia.
-Nunca llega al valor óptimo
Código: Seleccionar todo
#INCLUDE <16F877A.h>
#device adc=10
#use delay(clock=20000000)
#fuses XT,NOWDT
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)

//!#define ESCALA_IPV 48.87 // s=5/1023 (resolución), g=0.25V/A
//!                         // la escala esta dada por s/g
//!#define ESCALA_VPV 73.3  // g=1/15V/V (atenuación por divisor resistivo)
//!                         // s=5/1023
//!#define ESCALA_VL  73.3  // g=1/15V/V, s=5/1023
#DEFINE DUTY_MAX 400
#DEFINE DUTY_MIN 100

int16 ipv,vpv, vl, vpv_prev=0;
//IPV: corriente en panel
//VPV: Tension en panel fotovoltaico
//VL: Voltaje en la carga

int32 Pot=0, Pot_prev=0; //Pot: potencia, Pot_prev: potencia previa

int16 duty; // duty cicle
int8 inc=1;   // salto minimo de duty

int16 promediador(void)
{
   int16 count, min, max, temp, acum;
   acum=0;
   count=0;                 // limpiar contador
   min=0xFFFF;              // reset min
   max=0;                   // reset max
   while(count<10)          // tomar 10 medidas
   {
      temp=READ_ADC();      // leemos adc
      delay_us(20);         // esperando a que termine de leer
        if(temp<min)        // verificar si es mas pequeño que el mas bajo valor
           min=temp;        // guardamos valor si es mas pequeño
        if(temp>max)      // verificar si valor es mayor al mas alto
            max=temp;       // guardamos el valor como mas alto   
      acum+=temp;           // añadimos el valor al acumulador
      count++;
   }
   acum-=min;           // eliminamos el valor mas alto
   acum-=max;           // eliminamos el valor mas bajo
   acum=(acum>>3);      //división entre 8 (por desplazamiento de bit)
   return acum;
}

void lectura_variables(void)
{
//leer corriente en panel fotovoltaico
set_adc_channel(3);//canal de lectura de la corriente
delay_us(20);
ipv=promediador();//sacamos promedio de medidas
//ipv-=512;    //extraemos el offset

//leer tension en panel fotovoltaico
set_adc_channel(0);//canal de lectura de la tension en PFV
delay_us(20);
vpv=promediador();//sacamos promedio de medidas

//leer tension en carga
set_adc_channel(1);//canal de lectura de la tensión en carga
delay_us(20);
vl=promediador();//sacamos promedio de medidas

Pot=(int32)(ipv)*vpv;//valor de la potencia
}
void enviar_data(void)
{
   // printf("%2.3f, %2.3f, %2.3f\r\n " ,amp,vi,vou);
    printf("%4Lu, %4Lu, %4Lu, %6Lu, %3Lu\r\n",ipv,vpv,vl,Pot,duty);
}


void config(void)
{
  setup_timer_2(T2_DIV_BY_1,99,1); //50Khz, para fosc=20mhz, duty_max=400
  setup_ccp1(CCP_PWM); 
  setup_adc_ports(AN0_AN1_AN3);
  setup_adc(ADC_CLOCK_DIV_32);
  // LEER http://ww1.microchip.com/downloads/en/devicedoc/33023a.pdf PAGINA 23-8
}

void main (void)
{
   config();   // configurando registros y puertos
   duty=264;   // duty inicial
   set_pwm1_duty(duty);
   delay_ms(15);
    while(true)
    {   
         lectura_variables();
         if(Pot>Pot_prev)
         {
            if(vpv<vpv_prev)
               duty+=inc;
            else
               duty-=inc;
         }
         else
         {
            if(vpv<vpv_prev)
               duty-=inc;
            else
               duty+=inc;
         }     
         if(duty<DUTY_MIN)
            duty=DUTY_MIN;
         if(duty>DUTY_MAX)
            duty=DUTY_MAX;
         set_pwm1_duty(duty);
         Pot_prev=Pot;
         vpv_prev=vpv;
         enviar_data();   
        // delay_ms(4);
    }
}


Esta es una hoja de calculo, donde están los datos tomados de simulación, y las iteraciones hasta encontrar el mpp (punto de máxima potencia), y luego empieza a oscilar alrededor de este, como es típico en un algoritmo de perturbación y observación.
https://docs.google.com/spreadsheet/ccc ... sp=sharing
Lo que quisiera mejorar es hacer algo que adapte el incremento del duty cicle, y si detecta que esta lejos del Punto de máxima potencia, el incremento sea mayor y disminuya a medida que se va acercando al mpp, algo así como un lazo de control, pero no se me ocurre como implementarlo y que parámetros tener en cuenta.

Acá dejo una imagen del circuito que estoy simulando.
https://docs.google.com/file/d/0B1Hz8b_ ... sp=sharing
Saludos y espero sus consejos.
Electrónica - Programación - Software Libre.
http://voltiosybytes.blogspot.com/
Avatar de Usuario
jcristhian_1
 
Mensajes: 103
Registrado: Mié Mar 27, 2013 12:54 am
Ubicación: Piura

Siguiente

Volver a Software

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados