Sie sind auf Seite 1von 5

C:\Users\user\Desktop\backup usb 081215\MT418\lab6.c sbado, 12 de diciembre de 2015 10:50 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;

double error, error_anterior;


double senal, senal_integral, senal_derivativa, senal_proporcional;
long int senal_pwm_entera;
double Kp, Ki, Kd;

const int res_encoder = 108;


long int pulsos, pulsos_act, pulsos_ant;
double w_rpm_ref, w_rpm;

void tmr0_isr(void);

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

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

EALLOW;

/* Enable internal pull-up for the selected pins */


// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.

GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Enable pull-up on GPIO0 (EPWM1A)


GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pull-up on GPIO1 (EPWM1B)

/* Configure ePWM-1 pins using GPIO regs*/


// This specifies which of the possible GPIO pins will be ePWM1 functional pins.
// Comment out other unwanted lines.

GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A


GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B

EDIS;

/*****************************************************/
/*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;
-1-
C:\Users\user\Desktop\backup usb 081215\MT418\lab6.c sbado, 12 de diciembre de 2015 10:50 a.m.
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01;

AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x1;

/*****************************************************/
/*CONFIGURACIN DEL EQEP*/
/*****************************************************/

// Configuracin de multiplexores para entradas EQEP


EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // EQEP1A (I)
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // EQEP1B (I)
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 1; // EQEP1S (I/O)
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // EQEP1I (I/O)
EDIS;
//
EQep1Regs.QDECCTL.bit.QSRC = 0;
EQep1Regs.QDECCTL.bit.SOEN = 0;
EQep1Regs.QDECCTL.bit.SPSEL = 0;
EQep1Regs.QDECCTL.bit.XCR = 0;
EQep1Regs.QDECCTL.bit.IGATE = 0;
EQep1Regs.QDECCTL.bit.QAP = 0;
EQep1Regs.QDECCTL.bit.QBP = 0;
EQep1Regs.QDECCTL.bit.QIP = 0;
EQep1Regs.QDECCTL.bit.QSP = 0;

//
EQep1Regs.QEPCTL.bit.PCRM=2;
EQep1Regs.QEPCTL.bit.SEI=0;
EQep1Regs.QEPCTL.bit.IEI=0;
EQep1Regs.QEPCTL.bit.SWI=0;
EQep1Regs.QEPCTL.bit.SEL=0;
EQep1Regs.QEPCTL.bit.IEL=0;
EQep1Regs.QEPCTL.bit.QPEN=1;
EQep1Regs.QEPCTL.bit.QCLM=0;
EQep1Regs.QEPCTL.bit.UTE=1;
EQep1Regs.QEPCTL.bit.WDE=0;
EQep1Regs.QPOSMAX=0x0000ffff;
EQep1Regs.QUPRD=0x0000ffff;

/*****************************************************/
/*VALORES A INICIALIZAR*/
/*****************************************************/

Ts = 0.001;

Kp = 1.0;
Ki = 0.0;
Kd = 0.0;

w_rpm_ref=1000.0;

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

// Inicializa los CpuTimers


InitCpuTimers();
// Configura frecuencia y nmero de conteos: 150MHz, 1000000uSeg = 1segundo
ConfigCpuTimer(&CpuTimer0, 150, 1000);
CpuTimer0Regs.TCR.all = 0x4001; // Arrancar timer T0 TSS bit = 0
-2-
C:\Users\user\Desktop\backup usb 081215\MT418\lab6.c sbado, 12 de diciembre de 2015 10:50 a.m.

/*****************************************************/
/*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 PWM*/
/*****************************************************/

EALLOW;
// Detiene los EPWM
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
/*
// Multiplexor de GPIO -> EPWMA1 (O)
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // 0->GPIO, x->(revisar datasheet)
EDIS;
*/
// 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.all = 100;

// 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
-3-
C:\Users\user\Desktop\backup usb 081215\MT418\lab6.c sbado, 12 de diciembre de 2015 10:50 a.m.
EPwm1Regs.AQCTLA.bit.CAU = 1;
// Contador es 0 -> Pone a 1 la senal
EPwm1Regs.AQCTLA.bit.ZRO = 2;

EALLOW;
// 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)


{
pulsos = EQep1Regs.QPOSCNT;
pulsos_act = pulsos-pulsos_ant;
w_rpm = pulsos_act/Ts/(4*res_encoder)*60;

error = w_rpm_ref-w_rpm;

// Mtodo del trapecio para la componente integral


senal_integral = senal_integral+(error+error_anterior)*Ts/2.0;
// Suma de todas las componentes (comp. derivativa por Euler)
senal = Kp*error+Kd*(error-error_anterior)/Ts+Ki*senal_integral;
// Escalamiento de rapidez angular a PWM
/* Equivalencias:
3V en el actuador <-> 2200 RPM
3V en el actuador <-> CMPA = 15000 - 1 */
senal_pwm_entera = senal/2200*15000;

/*

// 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;
-4-
C:\Users\user\Desktop\backup usb 081215\MT418\lab6.c sbado, 12 de diciembre de 2015 10:50 a.m.
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=100;
}

// Salida
EPwm1Regs.CMPA.all = senal_pwm_entera;

// Actualizaciones
error_anterior = error;

pulsos_ant = pulsos;

// Acknowledge interrupt to PIE


PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
return;
}

-5-

Das könnte Ihnen auch gefallen