Proyecto de Tesis en Mecatrónica. Universidad Técnica del Norte. Ernesto Palacios <mecatronica.mid@gmail.com>
Dependencies: EthernetNetIf HTTPServer QEI_hw RPCInterface mbed
Revision 3:8d5a9e3cd680, committed 2012-03-24
- Comitter:
- Yo_Robot
- Date:
- Sat Mar 24 17:37:20 2012 +0000
- Parent:
- 2:a1b556d78a7f
- Child:
- 4:552beeda4722
- Commit message:
- Programa para probar diferentes configuraciones del PTO. v1.0
Changed in this revision
--- a/main.cpp Sat Mar 24 04:40:21 2012 +0000 +++ b/main.cpp Sat Mar 24 17:37:20 2012 +0000 @@ -1,33 +1,34 @@ -// El siguiente código sirve de ejemplo para -// establecer un tren de impulsos y controlar -// su frecuencia. - -#include "mbed.h" -#include "setup.h" - -Serial pc( USBTX, USBRX ); -DigitalOut myled( LED1 ); - -void Setup_PTO_Timer2(); -void ISR_Serial(); - -uint32_t PRESCALER_STEP; //Steps for the preescaler - -int main() { - - - pc.printf( "Teclee 'w' para aumentar, 's' para disminuir, 'z' cambia los pasos " ); - PRESCALER_STEP = 50UL; - //The default prescaler will be 0.05 sec - - Setup_PTO_Timer2(); - pc.attach( &ISR_Serial ); - - uint32_t period = ( uint32_t LPC_TIM2->PR ); - pc.printf( "\Period = %d", period ); - - while(1) { - - - } +// El siguiente código sirve de ejemplo para +// establecer un tren de impulsos y controlar +// su frecuencia. + +#include "mbed.h" +#include "setup.h" + +Serial pc( USBTX, USBRX ); + +void Setup_PTO_Timer2(); +void ISR_Serial(); + +int main() { + + + pc.printf( "\n Ingrese un numero entero seguido de un comando\n luego presione enter por ejemplo: 500-p " ); + pc.printf( "\n Comandos:" ); + pc.printf( "\n p = para cambiara el prescaler por el numero ingresado" ); + pc.printf( "\n m = para cambiara el valor de MR2 por el numero ingresado:" ); + pc.printf( "\n n = para cambiara el valor de MR2 por el numero ingresado:" ); + pc.printf( "\n a = Inicia el timer, no importa el numero" ); + pc.printf( "\n s = Detiene el timer, no importa el numero" ); + + Setup_PTO_Timer2(); + pc.attach( &ISR_Serial ); + + uint32_t prescaler = (uint32_t ) LPC_TIM2->PR ; + pc.printf( "\n\nPreescaler Actual = %d\n\n", prescaler ); + + while(1) { + + + } } \ No newline at end of file
--- a/setup.cpp Sat Mar 24 04:40:21 2012 +0000 +++ b/setup.cpp Sat Mar 24 17:37:20 2012 +0000 @@ -1,108 +1,110 @@ -/// Codigo Fuente para configurar al - -#include "setup.h" -#include "mbed.h" - - -// Esta variable global determina -// los incrementos del Preescaler -extern uint32_t PRESCALER_STEP; - -// Salida Serial de mbed -extern Serial pc; - - -/** @brief: Esta función configura al Timer2 - * para que las salidas p5 y p6 del mbed - * se alternen cada vez que se iguala al - * registro MR2 y MR3. - */ -void Setup_PTO_Timer2() -{ - // Encender Timer2 (PCONP[22]) - LPC_SC->PCONP |= 1 << 22; - - // Resetear y parar el Timer - LPC_TIM2->TCR = 0x2; - LPC_TIM2->CTCR = 0x0; - - // Establecer el Preescaler inicial 0.5 seg - LPC_TIM2->PR = 100; - - // Calcular el periodo - uint32_t periodo = ( SystemCoreClock / 4000 ); - - // Establecer los Registros de Coincidencia - // ( Match Register ) - LPC_TIM2->MR2 = periodo; - LPC_TIM2->MR3 = periodo * 2; - - LPC_TIM2->MCR |= 1 << 10; // Resetear Timer en MR3 - - LPC_TIM2->EMR |= 15UL << 8; // Alternar Pin MAT2.2 - // y MAT2.3 - - LPC_PINCON->PINSEL0 |= 15UL << 16; //Activar MAT2.2 - // y MAT2.3 como salidas - - // Arrancer el Timer 2 - LPC_TIM2->TCR = 1; - -} - - -/** @brief: Esta es la rutina que maneja las interrupciones - * seriales, al recibir un caracter. - */ -void ISR_Serial() -{ - char c = pc.getc(); - - if( c == 'w') - setPeriodUp(); - else if( c == 's') - setPeriodDown(); - - else if( c == 'z') - { - float newStep; - pc.printf("\nIntroducir nuevo paso: "); - pc.scanf( "%d", &newStep ); - setPeriodStep( newStep ); - } - -} - - -/** @brief: Esta Funcion incrementará el preescaler - * del timer en un paso. - */ -void setPeriodUp() -{ - // Es muy dÃcil llegar a un lÃmite superior - // de 4294967295 para los 32bit del preescaler - // Pero quizás haga falta chequear el - - LPC_TIM2->PR += PRESCALER_STEP; -} - - -/** @brief: Esta Funcion decrementará el preescaler - * del timer en un paso. - */ -void setPeriodDown() -{ - uint32_t prescaler = (uint32_t ) LPC_TIM2->PR ; - - if( prescaler > PRESCALER_STEP ) - LPC_TIM2->PR -= PRESCALER_STEP; -} - - -/** @brief: Esta Funcion Cambiara los pasos en los que - * se aumenta o disminuye el Preescaler. - */ -void setPeriodStep( uint32_t newStep ) -{ - PRESCALER_STEP = newStep; +/// Codigo Fuente para configurar al + +#include "setup.h" +#include "mbed.h" + + +// Esta variable global determina +// los incrementos del Preescaler +extern uint32_t PRESCALER_STEP; + +// Salida Serial de mbed +extern Serial pc; + + +/** @brief: Esta función configura al Timer2 + * para que las salidas p5 y p6 del mbed + * se alternen cada vez que se iguala al + * registro MR2 y MR3. + */ +void Setup_PTO_Timer2() +{ + // Encender Timer2 (PCONP[22]) + LPC_SC->PCONP |= 1 << 22; + + // Resetear y parar el Timer + LPC_TIM2->TCR = 0x2; + LPC_TIM2->CTCR = 0x0; + + // Establecer el Preescaler inicial 0.5 seg + LPC_TIM2->PR = 100; + + // Calcular el periodo + uint32_t periodo = ( SystemCoreClock / 4000 ); + + // Establecer los Registros de Coincidencia + // ( Match Register ) + LPC_TIM2->MR2 = periodo; + LPC_TIM2->MR3 = periodo * 2; + + LPC_TIM2->MCR |= 1 << 10; // Resetear Timer en MR3 + + LPC_TIM2->EMR |= 15UL << 8; // Alternar Pin MAT2.2 + // y MAT2.3 + + LPC_PINCON->PINSEL0 |= 15UL << 16; //Activar MAT2.2 + // y MAT2.3 como salidas + + // Arrancer el Timer 2 + LPC_TIM2->TCR = 1; + +} + + +/** @brief: Esta es la rutina que maneja las interrupciones + * seriales, al recibir un caracter. + */ +void ISR_Serial() +{ + int newValue; + char command; + + pc.scanf( "%d-%c", &newValue, &command ) ; + pc.printf("\n %d-%c \n", newValue, command ); + + if( command == 'p') + setPrescaler( newValue ); + else if( command == 'm') + setMR2( newValue ); + else if( command == 'n') + setMR3( newValue ); + else if( command == 'a') + startTimer2(); + else if( command == 's') + stopTimer2(); + + +} + + +/** @brief: Esta Funcion cambia el preescaler + * directamente + */ +void setPrescaler( int newValue) +{ + LPC_TIM2->PR = newValue; +} + + +void setMR2( int newValue ) +{ + LPC_TIM2->MR2 = newValue; +} + + +void setMR3( int newValue ) +{ + LPC_TIM2->MR3 = newValue; +} + +void startTimer2() +{ + // Arrancer el Timer 2 + LPC_TIM2->TCR = 1; +} + +void stopTimer2() +{ + // Arrancer el Timer 2 + LPC_TIM2->TCR = 0x2; } \ No newline at end of file
--- a/setup.h Sat Mar 24 04:40:21 2012 +0000 +++ b/setup.h Sat Mar 24 17:37:20 2012 +0000 @@ -7,9 +7,10 @@ void Setup_PTO_Timer2(); void ISR_Serial(); -void setPeriodUp(); -void setPeriodDown(); -void setPeriodStep( uint32_t newStep ); - +void setPrescaler( int newValue ); +void setMR2( int newValue ); +void setMR3( int newValue ); +void stopTimer2(); +void startTimer2(); #endif \ No newline at end of file