DSP
DSP
DSP
float w=0; //velocidad angular en rad/seg DRTM; //deshabilita interrupciones real time mode
float t=0; //variable de entrada o tiempo InitSysCtrl(); //inicializa el sistema como PLL,clocks,watcgdog
DRTM; //deshabilita interrupciones real time mode InitPieVectTable(); //inicializa tabla de interrupciones por defecto
InitPieVectTable(); //inicializa tabla de interrupciones por defecto GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Habilitar pullup en GPIO0
{ GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;
return 100*cos(angulo); // Habilitar un GPIO como salida en el GPIO6, usar el "set" para puesta a uno
longintretardo=5000000; voidmain(void) {
DRTM; //deshabilita interrupciones real time mode InitPieCtrl(); //inicializa el apoyo de interrupción de periféricos
InitSysCtrl(); //inicializa el sistema como PLL,clocks,watcgdog IER = 0x0000; //limpia máscara de interrupciones
InitPieCtrl(); //inicializa el apoyo de interrupción de periféricos IFR = 0x0000; //limpia bandera de interrupciones
IER = 0x0000; //limpia máscara de interrupciones InitPieVectTable(); //inicializa tabla de interrupciones por defecto
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0; // GPIO7 = GPIO7 for (i=0;i<60;i++){ //Los retardo son proporcionales a la velocidad de la memoria
ERTM; case 0:
IniciarSerial(); //Inicialización de los parámetros del puerto serial A LeerDSP(); // Si el comando es un CERO Leer DSP
} break;
MONITOR case 2:
voidAddrCant(void); break;
int caso=0; };
Uint32 j=0; }
voidIniciarSerial(void) voidLeerDSP(void)
{ {
scia_fifo_init(); // Inicializa el FIFO del SCI AddrCant(); //Averiguar la Dirección de memoria y cuantos datos
SendChar = 0; {
} memoria=0;
{ Direccion++;
AddrCant();
voidscia_fifo_init()
for (j=0;j<Cantidad+1;j++) // Preparar la cantidad de veces
{
{
SciaRegs.SCIFFTX.all=0xE040;
while(SciaRegs.SCIFFRX.bit.RXFFST ==0) { } // esperar a XRDY =1 estado
listo SciaRegs.SCIFFRX.all=0x204f;
#define ADC_CKPS 0x0 // ADC module clock = HSPCLK/1 = 25.5MHz/(1) EINT; //habilita interrupciones
= 25.0 MHz
ERTM;
#define ADC_MODO 0x0 // 1 es simultáneo 0 es secuencial
IniciarSerial(); //Inicialización de los parámetros del puerto serial A
#define ADC_SHCLK 0x1 // S/H ancho en periodos ADC = 2 ciclos ADC
do{ //hacer loop por lo menos una vez
longinti,k;
IteraSerial();
unsignedintResultadoADC[16];
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; //Arranque de conversión SOC por
voidmain(void) SW
EALLOW; }
#include "lab5.h"
InitSciaGpio(); // inicializa los pines scia para ser usados con su función sci
#include "monitorF28335.h"
InitPieCtrl(); //inicializa el apoyo de interrupción de periféricos
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 =
IER = 0x0000; //limpia máscara de interrupciones 150/(2*3) = 25.0 MHz
IFR = 0x0000; //limpia bandera de interrupciones #define ADC_CKPS 0x0 // ADC module clock = HSPCLK/1 = 25.5MHz/(1)
= 25.0 MHz
InitPieVectTable(); //inicializa tabla de interrupciones por defecto
#define ADC_MODO 0x0 // 1 es simultáneo 0 es secuencial
InitAdc(); // inicializa ADC
#define ADC_SHCLK 0x1 // S/H ancho en periodos ADC = 2 ciclos ADC
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; // ADC module clock =
25MHz longinti,k;
InitSciaGpio(); // inicializa los pines scia para ser usados con su función sci EINT; //habilita interrupciones
IER = 0x0000; //limpia máscara de interrupciones IniciarSerial(); //Inicialización de los parámetros del puerto serial A
IFR = 0x0000; //limpia bandera de interrupciones do{ //hacer loop por lo menos una vez
GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; ResultadoADC[1]=AdcRegs.ADCRESULT3>>4;//B
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; ResultadoADC[2]=AdcRegs.ADCRESULT15>>4;//C
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; if(ResultadoADC[0]>ResultadoADC[1]&&ResultadoADC[0]>ResultadoADC[2])
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0; {
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0; GpioDataRegs.GPADAT.bit.GPIO15=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0; }else{
GpioCtrlRegs.GPADIR.bit.GPIO15 = 1; if(ResultadoADC[1]>ResultadoADC[0]&&ResultadoADC[1]>ResultadoADC[2]){
GpioCtrlRegs.GPADIR.bit.GPIO16 = 1; GpioDataRegs.GPADAT.bit.GPIO16=1;
GpioCtrlRegs.GPADIR.bit.GPIO17 = 1; }else{
PieCtrlRegs.PIEIER1.bit.INTx6 = 1; }
InitSciaGpio(); // inicializa los pines scia para ser usados con su función sci }
// ISR para los timers de CPU GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1; //alterna estado del led
CpuTimer1Regs.TCR.all = 0x4001; // Arrancar timer T0 TSS bit = 0 AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // Arranque de conversión del ADC
CpuTimer2Regs.TCR.all = 0x4001; // Arrancar timer T0 TSS bit = 0 // El Cpu reconoce solo la interrupción
// Notar que cuando se usa .all es una instrucción directa de escritura EDIS;
// con .bit para no modificar los otros bits se lee primero y luego se escribe }
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; // ADC module clock = #define EPWM1_TIMER_TBPRD 2000 // Period register
25MHz
#define EPWM1_MAX_CMPA 1950
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Modo Secuencial:
Ancho del S/H = (2+ACQ_PS)*ADC clock en ns #define EPWM1_MIN_CMPA 50
// Reconocer la interrupción del grupo 3 para que pueda haber más EPwm1Regs.ETPS.bit.INTPRD = ET_3RD; // Generar INT en el 3er
evento
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
}
LABORATORIO 8
void IniciaEPwm1()
#include "DSP2833x_Device.h"
{
#include "DSP2833x_Examples.h"
// Configurar TBCLK
#include "lab8.h"
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // Determina el
periodo 801 TBCLKs #include "monitorF28335.h"
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Tasa del prescalador #define EPWM1_TIMER_TBPRD 2000 // Period register
del SYSCLKOUT
#define EPWM1_MAX_CMPA 1950
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
#define EPWM1_MIN_CMPA 50
// Configurar shadowing modo de sombra
#define EPWM1_MAX_CMPB 1950
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
#define EPWM1_MIN_CMPB 50
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
#define EPWM2_TIMER_TBPRD 2000 // Period register
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // cargar en
cero #define EPWM2_MAX_CMPA 1950
{ PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
InitSysCtrl(); //inicializa el sistema como PLL,clocks,watcgdog IniciarSerial(); //Inicialización de los parámetros del puerto serial A
InitEPwm2Gpio(); IteraSerial();
EALLOW; }
InitEPwm3Example(); }
EALLOW; voidpreparaLuces(void)
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; {
iniciarRegADC(); // iniciar parámetros propios para el ADC GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0; // Habilitar pullup en GPIO31
GpioDataRegs.GPADAT.bit.GPIO31 = 1; // Latch a 1 void InitEPwm1Example()
// Acknowledge this interrupt to receive more interrupts from group 3 EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Clear PWM1A on
event A, down count
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; // Set PWM1B on event B,
} up count
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
// Information this example uses to keep track
}
// of the direction the CMPA/CMPB values are EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM2A on event A,
up count
// moving, the min and max allowed values and
EPwm2Regs.AQCTLA.bit.CBD = AQ_CLEAR; // Clear PWM2A on event
// a pointer to the correct ePWM registers B, down count
epwm1_info.EPwmTimerIntCount = 0; // Zero the interrupt counter EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero
event
epwm1_info.EPwmRegHandle = &EPwm1Regs; // Set the pointer to the
ePWM module EPwm2Regs.ETSEL.bit.INTEN = 1; // Enable INT
epwm1_info.EPwmMinCMPB = EPWM1_MIN_CMPB; // moving, the min and max allowed values and
EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD; // Set timer period epwm2_info.EPwmTimerIntCount = 0; // Zero the interrupt counter
801 TBCLKs
epwm2_info.EPwmRegHandle = &EPwm2Regs; // Set the pointer to the
EPwm2Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0 ePWM module
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; {
EPwm3Regs.CMPA.half.CMPA = EPWM3_MIN_CMPA; // Set compare A // we reached the max value. If not, increase CMPA
value
// else, change directions and decrease CMPA
EPwm3Regs.CMPB = EPWM3_MAX_CMPB; // Set Compare B value
if(epwm_info->EPwm_CMPA_Direction == EPWM_CMP_UP)
// Set Actions
{
EPwm3Regs.AQCTLA.bit.PRD = AQ_SET; // Set PWM3A on period
if(epwm_info->EPwmRegHandle->CMPA.half.CMPA<epwm_info-
EPwm3Regs.AQCTLA.bit.CBD = AQ_CLEAR; // Clear PWM3A on event >EPwmMaxCMPA)
B, down count
{
EPwm3Regs.AQCTLB.bit.PRD = AQ_CLEAR; // Clear PWM3A on
period epwm_info->EPwmRegHandle->CMPA.half.CMPA++;
epwm3_info.EPwmMaxCMPB = EPWM3_MAX_CMPB; {
} }
voidupdate_compare(EPWM_INFO *epwm_info) }
// If we were increasing CMPB, check to see if return;
// else, change directions and decrease CMPB UNO DE LOS PRIMEROS LABOS
} GpioDataRegs.GPBTOGGLE.bit.GPIO60 = 1; // Modificar
alternando estado de GPIO60
else
GpioDataRegs.GPBTOGGLE.bit.GPIO61 = 1; // Modificar
{ alternando estado de GPIO61
} GpioDataRegs.GPCTOGGLE.bit.GPIO64 = 1; // Modificar
alternando estado de GPIO64
else
GpioDataRegs.GPCTOGGLE.bit.GPIO65 = 1; // Modificar
{ alternando estado de GPIO65
} GpioDataRegs.GPCTOGGLE.bit.GPIO65 = 1; // Modificar
alternando estado de GPIO65
}
GpioDataRegs.GPCTOGGLE.bit.GPIO66 = 1; // Modificar
}
alternando estado de GPIO66
{
GpioDataRegs.GPCTOGGLE.bit.GPIO66 = 1; // Modificar
alternando estado de GPIO66
epwm_info->EPwmTimerIntCount++;
GpioDataRegs.GPCTOGGLE.bit.GPIO67 = 1; // Modificar
}
alternando estado de GPIO67
GpioDataRegs.GPCTOGGLE.bit.GPIO65 = 1; // Modificar 15) Para correr el programa hacer click en la flecha verde (F8)
alternando estado de GPIO62
PRIMEROS LABOS
GpioDataRegs.GPCTOGGLE.bit.GPIO64 = 1; // Modificar
alternando estado de GPIO63 //Pull up y Multiplexor de los pines
EDIS;
GpioDataRegs.GPBDAT.bit.GPIO60 = 0; // GPIO60=0
GpioDataRegs.GPBDAT.bit.GPIO61 = 0; // GPIO61=0
GpioDataRegs.GPBDAT.bit.GPIO62 = 0; // GPIO62=0
GpioDataRegs.GPBDAT.bit.GPIO63 = 0; // GPIO63=0
GpioDataRegs.GPCDAT.bit.GPIO64 = 0; // GPIO64=0
GpioDataRegs.GPCDAT.bit.GPIO65 = 0; // GPIO65=0
GpioDataRegs.GPCDAT.bit.GPIO66 = 0; // GPIO66=0
GpioDataRegs.GPCDAT.bit.GPIO67 = 0; // GPIO67=0
EINT;
ERTM;
while(1){