Documentos de Académico
Documentos de Profesional
Documentos de Cultura
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "lab7.h"
#include "monitorF28335.h"
#define EPWM_CMP_UP 1
#define EPWM_CMP_DOWN 0
unsigned int i;
float u,v,ep,epa,kpp,kip,kdp,pr,kip,dt,ip,ipa,p,pa,w,ew;
void main(void)
{
DINT; //deshabilita interrupciones
DRTM; //deshabilita interrupciones real time mode
InitSysCtrl(); //inicializa el sistema como PLL,clocks,watcgdog
InitEPwm1Gpio();
InitSciaGpio(); // inicializa los pines scia para ser usados con su función sci
InitPieCtrl(); //inicializa el apoyo de interrupción de periféricos
IER = 0x0000; //limpia máscara de interrupciones
IFR = 0x0000; //limpia bandera de interrupciones
InitPieVectTable(); //inicializa tabla de interrupciones por defecto
// ISR para los timers de CPU
EALLOW; // Habilita cambio de registros
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=0;
EQep1Regs.QEPCTL.bit.SEI=2; // Inicializa el
contador de posición cuando hay un
EQep1Regs.QEPCTL.bit.IEI=0; // flanco de
subida en el STROBE (para el efecto rebote)
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=0xffffffff; //0xffffffff
EQep1Regs.QUPRD=0xffffffff; //0xffffffff
EQep1Regs.QPOSINIT=0;
IniciaEPwm1();
InitCpuTimers(); // inicializa los Cpu Timers
ConfigCpuTimer(&CpuTimer0, 150, 5000); // a 150MHz 5000useg=5ms
ConfigCpuTimer(&CpuTimer1, 150, 5000); // a 150MHz 4500000uSeg = 4.5segundos
ConfigCpuTimer(&CpuTimer2, 150, 100000); // a 150MHz 100000uSeg = 0.1segundos
CpuTimer0Regs.TCR.all = 0x4001; // Arrancar timer T0 TSS bit = 0
CpuTimer1Regs.TCR.all = 0x4001; // Arrancar timer T0 TSS bit = 0
CpuTimer2Regs.TCR.all = 0x4001; // Arrancar timer T0 TSS bit = 0
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
//IER |= M_INT3; // Interrupción 3
//PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
void IniciaEPwm1()
{
//configurado para 1mseg en el PWMA
//queremos que el PWM cuando este en 0, este alto
// Configurar TBCLK
EPwm1Regs.TBPRD = 25000; // Determina el periodo 801 TBCLKs
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // La fase es 0
EPwm1Regs.TBCTR = 0x0000; // Contador a cero
// Configurar acciones
EPwm1Regs.AQCTLA.bit.ZRO = 2; // PWMA en zero inicializa alto
EPwm1Regs.AQCTLA.bit.CAU = 1; // PWMA en el comparador, baja a zero
ip = ipa + ep*kip*dt;
u = ip+ep*kpp;
ipa=ip;
pa = p;
if (u>12){
u=12;
v=u;
}
if (u<-12){(
u=-12);
v=-u;
}
if (u<-0){
v=-u;
}
else{
v=u;
}
if (u>=0){
EPwm1Regs.AQCTLA.bit.CBU = 1; // Set PWM1A en evento A, contar
arriba
EPwm1Regs.AQCTLA.bit.PRD = 2; // Clear PWM1A en evento A, contar
abajo
EPwm1Regs.AQCTLB.bit.CBU = 2; // Set PWM1B en evento B, contar
arriba
EPwm1Regs.AQCTLB.bit.PRD = 1;
GpioDataRegs.GPADAT.bit.GPIO2 = 1;
}
else{
EPwm1Regs.AQCTLA.bit.CBU = 2; // Set PWM1A en evento A, contar
arriba
EPwm1Regs.AQCTLA.bit.PRD = 1; // Clear PWM1A en evento A, contar
abajo
EPwm1Regs.AQCTLB.bit.CBU = 1; // Set PWM1B en evento B, contar
arriba
EPwm1Regs.AQCTLB.bit.PRD = 2;
GpioDataRegs.GPADAT.bit.GPIO2 = 1;
}
if ((ep<2) & (ep>-2)){
GpioDataRegs.GPADAT.bit.GPIO2 = 0;
}
EPwm1Regs.CMPB=(unsigned int)(v*20000/12.0);
//EPwm1Regs.CMPB=5000;
EDIS;
}