Escolar Documentos
Profissional Documentos
Cultura Documentos
h"
#include "DSP2833x_Examples.h"
#include "lab7.h"
#define
MHz
#define
5.0 MHz
#define
#define
0x0
ADC_MODO 0x0
ADC_SHCLK 0x1
= 25.5MHz/(1)
// 1 es simultneo 0 es secuencial
// S/H ancho en periodos ADC = 2 ciclos ADC
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
// 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;
}
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;
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
=
=
=
=
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
}
//Valvula D (Calentador)
void IniciaEPwm5(){
EPwm5Regs.TBPRD = 10000;
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
=
=
=
=
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
}
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;
s
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0;
cin SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
ial del ADC
}
// No habilitar interrup
// Arranque inic