Tengo en mente realizar un convertidor buck que pase de 12V a 5V, para el control utilizo un Arduino R4, antes de pasar a la parte física estoy llevando a cabo simulaciones en simulink. La simulación completa del convertidor buck ha sido correcta con la implementación de un controlador PI, sin embargo a la hora de simular una conexion serial bidireccional con el Arduino ( encargado de calcular el DUTY Cicle) estoy teniendo múltiples fallos y no entiendo muy bien el como solucionarlos.
Los valores que he elegido son los siguientes:
BUCK IDEAL
50KHz
Vout=12V
Vin=5V
D=0.416
Io=2A
Pout=10
AVout=0.05V
AIout=0.6A
L=100uH
C=33uF
R=2.5
El ts es de 20e-6.
Entiendo que el problema se deba al codigo o acaso no es posible llevar a cabo el proyecto?
Hola Alex, sos el mismo Alexpd de siempre?
No entiendo para que reinventar la rueda, cual es el sentido? Es solo aprendizaje o el convertidor será una parte de un sistema que luego sumará mas elementos?
Si requieres control de un DC-DC puedes hacer lo mismo con un LM2596 por ejemplo
Hola Surbyte,
El convertidor buck estará controlado por un PI por si en algun momento aumenta la carga este calcule el DUTY para poder mantener el voltaje de salida a 5V.
De momento estoy simulando un convertidor buck en simulink el cual manda y recibe datos del Arduino, este es el circuito en cuestión que he realizado.
El PI lo he calculado con la herramienta de sisotool que da matlab
Por otro lado el código que he desarrollado en Arduino es este:
( hay cosas que de momento no hacen falta como librerio pwm.h....eso lo tendre que usar mas adelante cuando haga el prototipo)
#include <pwm.h>
//Variables
int entrada=A0;
int AVout; //valor analogica de Vou
float DVout; //valor digital de Vout
float Vref=5; //señal de referencia de Vout que sera 2.5V
float DUTY;
// PARAMETROS PID DISCXRETO
float kp=0.32154486;
float ti=0.00151831986;
float Ts=20e-6; //periodo de muestreo
float u=0.0; //accion de control presente u(k)
float u_1=0.0; //accion de control pasada u(k-1)
float u_control; // en esta se gardaran los valores de u calculados en el PID
float q0,q1;
float e=0.0; //error presente e(k)
float e_1=0.0; //error un instante pasado e(k-1)
/*----------------------ESTRUCTURA DE UNION----------------------------------------*/
typedef union{
float number;
uint8_t bytes[4];
}valor;
// variable union
valor PWM;
/*---------------------------------------------------------------------------------*/
/*------------------------Configuracion de los puertos------------------------------*/
void setup()
{
//pwmPin.begin(50000.0f, 46f); //con este comando establecemos la frecuencia del pin 9 a la especificada
pinMode(13,OUTPUT);
pinMode(entrada,INPUT);
//alpha = td / (td + 1/N); //filtro de la derivada
q0=kp*(1+(Ts/(2*ti)));
q1=-kp*(1-(Ts/(2*ti)));
Serial.begin(9600);
}
/*---------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------*/
void loop()
{
if(Serial.available()>0){
DVout=recepcion();
}
u_control= PID (DVout); //llamamos a la funcion PID
DUTY=u_control;
PWM.number = DUTY;
//mandamos el valor de PWM a simulink
for (int i=0;i<4;i++)
{
Serial.write(PWM.bytes[i]);
}
}
/*---------------------------------------------------------------------------------*/
/*------------------------------FUNCION PID----------------------------------------*/
float PID (float DVout)
{
e=Vref-DVout;
//control PID
u=u_1 + q0*e + q1*e_1; // ley control PI discreto
// saturamos la accion de control a unos limites
//if (u > 1.0) u = 1.0;
//if (u < 0.0) u = 0;
// retorno a los valores reales
e_1=e;
u_1=u;
return u;
}
/*---------------------------------------------------------------------------------*/
/*------------------------FUNCION RECIBIR VALORES----------------------------------*/
float recepcion()
{
int i;
valor buf;
for(i=0;i<4;i++)
{
while (Serial.available() == 0);
buf.bytes[i] = Serial.read();
}
return buf.number;
}
/*---------------------------------------------------------------------------------*/