Вы находитесь на странице: 1из 4

#include "tm4c123gh6pm.

h"
#include <stdint.h>
#include <math.h>
//Configura el PF0,4 COMO entradas (pulsadores)
//SW1 corresponde a PF4
//SW2 corresponde a PF0
void config_portF (void)
{
unsigned int temp ;
SYSCTL_RCGC2_R |= (1<<5) ;
temp= SYSCTL_RCGC2_R ;
GPIO_PORTF_LOCK_R =0x4C4F434B;
GPIO_PORTF_CR_R |=((1<<0)| (1<<4));
GPIO_PORTF_AMSEL_R &= ~ ((1<<1)|(1<<0)|(1<<4));
GPIO_PORTF_PCTL_R&= ~ ((1<<1)|(1<<0)|(1<<4));
GPIO_PORTF_DIR_R &=~ ((1<<0)| (1<<4));
GPIO_PORTF_DIR_R |= 0X02; //PF1 como salida

GPIO_PORTF_AFSEL_R &= ~ ((1<<1)|(1<<0)|(1<<4));


GPIO_PORTF_PUR_R =0x11;
GPIO_PORTF_DEN_R |=((1<<0)| (1<<4)|(1<<1));
}
void ConfigPWM (void ) // Configura los PWM correspondientes al
//M0PWM2-PB4
//M0PWM3-PB5
//MOPWM-PE4
// SE Considera frecuencia de 16Mhz y un SERVO towerpro SG 90.
{
unsigned int temp;
SYSCTL_RCGCPWM_R |=(1<<0);//Se activa la seal de reloj para el Mdulo 0
temp=SYSCTL_RCGCPWM_R ;
SYSCTL_RCGC2_R|=((1<<1)|(1<<4));
temp= SYSCTL_RCGC2_R;
SYSCTL_RCC_R |=(1<<20);// ESTE S SE DEBE PONER EN 1
temp= SYSCTL_RCC_R;
GPIO_PORTB_DIR_R|= ((1<<4)|(1<<5));
GPIO_PORTB_DEN_R|= ((1<<4)|(1<<5));
GPIO_PORTB_AFSEL_R|= ((1<<4)|(1<<5));
GPIO_PORTB_PCTL_R= 0x00440000;
GPIO_PORTB_DR8R_R|=(1<<4)|(1<<5));
GPIO_PORTE_DIR_R|= (1<<4);
GPIO_PORTE_DEN_R|= (1<<4);
GPIO_PORTE_AFSEL_R|= (1<<4);
GPIO_PORTE_PCTL_R= 0x00040000;
//PARA EL MODULO. Se usaran los Generadores 1 y 2 de stos.
PWM0_1_CTL_R&= ~(1<<0);
PWM0_2_CTL_R&= ~(1<<0);// Se desactivan ambos generadores
PWM0_1_CTL_R|=(1<<2); //Para que no se detenga al depurar.Cuenta descend
ente
PWM0_2_CTL_R|=(1<<2); //Para que no se detenga al depurar.Cuenta descend
ente
PWM0_1_GENA_R= ((PWM0_1_GENA_R)& (~0xFFF)) | ((1<<7) |(1<<3)| (1<<2));
//Cuando load=1 , PWMA se pone en alta
// Cuando CMPA es igual a la cuenta , PWM A se pone en baja

PWM0_1_GENB_R= ((PWM0_1_GENB_R)& (~0xFFF)) | ((1<<11) |(1<<3)| (1<<2));


//Cuando load=1 , PWMB se pone en alta
// Cuando CMPB es igual a la cuenta , PWM B se pone en baja

PWM0_2_GENA_R=((PWM0_2_GENA_R)& (~0xFFF)) | ((1<<7) |(1<<3)| (1<<2));


//Cuando load=1 , PWMA se pone en alta
// Cuando CMPA es igual a la cuenta , PWM A se pone en baja

PWM0_1_LOAD_R= ((PWM0_1_LOAD_R) & (~0xFFFF)) + 4999;// Parece que el LOA


D esta mal
PWM0_2_LOAD_R=((PWM0_2_LOAD_R) & (~0xFFFF)) + 4999;

//Se cambiarn los valores de los comparadores para regular el funcionamie


nto
// de los servos
PWM0_1_CTL_R|= (1<<0);
PWM0_2_CTL_R|= (1<<0);// Se activan ambos generadores
PWM0_ENABLE_R|= ((1<<2) |(1<<3)|(1<<4) );//Se habilitan las salidas
}
//Considerar lo siguiente:
// Servo1:PB4
// Servo2:PB5
// Servo3:PE4
//Se realizarn funciones para Neutro,-90 , +90.Las cuales podrn ser usadas para cu
alquier servo.Pero aun no!
//
void SysTick (uint32_t tiempo)
{
NVIC_ST_CTRL_R &= ~(1<<0);//SYSTICK desactivado
// Carga 3999999 en Hex para que cada .5 Seg ocurra un evento de tempori
zador
NVIC_ST_RELOAD_R = ( (NVIC_ST_RELOAD_R & (~0xFFFFFF)) + tiempo) ;
//Habilitar el Systick asi como la seal de reloj
//NVIC_ST_CURRENT_R |=0X111; // SE BORra el contenido actual de la cuent
a
NVIC_ST_CTRL_R |= 0x5; // se termina de configurar el Systick
}
void main (void)
{
//SW1 corresponde a PF4
//SW2 corresponde a PF0
//tienen PUR
unsigned int i;
ConfigPWM();
config_portF ();
SysTick (10999999);
while(1){
//DISPOSICION DE SERVOS
// S3
//S1(PB4) S2(PB5)
if (((GPIO_PORTF_DATA_R)&(1<<4))==0)//SW1
{
while(((GPIO_PORTF_DATA_R)&(1<<4))==0);
do {
// SE inicia simulacion de caminata hacia adelante
//Todos a posicion neutra
while (((NVIC_ST_CTRL_R ) & (1<<16))==0);//posicion neu
tra servo3
//GPIO_PORTF_DATA_R ^= 0x02;
PWM0_1_CTL_R&= ~(1<<0);//servo 1
PWM0_1_CMPA_R = ((PWM0_1_CMPA_R) & (~0xFFFF))+4624; //Po
sicion neutra
PWM0_1_CTL_R|= (1<<0);//servo 1 neutra
PWM0_1_CTL_R&= ~(1<<0);//servo 2
PWM0_1_CMPB_R = ((PWM0_1_CMPB_R) & (~0xFFFF))+4624; //Po
sicion neutra
PWM0_1_CTL_R|= (1<<0);//servo 2 neutra
//TODOS los servos ya estan en neutro
//Servo 3 a posicion +45
while (((NVIC_ST_CTRL_R ) & (1<<16))==0);// Se espera u
n tiempo DEFINIR NUEVA FUNCION PARA DELAYS MAS CONTROLABLES(CONSEJO DE MR.DELAY)
//Servo1 a posicion -45
PWM0_1_CTL_R&= ~(1<<0);//servo 1 -45
PWM0_1_CMPA_R = ((PWM0_1_CMPA_R) & (~0xFFFF))+4749; //P
osicion -45
PWM0_1_CTL_R|= (1<<0);//servo 1 -45
while (((NVIC_ST_CTRL_R ) & (1<<16))==0);// Se espera u
n tiempo DEFINIR NUEVA FUNCION PARA DELAYS MAS CONTROLABLES(CONSEJO DE MR.DELAY)
//Servo 3 a posicion -45
while (((NVIC_ST_CTRL_R ) & (1<<16))==0);// Se espera u
n tiempo DEFINIR NUEVA FUNCION PARA DELAYS MAS CONTROLABLES(CONSEJO DE MR.DELAY)
//Servo 2 a posicion +45
PWM0_1_CTL_R&= ~(1<<0);//servo 1 +45
PWM0_1_CMPB_R = ((PWM0_1_CMPB_R) & (~0xFFFF))+4499; //P
osicion +45
PWM0_1_CTL_R|= (1<<0);//servo 1 +45
while (((NVIC_ST_CTRL_R ) & (1<<16))==0);// Se espera u
n tiempo DEFINIR NUEVA FUNCION PARA DELAYS MAS CONTROLABLES(CONSEJO DE MR.DELAY)
//Servo 3 a neutro
while (((NVIC_ST_CTRL_R ) & (1<<16))==0);// Se espera u
n tiempo DEFINIR NUEVA FUNCION PARA DELAYS MAS CONTROLABLES(CONSEJO DE MR.DELAY)
//Todos a neutro
PWM0_1_CTL_R&= ~(1<<0);//servo 1
PWM0_1_CMPA_R = ((PWM0_1_CMPA_R) & (~0xFFFF))+4624; //Po
sicion neutra
PWM0_1_CTL_R|= (1<<0);//servo 1 neutra
PWM0_1_CTL_R&= ~(1<<0);//servo 2
PWM0_1_CMPB_R = ((PWM0_1_CMPB_R) & (~0xFFFF))+4624; //Po
sicion neutra
PWM0_1_CTL_R|= (1<<0);//servo 2 neutra
//TODOS los servos ya estan en neutro
while (((NVIC_ST_CTRL_R ) & (1<<16))==0);// Se espera u
n tiempo DEFINIR NUEVA FUNCION PARA DELAYS MAS CONTROLABLES(CONSEJO DE MR.DELAY)

}while (((GPIO_PORTF_DATA_R)&(1<<0))==1);
}

Вам также может понравиться