Você está na página 1de 7

#include "DSP2833x_Device.

h"
#include "DSP2833x_Examples.h"
#include "lab7.h"
#define
MHz
#define
5.0 MHz
#define
#define

ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)


ADC_CKPS

0x0

ADC_MODO 0x0
ADC_SHCLK 0x1

// ADC module clock = HSPCLK/1

= 25.5MHz/(1)

// 1 es simultneo 0 es secuencial
// S/H ancho en periodos ADC = 2 ciclos ADC

unsigned int ResultadoADC[16];


float
float
float
float

de=0;
e=0;
ea=0;
ie=0;

float Ref=100;
float senal=0;
//Periodo de muestreo
float T=0.001;
float u=0;
unsigned int kp=10;
unsigned int kd=0.1;
unsigned int ki=0.01;
unsigned int nveces=10;
unsigned int i=0;
unsigned int flag_run_PID=0;
void
void
void
void
void
void

= 25.0

IniciaEPwm5(void);
IniciaEPwm6(void);
iniciarRegADC(void);
cpu_timer0_isr(void);
cpu_timer1_isr(void);
cpu_timer2_isr(void);

void main(void){
DINT;
//deshabilita interrupciones
DRTM;
//deshabilita interrupciones real time mode
InitSysCtrl();
//inicializa el sistema como PLL,clocks,watcgdog
InitEPwm5Gpio();
InitSciaGpio();
// inicializa los pines scia para ser usados con su funcin sci
InitPieCtrl();
//inicializa el apoyo de interrupcin de perifricos
IER = 0x0000;
//limpia mscara de interrupciones
IFR = 0x0000;
//limpia bandera de interrupciones
InitPieVectTable();

= 2

//inicializa tabla de interrupciones por defecto


EALLOW;
// Habilita cambio de registros
SysCtrlRegs.HISPCP.all = ADC_MODCLK;
K = SYSCLKOUT/ADC_MODCLK = 25MHz
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
PieVectTable.TINT0 = &cpu_timer0_isr;
r a subrutina interrupt de timer0
EDIS;
// Deshabilita cambio de registros
InitAdc();
// inicializa ADC
iniciarRegADC();
// iniciar parmetros propios para el ADC
InitCpuTimers();
// inicializa los Cpu Timers
ConfigCpuTimer(&CpuTimer0, 150, 1000);
MHz 1000uSeg = 1ms
CpuTimer0Regs.TCR.all = 0x4001;
// Arrancar timer T0 TSS bit = 0
IER = M_INT1| M_INT13;
// Interrupciones 1 y 13
IER |= M_INT14;
// Aumentar interrupcin 14
IER |= M_INT3;
// Interrupcin 3
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// la interrupcin TINT0 pasa por el PIE
XIntruptRegs.XNMICR.bit.SELECT= 0;
// asegura que TINT1 est conectado a INT13 y no XNMI
//PWM para Control de Temperatura
IniciaEPwm5();
//PWM para Velocidad del Motor
IniciaEPwm6();
EINT;
//habilita interrupciones
ERTM;
EALLOW;
//------>Salidas
//Valvula A
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0= 1;
//Valvula B
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
//Valvula C
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;

// HSPCL
//apunta

// a 150

GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
//Valvula D--> PWM
//Valvula E
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO3 = 1;
//Switch K
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO4 = 1;
//----->Entradas
//Nivel A
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO5 = 0;
//Nivel 1
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO6 = 0;
//Nivel 2
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO7 = 0;
//Nivel 3
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO8 = 0;
//RUN
GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO11 = 0;
EDIS;
//Proceso de Preparacion
do{
//Pregunta si el boton de RUN ha sido presionado
while(GpioDataRegs.GPADAT.bit.GPIO11==0){}
//Una vez presionado el Boton
//Revisa que el nivel este en cero
if(GpioDataRegs.GPADAT.bit.GPIO5!=0){
//Abre la Valvula de Salida
GpioDataRegs.GPADAT.bit.GPIO3==1;
}

//Espera hasta que termine de Descargar


while(GpioDataRegs.GPADAT.bit.GPIO5==0){}
//Se asegura que todas las valvulas y Switch esten cerrados
//Valvula A
GpioDataRegs.GPACLEAR.bit.GPIO0= 1;
//Valvula B
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
//Valvula C
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
//Valvula E
GpioDataRegs.GPACLEAR.bit.GPIO3 = 1;
//Switch K
GpioDataRegs.GPACLEAR.bit.GPIO4 = 1;
for(i=0;i<nveces;i++){
//Comienza el proceso de llenado
//Abre Valvula A
GpioDataRegs.GPASET.bit.GPIO0= 1;
//Espera hasta nivel 1
while(GpioDataRegs.GPADAT.bit.GPIO6==0){}
//Apaga Valvula A
GpioDataRegs.GPACLEAR.bit.GPIO0= 1;
//Abre la Valvula C
GpioDataRegs.GPASET.bit.GPIO1= 1;
//Espera hasta nivel 2
while(GpioDataRegs.GPADAT.bit.GPIO7==0){}
//Apaga Valvula C
GpioDataRegs.GPACLEAR.bit.GPIO1= 1;
//Abre la Valvula D
GpioDataRegs.GPASET.bit.GPIO2= 1;
//Espera hasta nivel 3
while(GpioDataRegs.GPADAT.bit.GPIO8==0){}
//Apaga Valvula D
GpioDataRegs.GPACLEAR.bit.GPIO2= 1;
//Activa el Batidor K
GpioDataRegs.GPASET.bit.GPIO4= 1;
//Establece su velocidad de Giro
//Sube la Temperatura por PID
//Activa el control por PID
flag_run_PID=1;
//Velocidad 500 rpm
EPwm6Regs.CMPA.half.CMPA = 418;
//Espera hasta que la temperatura llega a 90C
while(senal<90){}
//Desactiva el control por PID
flag_run_PID=0;
//Apaga el Motor y Apaga la VD
GpioDataRegs.GPACLEAR.bit.GPIO4= 1;
//Deja enfriar la mezcla hasta 40C
//Velocidad 100 rpm
EPwm6Regs.CMPA.half.CMPA = 83;

while(senal>40){
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
//Arranque de conversin SOC por SW
while(AdcRegs.ADCST.bit.SEQ1_BSY ==1) {}
//Esperar a que termine
ResultadoADC[0]= AdcRegs.ADCRESULT13>>4;
//Leer resultados
senal=(3.0*ResultadoADC[0]/4096.0)*150/3;
};
//Abre la Valvula E
GpioDataRegs.GPASET.bit.GPIO3= 1;
//Espera hasta que descarge
while(GpioDataRegs.GPADAT.bit.GPIO5==0){}
//Apaga la valvula
GpioDataRegs.GPACLEAR.bit.GPIO3= 1;
}
}while(1);
}
interrupt void cpu_timer0_isr(void){
if (flag_run_PID==1){
EALLOW;
CpuTimer0.InterruptCount++;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
cer interrupt grupo1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
//Arranque de conversin SOC por SW
while(AdcRegs.ADCST.bit.SEQ1_BSY ==1) {};
r a que termine
ResultadoADC[0]= AdcRegs.ADCRESULT13>>4;
esultados

// Calculando
// Calculando
// Calculando
// Calculando

senal=(3.0*ResultadoADC[0]/4096.0)*150/3;
//Guarda el error anterior
ea=e;
//Calcula el nuevo error
e = Ref-senal;
la seal del error
//Calcula la derivada del error
de = (e-ea)/T;
derivada del error
//Calcula la integral del error
ie = ie+T*(e+ea)/2;
integral del error
//Calcula la salida del sistema
u= kp*e+kd*de+ki*ie;
la seal de control
//PWM5
u=abs(u);
EPwm5Regs.CMPA.half.CMPA =u/1000;

}
}
//Motor Batidor
void IniciaEPwm6(){

//Recono

//Espera
//Leer r

EPwm6Regs.TBPRD = 837;

// Determina el periodo del de 10 ms

EPwm6Regs.TBPHS.half.TBPHS = 0x0000;
EPwm6Regs.TBCTR = 0x0000;
EPwm6Regs.CMPA.half.CMPA = 100;
EPwm6Regs.CMPB = 100;

// La fase es 0
// Contador a cero
// Dar valor al comparador A
// Dar valor al comparador B

EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Contar hacia arriba y al llegar


al periodo igual a cero
EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV128;
SYSCLKOUT
EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV14;
EPwm6Regs.CMPCTL.bit.SHDWAMODE
EPwm6Regs.CMPCTL.bit.SHDWBMODE
EPwm6Regs.CMPCTL.bit.LOADAMODE
EPwm6Regs.CMPCTL.bit.LOADBMODE

=
=
=
=

// Deshabilitar carga de fase


// Tasa del prescalador del

CC_SHADOW;
CC_SHADOW;
CC_CTR_ZERO; // cargar en cero
CC_CTR_ZERO;

EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR;
ntar arriba
EPwm6Regs.AQCTLA.bit.ZRO = AQ_SET;
ar arriba
}

// Set PWM1A en evento A, co


// Set PWM1B en evento B, cont

//Valvula D (Calentador)
void IniciaEPwm5(){
EPwm5Regs.TBPRD = 10000;

// Determina el periodo del PWM

EPwm5Regs.TBPHS.half.TBPHS = 0x0000;
EPwm5Regs.TBCTR = 0x0000;
EPwm5Regs.CMPA.half.CMPA = 500;
EPwm5Regs.CMPB = 5000;

// La fase es 0
// Contador a cero
// Dar valor al comparador A
// Dar valor al comparador B

EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Contar hacia arriba y al llegar


al periodo igual a cero
EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
SCLKOUT
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm5Regs.CMPCTL.bit.SHDWAMODE
EPwm5Regs.CMPCTL.bit.SHDWBMODE
EPwm5Regs.CMPCTL.bit.LOADAMODE
EPwm5Regs.CMPCTL.bit.LOADBMODE

=
=
=
=

// Deshabilitar carga de fase


// Tasa del prescalador del SY

CC_SHADOW;
CC_SHADOW;
CC_CTR_ZERO; // cargar en cero
CC_CTR_ZERO;

EPwm5Regs.AQCTLA.bit.CAU = AQ_CLEAR;
ntar arriba
EPwm5Regs.AQCTLA.bit.ZRO = AQ_SET;
ar arriba
}

// Set PWM1A en evento A, co


// Set PWM1B en evento B, cont

void iniciarRegADC(void){
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
H = (2+ACQ_PS)*ADC clock en ns
// En modo simultneo sera: = (3+ACQ_PS)*ADC
AdcRegs.ADCTRL3.bit.SMODE_SEL = ADC_MODO;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
Modo cascada
AdcRegs.ADCTRL1.bit.CONT_RUN = 0;
a modo continuo
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;
ap around ADCRESULT
//Secuencia de seleccion
AdcRegs.ADCCHSELSEQ1.all
AdcRegs.ADCCHSELSEQ2.all
AdcRegs.ADCCHSELSEQ3.all
AdcRegs.ADCCHSELSEQ4.all

de ADC
= 0x3210;
= 0x7654;
= 0xBA98;
= 0xFEDC;

AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0xF;

// ADC module clock = 25MHz


// Modo Secuencial: Ancho del S/
clock en ns
// Secuencial
// 1 Modo cascada -->Selecciona
// 0 Modo contnuo -->No seleccion
// Deshabilitar Override, sin wr

// Selecionar canales 0-1-2-3

// Convertir y guardar 16 canale

s
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0;
cin SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
ial del ADC
}

// No habilitar interrup
// Arranque inic

Você também pode gostar