You are on page 1of 3

Mara Jess Valverde Lpez

Mehdi Elidrissi
En esta prctica hemos intentado implementar un seguidor de mxima potencia (MPPT)
de forma sencilla.
El hardware que hemos utilizado, ha sido un circuito buck o reductor, con dos co
ndensadores en paralelo, un diodo en serie en la entrada y otro en paralelo con
un switch o transistor (el IRF540 utilizado en las prcticas de electrnica de poten
cia) y por ltimo una carga puramente resistiva. El reductor tiene un voltaje de s
alida Vo=Vi*D, donde la D representa el duty cycle (relacin entre la parte alta y
baja de la seal cuadrada), la puerta del transistor, est conectada a una de las s
alidas digitales de una tarjeta microcontroladora
Arduino uno, que enva una seal PWM (Pulse width modulation), por el pin 9, en el q
ue previamente se ha utilizado un timer (el timer 2) para configurar la seal cuad
rada a 31372.55 Hz. Esta tarjeta est conectada a su vez por el pin 5, configurad
o como entrada analgica para leer el voltaje de salida del panel fotovoltaico que
se alimenta con diodos leds con una fuente de alimentacin variable.
El objetivo era disear un programa en el ensamblador de Arduino, para medir el vo
ltaje y obtener la potencia, dado que la carga solo es resistiva, el clculo de la
potencia ser: Vo^2/Rl; con estos dos parmetros hay que implementar un algoritmo
de bsqueda del punto de mxima potencia. Como solo medimos el voltaje variando el c
iclo de trabajo, obtendremos un voltaje diferente y una potencia diferente a la
que nos proporciona el panel fotovoltaico, estas medidas se van almacenando en u
n vector que se declara al principio, y se reinicializa al llegar al maximo del
vector que en este caso son 1000 posiciones de memoria. El algoritmo implementad
o ha sido el de perturbar y observar, en el que se va aumentando y disminuyendo
el ciclo de trabajo hasta que
la potencia que conseguimos con referencia a la anterior es maxima, el diagrama
de flujo de este algoritmo es el siguiente:
Inicializacion,
1.medir V[k]por el pin 5 con la funcion analogRead.
2.Calcular P[k] con la expresion V[k]^2/Rl,
3.1Si la potencia en ese instante es mayor que en la anterior
3.1.1y si ademas el voltaje en ese instante es mayor que en el anterior
3.1.1 Se incrementa el duty consiguiendo subir el voltaje(por que en este cas
o es reductor)
Este paso se realiza en todo el bucle condicional: se establece v[k-1]=v[k] y P[
k-1]=P[k]
3.1.2 Si el voltaje no es mayor que el anterior se decrementa el duty, reducien
do el voltaje
3.2Si la potencia no es mayor que en instante anterior y ademas el voltaje no es
mayor que el anterior,
3.2.1se incrementa el duty
Si la potencia no es mayor que en instante anterior y ademas el voltaje es mayo
r que el anterior,
3.2.2se decrementa el duty
int pwm = 9; // the pin that drives de MOS
int volt=5;// el pin analogico de lectura de voltaje
int R=100;// valor pequeo de la resistencia de carga
int k=1;// indexador para los vectores
double P[1000];//vector de potencia
double V[1000];// vector de voltaje
int duty = 100; // duty (from 0 to 255)
int inc_duty = 5; // how many points to increment duty
void setup() {
// declare pin 9 to be an output:
pinMode(pwm, OUTPUT);
TCCR2B = TCCR2B & B11111000 | B00000001; // set timer 2 divisor for PWM freque
ncy of 31372.55 Hz
Serial.begin(9600);//latencia de actualizacio de los datos de entrada
Serial.println("duty V[k] V[k-1]");// informacion de salida en el serial del a
rduino
Serial.println("P[k] P[k-1] Duty inc_Duty");//informacion de salida en el seri
al del arduino
}
// the loop routine runs over and over again forever:
void loop() {
V[k]=analogRead(volt);//lectura analogica del voltaje
P[k]=V[k]*V[k]/R;//o V[k//potencia calculada con la expresion de la resistenci
a
V[k-1]=V[k];//reubicacion de los valores en el vector, este paso se repite en
todas la partes del bucle
P[k-1]=P[k];
if(k=1000){k=1;}//reinicializacion de la variable de indexacion
if ((P[k]>P[k-1])){//paso 3.1 del diagrama de flujo
if (V[k]>V[k-1]){//paso 3.1.1

duty=duty+inc_duty;
digitalWrite(pwm, duty);
V[k-1]=V[k];
P[k-1]=P[k];
k++;
}
else if(V[k]<V[k-1]){//paso 3.1.2
duty=duty-inc_duty;
digitalWrite(pwm, duty);
V[k-1]=V[k];
P[k-1]=P[k];
k++;
}
}
else if(P[k]<P[k-1]){//paso 3.2 del diagrama de flujo
if(V[k]>V[k-1]){//paso 3.2.1
duty=duty-inc_duty;
digitalWrite(pwm, duty);
V[k-1]=V[k];
P[k-1]=P[k];
k++;
}
else if(V[k]<V[k-1]){//paso 3.2.2
duty=duty+inc_duty;
digitalWrite(pwm, duty);
V[k-1]=V[k];
P[k-1]=P[k];
k++;
}
}
} // put your setup code here, to run once:
// Rsm=Ns*Rs/Np;
Ipv=(Isc+Ki*(T-Tn))*H;
Io=((Isc+Ki*(T-Tn))/(e^((Voc+Kv*(T-Tn))/a*Ns*Vt)-1));
I=Np*Ipv-Np*Io*(e^((q*(V+I*Rsm)/(Ns*K*Ta)))-1)

//where, Ipv is a light-generated current or


//photocurrent, Io is the cell saturation current at dark
//time, q (= 1.6 10-19 C) is an electron charge, K (=
//1.38 10-23J/K) is a Boltzmann s constant, T is the cell s working temperature, a is an
ideality factor, RSh is a shunt resistance,
//and RS is a series resistance of solar cell. where, ISC is the PV cell s short-c
ircuit current at a 25C and 1kW/m2 Ki is the cell s short-circuit
//current temperature coefficient, Tn is the cell s
//reference temperature, and H is the solar irradiation
//in kW/m2
//where, VOC is the cell s open circuit current at a
//25C and 1kW/m2
//KV is the cell s open circuit
//voltage temperature coefficient, NS is the number of
//cells connected in series per string, Vt is the thermal
//voltage given by, Vt = KT/q.
// The terminal equation of PV array for the
//current is given as,
//where , Ns is number cells in series
//and Np is the number cells in parallel. the setup routine runs once when you p
ress reset:

You might also like