Sunteți pe pagina 1din 18

1) hacer un programa que mida la temperatura de 0-300 C de un sensor que da de 0.5-2.

5 voltios por las entradas


analgicas ADCB5, ADCB3 y ADCA2 (utilizar el promedio), para hacer un controlador PID con un periodo de muestreo de
800 microsegundos con el timer 4 para mantener estable la temperatura de acuerdo a una variable de referencia.
Entregar la seal de control en forma de PWM simple con un periodo de muestreo de 250 microsegundos con el timer
3, en donde se necesita 0.7-2.3 voltios para cerrar totalmente abrir totalmente la valvula de vapor. Los coeficientes
del controlador deben ser configurables a travs de variables. La seal HSPCLK es 130 Mhz. El control se debe realizar
cuando se presiona un botn conectado al pin A0. Usar un led para indicar que est conectado el sistema (controlado
con el pin B3), y otro para indicar que est funcionando el controlador (controlado con el pin B6).
SOL:
#include DSP281X_Device.h
#include DSP281X_Examples.h
#include Examen_Parcial.h
Long int pra1,ki1,dt,kd,ed;

unsignedint
scp1,sci1,sdel1,resultADC0,resultaADC1,resultADC2

floati;
void ini_evb_timerH(void);
void ini_pwm_timerB(void);
void ini_adc (void);
void main (void){
pia=30;
ki1=20;
dt=0,00001;
kd=25;
ed=2000;
DINT;
DRTM;
InitSysCtrl();
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
Init Pie Vect Table();
EILAOW:
PieVectTable.T4PINT=&evb_timerT1PER_15r;

EDIS:
PieCtrlRegs.PIEIER.all=M_INT //M=INT2y
PieCtrlRegs.PIERCER.all=R_INT2
i=0;
ini_eva_timer4();
ini_pin_timer3();
ini_all();
EINT
ERTM
}
Void ini_evb_timer4(void){
EvbRegs.T4PR=0X0320;
EvbRegs.EVBIMRB.bitT4PINT=1;
EvbRegs.EVBIFRB.bitT4PINT=4;
EvbRegs.T4CNT = 0X0000;
EvbRegs.T4CON.all=0X9702;
asm( nop);
asm( nop);
Evb Regs
Evb Regs GTPCONB.bit
Evb Regs GTPCONB.bit T4PIN=2
}
Void ini_plum_timer3(void){
EvbRegs.T3PR=0X0FE;
EvbRegs.T3CMPR=0X00FE;
EvbRegs.T3CNT=0X0000;
EvbRegs.T3CON.all=0X9702;
asm( nop);
asm( nop);
EvbRegs.T3CON.all=0X9742;
EvbRegs.EXTCONB.all=0X0001;
EvbRegs.GPTCONB.all=0X007A;
}
Void ini_ade(void){
AdeRegs ADCTRL1.bit.Reset=1;
Asm( nop);
Asm( nop);
Adc Regs ADC TRL1.bitACQ_PS=15;
Adc Regs ADC TRL3.bitADCCLKPS=1;
Adc Regs ADC TRL3.bitADCBGR=ON=3;
Adc Regs ADC TRL1.bitADCEXTREF=0;

DSP28X_USDelay(((((long double)S000L*1000.01)/
(long double)(CPU_RATE)-9.0L)./50L);
ADCRegs.ADCTRL3.bit.ADCPWON=1;

DSP28X_USDelay(((((long double)S000L*1000.01)/

(long double)(PU_RATE)_9.0L)/5.0L);
AdcRegs.ADCTRL1.bit.RESET=0;
AdcRegs.ADCTRL1.bit.SEQ-CASC=1;
AdcRegs.ADCCHELSEQ1.bit.CON00=0X02;
AdcRegs.ADCCHELSEQ1.bit.CON01=0X11;
AdcRegs.ADCCHELSEQ1.bit.CON02=0X13;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=2;
AdcRegs.ADCCTRL1.bit.CONT_RUN=1;
AdcRegs.ADCCTRL1.bit.SOC_SEQ1=1;
}
Interrupt void evb_timer4PER_isr(void){
ResultADC0=Adc.Regs.ADCRESULT4>>4;
ResultADC1=Adc.Regs.ADCRESULT7>>4;
ResultADC2=Adc.Regs.ADCRESULT11>>4;

Nuevo ADCO=0,5+(2,5-0,5)*(RESULTADC0-342)//(1706-342);
Nuevo ADC1=0,5+(2,5-0,5)*(RESULTADC1-342)//(1706-342);
Nuevo ADC2=0,5+(2,5-0,5)*(RESULTADC2-342)//(1706-342);
Prom_ADC=(Nuevo ADC0+NUEVO ADC1+NUEVO ADC2)/3;
e1=ref1-prom_ADC;
sci1=pia1+ki1*e1+dt;
scd1=kd+(e1-ea)/dt;
Sref=scp1+sci1+scd1;

Valor final=(sref-0,7)*5/(2.3-0.7)
Valor comparador=valor final*65535/
Evb.Regs.T4CMPR=Valor comparador;
EvbRegS.EVBIMRB.bit.T4PINT=1;
EvbRegS.EVBIFRB.bit.all=BIT7;
Pie ctrlRegs.PIEACK.all=DIEACK_GROUP2:
}


voidinit_encender(void){
EvaRegs.T2PR=25000;
EvaRegs.T2CNT=0x0000;
EvaRegs.T2CON.bitTMODE=11;
EvaRegs.T2CON.bitPTS=000;
EvaRegs.T2CON.bitTENDBIE=1;
EvaRegs.T2CON.bitTCLKS10=11;
EvaRegs.CAPCONA.bitCAP12EN=01;
}
logleer_wreal(void){
inta,b;
logtheta,velo,np=0;
CpuTimer0_InterruptCount=0;
a=EvaRegs.T2CNT;
while(CpuTimer0.InterruptCount<2)
b=EvaRegs.T2CNT;
if(b-a>0){
np=(b-a)/8;
sentido=1;}
theta=(3.14159/2000)*np;
vel=theta/20;
returvel;
}
interrupt void cpu_timer0_ist(void){
CpuTimer0.InterruptCount++;
PieCtrlRegs.PieACK.all=PLEACK_GROUP1;
}
interrupt void int_muestro(void)
eallow;
SysCtrlRegs_WDKey=0x55;
EDIS;
w_ref=AdcRegs.ADCRESULT0>>4;
e_real=AdcRegs.ADCRESULT1>>4;
w_real=ker-wreal();
w=w_ref-w_real;
wp=kp1*ew;
wi=wa+kc1*ew*dt;
wd=kd1*(ew-ewa)/dt;
i_ref=wp+wd+wi;//seal de control 1
ei=i_ref-i_real;
ip=kp2*ci;
ii=iia+ki2*ci*dt;
Se=ip+ii;//seal de control 2
y=FUELRegs.T1PR=Se/100;
EvoRegs.T1CMPR=y;
iia=ii;
ekvdl;
cvdklkcd;

2) Hacer un porama para que lea las entradas analgicas ADCA3, ADCB6, ADCA2, ADCB2, calcule el promedio y escriba en
binario las salidas digitales GPIOA0-GPIO11.
#include DSP281x_Device.h
#include DSP281x_Examples.h
#include lab5.h
longintI,k,z;
unsignedintsc, ResultADC0,ref,e;
floatkp;
voidini_adc(void);
sc=0;
ref=2048;
kp=100;
DINT;
DRTM;
InitSysCtrl();
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVecTable();
EALLOW;
//PieVecTable.TPINT=&/eva_timerT1PER_isr;
GpioMuxRegs.GPAMUX.all=0x0000;
GpioMuxRegs.GPADIR.all=0Xffff;
EDIS;
//PieCtrlRegs.PIEIER2.all=M_INT4 | M_INT;
//IER=IER|M_INT2;
//i=0;
//ini_eva_timer1();
//ini_pwm_timer2();
ini_adc();
//EINT;
//ERTM;
do{
GpioDataRegs.GPADAT=(AdcRegs.ADCRESULT3>>4+AdcRegs.ADCRESULT13>>4+AdcRegs.ADCRESULT2>>4+AdcRegs.ADCRESULT
10>>4)/4;
}while(1);
}
voidini_adc(void){
//Specific ADC setup for this example;
AdcRegs.ADCTRL1.bit.RESET=1;
asm(NOP);
asm(NOP);
AdcRegs.ADCTRL1.bit.ACQ_PS=15;
AdcRegs.ADCTRL3.bit.ADCCLKPS=1;
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;
AdcRegs.ADCTRL3.bit.ADCEXTREF=0;
DSP28x_usDelay(((((long double) 5000L*1000.0L)/(long double)CPU_RATE)-9.0L)/5.0L);
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
DSP28x_usDelay(((((long double)5000L*1000.0L)/(long doubleCPU_RATE-9.0L)/5.0L);
AdcRegs.ADCTRL1.bit.RESET=0;
AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //1 cascaded mode
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x3;
AdcRegs.ADCCHSELSEQ1.bit.CONV01=0xD;
AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03=0xA;
//AdcRegs.ADCCHSELSEQ1.all=0x0128;
//AdcRegs.ADCCHSELSEQ2.all=0xABCD;
//AdcRegs.ADCCHSELSEQ3.all=0x9572;
//AdcRegs.ADCCHSELSEQ4.all=0x4444;
AdcRegs.ADCMAXCONV.bit.MAX_CONV=3;
AdcRegs.ADCTRL1.bit.CONT_RUN=1; //Setup continuos run
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
}

3) Hacer un programa que genere PWMs dobles con los PWM1, PWM2 con period de 2345 y una zona muerta de 5
cuentas y los PWM7, PWM8, con un period de PWM de 45375 y una zona muerta de 43234 cuentas.

#include DSP281x_Device.h
#include DSP281x_Examples.h
#include lab5.h
longintI,k,z;
unsignedintsc, ResultADC0,ref,e;
floatkp;
void ini_eva_timer1(void);
void ini_evb_timer3(void);
void main(void){
DINT;
DRTM;
InitSysCtrl();
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
EALLOW;
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1;
GpioMuxRegs.GPAMUX.bit.PWM7_GPIOB0=1;
GpioMuxRegs.GPAMUX.bit.PWM8_GPIOB1=1;
EDIS;
ini_eva_timer1();
ini_evb_timer3();
EINT;
ERTM;
}
void ini_eva_timer1(void){
EvaRegs.T1PR=2345; //10Khz
//EvaRegs.T1CKPR=0X03A9;
EvaRegs.CHPR1=1234;
//EvaRegs.EVAIMRA.bit.T1PINT=1;
//EvaRegs.EVAIFRA.bit.T1PINT=1;
EvaRegs.T1CNT=0x0000;
EvaRegs.T1CON.all=0x9702;// 75mhz/4
asm(nop);
asm(nop);
EvaRegs.T1CON.all=0x9742;
EvaRegs.EXTCONA.all=0x0000;
EvaRegs.COMCONA.bit.CENABLE=1;
EvaRegs.COMCONA.bit.CLD=2;
EvaRegs.COMCONA.bit.SVENABLE=0;
EvaRegs.COMCONA.bit.ACTRLD=2;
EvaRegs.COMCONA.bit.FCOMPOE=1;
EvaRegs.COMCONA.bit.FCMP1OE=1;
EvaRegs.COMCONA.bit.FCMP2OE=0;
EvaRegs.COMCONA.bit.FCMP3OE=0;
EvaRegs.ACTRA.bit.CMP1ACT=1;
EvaRegs.ACTRA.bit.CMP2ACT=2;
/*EvaRegs.ACTRA.bit.CMP3ACT=1;
EvaRegs.ACTRA.bit.CMP4ACT=1;
EvaRegs.ACTRA.bit.CMP5ACT=1;
EvaRegs.ACTRA.bit.CMP6ACT=1;
EvaRegs.DBTCONA.bit.DBT=0x5;
EvaRegs.DBTCONA.bit.EDBT1=1;
EvaRegs.DBTCONA.bit.EDBT2=1;
EvaRegs.DBTCONA.bit.EDBT3=1;
EvaRegs.DBTCONA.bit.DBTPS=5;
//EvaRegs.GPTCONA.bit.T1TOADC=2; // interrupt del t1PER
//EvaRegs.GPTCONA.bit.T1PIN=2;
}
void ini_evb_timer3(void){
EvbRegs.T3PR=45375;
EvbRegs.CMPR4=20000;
EvbRegs.T3CNT=0x0000;
EvbRegs.T3CON.all=0x9702;
asm(nop);
asm(nop);
EvbRegs.T3CON.all=0x9702;
EvbRegs.EXTCONB.all=0x0000;
EvbRegs.COMCONB.bit.CENABLE=1;
EvbRegs.COMCONB.bit.CLD=2;
EvbRegs.COMCONB.bit.SVENABLE=0;
EvbRegs.COMCONB.bit.ACTRLD=2;
EvbRegs.COMCONB.bit.FCOMPOE=1;
EvbRegs.COMCONB.bit.FCMP4OE=1;
EvbRegs.COMCONB.bit.FCMP5OE=0;
EvbRegs.COMCONB.bit.FCMP6OE=0;
EvbRegs.ACTRB.bit.CMP7ACT=1;
EvbRegs.ACTRB.bit.CMP8ACT=2;
EvbRegs.DBTCONB.bit.DBT=2; /*Dato incorrecto en el examen*/
EvbRegs.DBTCONB.bit.EDBT1=1;
EvbRegs.DBTCONB.bit.EDBT2=1;
EvbRegs.DBTCONB.bit.EDBT3=1;
EvbRegs.DBTCONB.bit.EDBT5=5;

4) Hacer un programa que mida la temperatura de 0-40 C por la entrada analgica ADCB6, hacer un controlador PID con
un periodo de muestreo de 3 milisegundos para mantener estable la temperatura en 18 C, entregar la seal de control
en forma de PWM simple con un periodo de muestreo de 500 microsegundos. Los coeficientes del controlador deben
ser configurables a travs de variables. La seal HSPCLK es 40 Mhz.

#include DSP281x_Device.h
#include DSP281x_Examples.h
#include lab5.h
longinti,k,z;
unsignedintsc, ResultADC0,ref,e;
float kp, ki,kd,cp,ci,cia,cd,ea,dt;
floatmuestreo;
floatpwm;
void ini_eva_timer1(void);
void ini_pwm_timer2(void);
voidini_adc(void);
interrupt void eva_timerT1PER_isr(void);
void main(void){
sc=0;
ref=18;
kp=100;
ki=1;
kd=0.01;
cia=0;
ci=0;
dt=0.003;
ea=0;
muestreo=938;
pwm=156;
DINT;
DRTM;
InitSysCtrl();
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.T1PINT=&eva_timerT1PER_isr;
EDIS;
PieCtrlRegs.PIEIER2.all=M_INT4|M_INT5;
IER=IER|M_INT2;
i=0;
ini_eva_timer1();
ini_pwm_timer2();
ini_adc();
do{
}while (1);
EINT;
ERTM;
}
void ini_eva_timer1(void){
EvaRegs.T1PR=muestreo; //10Khz
//EvaRegs.T1CMPR=0x03A9;
EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.bit.T1PINT=1;
EvaRegs.T1CNT=0x0000;
EvaRegs.T1CON.all=0x9702; // 75Mhz/4
asm(nop);
asm(nop);
EvaRegs.T1CON.all=0x9742;
EvaRegs.GPTCONA.bit.T1T0ADC=2; // interrupt del T1PER
EvaRegs.GPTCONA.bit.T1PIN=2;
}
void ini_pwm_timer2(void){
EvaRegs.T2PR=pwm; //10 Khz
EvaRegs.T2CMPR=pwm/2;
EvaRegs.T2CNT=0x0000;
EvaRegs.T2CON.all=0x9702;// 75mhz/4
asm(nop);
asm(nop);
EvaRegs.T2CON.all=0x9742;
EvaRegs.EXTCONA.all=0x0001;
EvaRegs.GPTCONA.all=0x007A;
}
voidini_adc(void){
//Specific ADC Setup for this example:
AdcRegs.ADCTRL1.bit.RESET=1;
asm(nop);
asm(nop);
AdcRegs.ADCTRL1.bit.ACQ_PS=15;
AdcRegs.ADCTRL3.bit.ADCCLKPS=1;
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;
AdcRegs.ADCTRL3.bit.ADCEXTREF=0;
DSP28x_usDelay(((((long double) 5000L*1000.0L)/(long doubleCPU_RATE)-9.0L)/5.0L);
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
DSP28x_usDelay(((((long double) 5000L*1000.0L)/(long doubleCPU_RATE)-9.0L)/5.0L);
AdcRegs.ADCTRL1.bit.RESET=0;
AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //1 cascaded mode
AdcRegs.ADCCKSELSEQ.bit.CONV00=0xE;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=1;
AdcRegs.ADCTRL1.bit.CONT_RUN=1; //Setup continuous run
AdcRegs.ADCTRL2.bit.SOC_SEQ=1;
}
interrupt void eva_timerT1PER_isr(void){
ResultADC0=AdcRegs.ADCRESULT14>>4*40/4095;
e=ref-ResultADC0;
cp=kp*e;
ci=cia+e*dt;
cd=kd*(ea-e)/dt;
sc=cp+ci+cd;
EvaRegs,T2CMPR=sc;
cia=ci;
ea=e;
EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.all=BIT7;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP2;
}

5) Hacer un programa que genere una interrupcion con la function de comparacion de timer 2.

#include DSP281x_Device.h
#include DSP281x_Examples.h
#include lab5.h
void ini_pwm_timer2(void);
interrupt void eva_timerT2CMP_isr(void);
void main(void){
sc=0;
DINT;
DRTM;
InitSysCtrl();
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.T2CINT=&eva_timerT2CMP_isr();
EDIS;
PieCtrlRegs.PIEIER2.all=M_INT3;
IER=IER|M_INT3;
i=0;
ini_pwm_timer2();
EINT;
ERTM;
}
void ini_pwm_timer2(void){
EvaRegs.T2PR=0Xffff; //10KHZ
EvaRegs.T2CMPR=0Xffff;
EvaRegs.EVAIHRB.bit.T2CINT=1;
EvaRegs.EVAIFRB.bit.T2CINT=1;
EvaRegs.T2CNT=0x0000;
EvaRegs.T2CON.all=0x9702; // 75mhz/4
asm(nop);
asm(nop);
EvaRegs.T2CON.all=0x9702;
EvaRegs.EXTCONA.all=0x0000;
}
interrupt void eva_timerT2CMP_isr(void){
/*
Aqui el codigodelcontrolador
*/
EvaRegs.EVAIMRB.bit.T2CINT=1;
EvaRegs.EVAIFRB.bit.T2CINT=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP3;
}

S-ar putea să vă placă și