Documentos de Académico
Documentos de Profesional
Documentos de Cultura
h>
void programar_PWM(void); // subrutina de programar PWM void captura (void); void FREC(void); void ADC (void); // subrutina de programar captura de pulsos encoder // subrutina cambiar frecuencia a 24 MHz // subrutina programar ADC
void accion_de_control1(void); // subrutina accion de control para motor 1 void accion_de_control2(void); // subrutina accion de control para motor 2 void rever(void); void giro(void); // subrutina de reversa o adelante // subrutina para cambiar derecha e izquierda
void accion_de_control1(void){ ukT=-kpd*(Wr-Wra)+kid*(SP-Wr)+ukTa; // ecuacion de acccion de control ukt= accion de control if(ukT>32000){ // limite superior de velocidad ukT=32000; } else if(ukT<0){ // limite inferior de velocidad
ukT=0; } z=ukT; // a Z se asigna la accon de control PWMDTY7=z & 0x00ff; // los 8 bits se le asignan al ciclo de trabajo del PWMD7 PWMDTY6=z >> 8; // corrimiento de 8 bits ukTa=ukT; // accion de control anterior se guarda accion de control Wra=Wr; // velocidad real anterior } void accion_de_control2(void){ ukT2=-kpd*(Wr2-Wra2)+kid*(SP2-Wr2)+ukTa2; //accion de control 2 para motor 2 if(ukT2>32000){ // limite superior de velocidad ukT2=32000; } else if(ukT2<0){ // limite inferior de velocidad ukT2=0; } z=ukT2; PWMDTY5=z & 0x00ff; PWMDTY4=z >> 8; ukTa2=ukT2; //accion de control anterior Wra2=Wr2; } // velocidad real anterior
asm("nop\n" "nop\n" "nop\n" "nop\n"); #define LOCK 0x08 while(!(CRGFLG & LOCK)) // espera asta q el micro acepta la frecuencia ; #define PLLSEL 0x80 CLKSEL |= PLLSEL; // se le carga ala etiketa un valor // para elegir la frecuencia calculada
ATD0CTL2=0X80; ATD0CTL3=0X40; ATD0CTL4=0X60; ATD0CTL5=0X30; } /*pwm*/ void programar_PWM(void){ PWMCTL=0xc0; PWME=0xA0; PWMPOL=0xA0; PWMCLK=0x00; // concatenar PWM // habilitacion delos PWM (7 y 5) // polaridad de salida (alto o bajo) // seleccion de timer A-SA y B-SB
PWMPRCLK=0x00; // divicion de frecuencia del timer A y B PWMCAE=0x00; // alineaciondel PWM hacia la izquierda y hacia el centro
// divicion del timer SB //periodo del PWM 7 // ciclo del trabajo se varia para mover un motor 7
PWMPER6=0X80; // periodo de PWM 6 PWMDTY6=0X00; // ciclo de trabajo 6 PWMPER5=0X00; // periodo del PWM 5 PWMDTY5=0X00; // ciclo de trabajo 5 PWMPER4=0X80; // periodo del PWM 4 PWMDTY4=0X00; // ciclo de trabajo 4
/*captura de datos*/ void captura (void){ ICPAR |=0x03; // abilitar capturaddores DLYCT |=0x01; // retardo TCTL4 |=0x0A; // flancos TIOS |=0x00; // input capture ICSYS |=0x07; // sobreescritura de almacenamiento ICOVW=0xff; // sobreescritura
DDRH=0xf0; // puerto captura(); programar_PWM(); SCI0BD=156; // configuracion de velocidad en baulios de comuninicacion serial SCI0CR2 = 0x0c; // activar bidireccional RTICTL |= 0x43; // tiempo de muestreo esta trabajando 2.048mS
CRGFLG |= 0x80; // limpiar bandera CRGINT |= 0x80; // habilita la interrupcion real asm("cli"); while(1){ Wr=Wl; // velocidad real Wr, velocidad real 1 W1 Wr2=Wl2; // velocidad real 2 Wr2 accion_de_control1(); accion_de_control2(); if(l==1){ // se hace esta acion cada 2 mS while ((SCI0SR1 & 0x80) == 0) ; SCI0DRL =120; while ((SCI0SR1 & 0x80) == 0) ; SCI0DRL =Wr; while ((SCI0SR1 & 0x80) == 0) //que se espere asta q deje de transmitir ; SCI0DRL =Wr2; l=0; //habilita las interrupciones
while ((SCI0SR1 & 0x80) == 0) ; Wref=SCI0DRL; rever(); giro(); } } void time(void){ MCCTL |=0x10; // registro para hacerla captura latch Wl=PA0H; // captura de pulsos 1
Wl2=PA1H; //captura de pulsos 2 l=1; CRGFLG |= 0x80; // se resetea la bandera asm("rti"); } void rever(void){ a=PTH & 0x0f; if(a==0x01){ SP=0; SP2=0; b=1; } else if(a==0x02){ SP=0; // regresa al programa retorna de donde brinco
SP2=0; b=2; } else if(Wr<=1 && b==1){ PTH=0x30; b=3; } else if(Wr<=1 && b==2){ PTH=0x00; b=3; } else if(a==0 && b==3){ SP=Wref; SP2=Wref; } }