You are on page 1of 4

C:\Users\user\Desktop\backup usb 081215\MT418\dsp_semana_10.c sbado, 12 de diciembre de 2015 10:55 a.m.

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "lab6.h"
#include "monitorF28335.h"

int resultado[2];
double temp;
const double temp_ref=80.0;
double Ts=1.0;

double error, error_anterior;


double senal, senal_integral, senal_derivativa, senal_proporcional;
long int senal_pwm_entera;

const double Kp=1.0;


const double Ki=10.0;
const double Kd=0.20;

void tmr0_isr(void);

void main(void)
{
/*****************************************************/
/*CONFIGURACION INICIAL*/
/*****************************************************/

DINT;
DRTM;
InitSysCtrl();
EALLOW;
SysCtrlRegs.HISPCP.all = 0x3;
EDIS;

/*****************************************************/
/*CONFIGURACION INTERRUPCIONES*/
/*****************************************************/

InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();

EALLOW;
// Direcciona la interrupcin TINT0 hacia la direccin &cpu_timer0_isr
PieVectTable.TINT0 = &tmr0_isr;
EDIS;

// Habilitar interrupcin N6 de grupo 1 (INT1.6)


PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // a nivel perifrico
IER |= M_INT1; // a nivel CPU

/*****************************************************/
/*CONFIGURACION ADC*/
/*****************************************************/

InitAdc();
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x4;
AdcRegs.ADCTRL1.bit.ACQ_PS = 1;

AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
AdcRegs.ADCTRL1.bit.CONT_RUN = 0;
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;

-1-
C:\Users\user\Desktop\backup usb 081215\MT418\dsp_semana_10.c sbado, 12 de diciembre de 2015 10:55 a.m.
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01;

AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x1;

/*****************************************************/
/*CONFIGURACION TIMER*/
/*****************************************************/

// Inicializa los CpuTimers


InitCpuTimers();
// Configura frecuencia y nmero de conteos: 150MHz, 1000000uSeg = 1segundo
ConfigCpuTimer(&CpuTimer0, 150, 1000000);
CpuTimer0Regs.TCR.all = 0x4001; // Arrancar timer T0 TSS bit = 0

/*****************************************************/
/*CONFIGURACION PWM*/
/*****************************************************/

EALLOW;
// Detiene los EPWM
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;

// Multiplexor de GPIO -> EPWMA1 (O)


GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // 0->GPIO, x->(revisar datasheet)

// Tasa del prescalador del SYSCLKOUT


// TBCLK = SYSCLKOUT/(1*10) = 15Mhz
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 5;
EPwm1Regs.TBCTL.bit.CLKDIV = 0;
// Determina el periodo 15000 TBCLKs
// T = (TBPRD+1)*(1/TBCLK) = 15000*1/(15Mhz) = 1ms
EPwm1Regs.TBPRD = 14999;

// La fase es 0
EPwm1Regs.TBPHS.half.TBPHS = 0x0000;
// Deshabilitar carga de fase
EPwm1Regs.TBCTL.bit.PHSEN = 0;

// Contador a cero
EPwm1Regs.TBCTR = 0x0000;

// Dar valor al comparador A


EPwm1Regs.CMPA.half.CMPA = 0;

// Configurar modo de conteo


// Contar hacia arriba y al llegar al periodo igual a cero
EPwm1Regs.TBCTL.bit.CTRMODE = 0;

// Configurar shadowing
// Modo shadow (la escritura se hace sobre la sombra)
EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;
// La sincronizacin sombra->real se hace cuando el CTR es 0
EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;

// Configurar acciones
// Contador es CMPA -> Pone a 0 la senal
EPwm1Regs.AQCTLA.bit.CAU = 2;
// Contador es 0 -> Pone a 1 la senal
EPwm1Regs.AQCTLA.bit.ZRO = 2;

EALLOW;
-2-
C:\Users\user\Desktop\backup usb 081215\MT418\dsp_semana_10.c sbado, 12 de diciembre de 2015 10:55 a.m.
// Sincroniza todos los EPWM y los activa
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;

/*****************************************************/
/*CONFIGURACION FINAL*/
/*****************************************************/

EINT; //habilita interrupciones


ERTM;

/*****************************************************/
/*BUCLE INFINITO*/
/*****************************************************/

do
{

}
while(1); //Itera infinitamente
}

interrupt void tmr0_isr(void)


{
// Comienzo de secuencia de conversin
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
// Mientras el DSC est ocupado realizando las conversiones
while(AdcRegs.ADCST.bit.SEQ1_BSY){};
resultado[0] = AdcRegs.ADCRESULT0>>4;
resultado[1] = AdcRegs.ADCRESULT1>>4;

// Escalamiento a temperatura real


temp = ((resultado[0]+resultado[1])/2/4095.0*3.0)/2.5*100.0;
// Clculo del error
error = temp_ref-temp;

// Clculo de la senal de control

// Mtodo del trapecio para la componente integral


senal_proporcional = Kp*error;
senal_integral = senal_integral+Ki*(error+error_anterior)*Ts/2.0;
senal_derivativa = Kd*(error-error_anterior)/Ts;
// Suma de todas las componentes (comp. derivativa por Euler)
senal = senal_proporcional+senal_derivativa+senal_integral;
// Escalamiento de temperatura a PWM
/* Equivalencias:
1V en el actuador <-> 100C (Con 1V, la salida del sistema en S.S. aumenta en 100C)
3V en el actuador <-> CMPA = 15000 - 1*/
senal_pwm_entera = senal/100/3*15000;
// Anti-windup simple
if (senal_pwm_entera>15000)
{
senal_pwm_entera=15000;
}
else if (senal_pwm_entera<0)
{
senal_pwm_entera=0;
}

// Salida
EPwm1Regs.CMPA.half.CMPA = senal_pwm_entera;

// Actualizaciones
error_anterior=error;
-3-
C:\Users\user\Desktop\backup usb 081215\MT418\dsp_semana_10.c sbado, 12 de diciembre de 2015 10:55 a.m.

// Acknowledge interrupt to PIE


PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
return;
}

-4-

You might also like