Proyecto de Tesis en Mecatrónica. Universidad Técnica del Norte. Ernesto Palacios <mecatronica.mid@gmail.com>

Dependencies:   EthernetNetIf HTTPServer QEI_hw RPCInterface mbed

Committer:
Yo_Robot
Date:
Sun Apr 01 20:03:42 2012 +0000
Revision:
6:b4dae934e1ea
Parent:
5:c5aea1eb10bb
Child:
7:d9aca501126f
v0.1  Serial No RPC. sistema base para la comunicacion con la libreria ASM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yo_Robot 4:552beeda4722 1 /**
Yo_Robot 4:552beeda4722 2 * @brief Tren de impulsos con Timer2
Yo_Robot 4:552beeda4722 3 * @file setup.cpp
Yo_Robot 4:552beeda4722 4 * @author Ernesto Palacios
Yo_Robot 4:552beeda4722 5 *
Yo_Robot 4:552beeda4722 6 * Created on 25 de Marzo de 2012
Yo_Robot 4:552beeda4722 7 *
Yo_Robot 4:552beeda4722 8 * Licencia GPL v3.0
Yo_Robot 4:552beeda4722 9 * http://www.gnu.org/licenses/gpl-3.0.html
Yo_Robot 4:552beeda4722 10 */
Yo_Robot 4:552beeda4722 11
Yo_Robot 3:8d5a9e3cd680 12
Yo_Robot 3:8d5a9e3cd680 13 #include "setup.h"
Yo_Robot 3:8d5a9e3cd680 14 #include "mbed.h"
Yo_Robot 3:8d5a9e3cd680 15
Yo_Robot 3:8d5a9e3cd680 16 // Salida Serial de mbed
Yo_Robot 3:8d5a9e3cd680 17 extern Serial pc;
Yo_Robot 6:b4dae934e1ea 18 extern DigitalOut pin_son; // SON
Yo_Robot 6:b4dae934e1ea 19 extern DigitalOut pin_dir; // SIGN+
Yo_Robot 6:b4dae934e1ea 20 extern DigitalIn pin_alm; // ALM
Yo_Robot 6:b4dae934e1ea 21 extern AnalogOut aout; // +-10V
Yo_Robot 6:b4dae934e1ea 22
Yo_Robot 3:8d5a9e3cd680 23
Yo_Robot 3:8d5a9e3cd680 24
Yo_Robot 4:552beeda4722 25 void setTimer2()
Yo_Robot 3:8d5a9e3cd680 26 {
Yo_Robot 3:8d5a9e3cd680 27 // Encender Timer2 (PCONP[22])
Yo_Robot 3:8d5a9e3cd680 28 LPC_SC->PCONP |= 1 << 22;
Yo_Robot 3:8d5a9e3cd680 29
Yo_Robot 3:8d5a9e3cd680 30 // Resetear y parar el Timer
Yo_Robot 3:8d5a9e3cd680 31 LPC_TIM2->TCR = 0x2;
Yo_Robot 3:8d5a9e3cd680 32 LPC_TIM2->CTCR = 0x0;
Yo_Robot 3:8d5a9e3cd680 33
Yo_Robot 4:552beeda4722 34 // Establecer el Preescaler en cero
Yo_Robot 4:552beeda4722 35 // SIn Preesclaer
Yo_Robot 4:552beeda4722 36 LPC_TIM2->PR = 0;
Yo_Robot 3:8d5a9e3cd680 37
Yo_Robot 4:552beeda4722 38 // Calcular el periodo Inicial
Yo_Robot 4:552beeda4722 39 uint32_t periodo = ( SystemCoreClock / 400 );
Yo_Robot 3:8d5a9e3cd680 40
Yo_Robot 3:8d5a9e3cd680 41 // Establecer los Registros de Coincidencia
Yo_Robot 3:8d5a9e3cd680 42 // ( Match Register )
Yo_Robot 3:8d5a9e3cd680 43 LPC_TIM2->MR2 = periodo;
Yo_Robot 4:552beeda4722 44 LPC_TIM2->MR3 = periodo; // Legacy, salidas identicas
Yo_Robot 3:8d5a9e3cd680 45
Yo_Robot 4:552beeda4722 46 LPC_TIM2->MCR |= 1 << 7; // Resetear Timer en MR2
Yo_Robot 3:8d5a9e3cd680 47
Yo_Robot 3:8d5a9e3cd680 48 LPC_TIM2->EMR |= 15UL << 8; // Alternar Pin MAT2.2
Yo_Robot 3:8d5a9e3cd680 49 // y MAT2.3
Yo_Robot 3:8d5a9e3cd680 50
Yo_Robot 3:8d5a9e3cd680 51 LPC_PINCON->PINSEL0 |= 15UL << 16; //Activar MAT2.2
Yo_Robot 6:b4dae934e1ea 52 // y MAT2.3 como salidas
Yo_Robot 6:b4dae934e1ea 53
Yo_Robot 6:b4dae934e1ea 54 }
Yo_Robot 6:b4dae934e1ea 55
Yo_Robot 6:b4dae934e1ea 56
Yo_Robot 6:b4dae934e1ea 57 void setSON( int onOff )
Yo_Robot 6:b4dae934e1ea 58 {
Yo_Robot 6:b4dae934e1ea 59 pin_son = onOff;
Yo_Robot 6:b4dae934e1ea 60 }
Yo_Robot 6:b4dae934e1ea 61
Yo_Robot 6:b4dae934e1ea 62
Yo_Robot 6:b4dae934e1ea 63 void setDir( int dir )
Yo_Robot 6:b4dae934e1ea 64 {
Yo_Robot 6:b4dae934e1ea 65 pin_dir = dir;
Yo_Robot 6:b4dae934e1ea 66 }
Yo_Robot 6:b4dae934e1ea 67
Yo_Robot 6:b4dae934e1ea 68
Yo_Robot 6:b4dae934e1ea 69 void setAout( float value )
Yo_Robot 6:b4dae934e1ea 70 {
Yo_Robot 6:b4dae934e1ea 71 aout = value;
Yo_Robot 3:8d5a9e3cd680 72 }
Yo_Robot 3:8d5a9e3cd680 73
Yo_Robot 3:8d5a9e3cd680 74
Yo_Robot 6:b4dae934e1ea 75 void ISR_Alarm()
Yo_Robot 6:b4dae934e1ea 76 {
Yo_Robot 6:b4dae934e1ea 77 pc.printf( "\n\n ERROR: ALARMA \n\n " );
Yo_Robot 6:b4dae934e1ea 78
Yo_Robot 6:b4dae934e1ea 79 setSON( 0 );
Yo_Robot 6:b4dae934e1ea 80 stopTimer2();
Yo_Robot 6:b4dae934e1ea 81 setAout( 0.5 );
Yo_Robot 6:b4dae934e1ea 82
Yo_Robot 6:b4dae934e1ea 83 }
Yo_Robot 6:b4dae934e1ea 84
Yo_Robot 6:b4dae934e1ea 85
Yo_Robot 6:b4dae934e1ea 86 void ISR_Serial()
Yo_Robot 6:b4dae934e1ea 87 {
Yo_Robot 6:b4dae934e1ea 88 int freq; //Frecuencia del PTO
Yo_Robot 6:b4dae934e1ea 89 char command; //Comando a ejecutar
Yo_Robot 6:b4dae934e1ea 90 char scale; //Escala de la frecuencia
Yo_Robot 6:b4dae934e1ea 91
Yo_Robot 6:b4dae934e1ea 92 pc.scanf( "%c%d%c", &command, &freq, &scale ) ;
Yo_Robot 6:b4dae934e1ea 93 LPC_UART0->FCR = 0x06;
Yo_Robot 6:b4dae934e1ea 94 pc.printf("\n %c%d%c \n", command, freq, scale );
Yo_Robot 6:b4dae934e1ea 95
Yo_Robot 6:b4dae934e1ea 96 // Establecer nueva frecuencia
Yo_Robot 6:b4dae934e1ea 97 if( command == 'F')
Yo_Robot 6:b4dae934e1ea 98 {
Yo_Robot 6:b4dae934e1ea 99 if( scale == 'H' )
Yo_Robot 6:b4dae934e1ea 100 setMR2( getMRvalue( freq ) );
Yo_Robot 6:b4dae934e1ea 101 else if( scale == 'K' )
Yo_Robot 6:b4dae934e1ea 102 setMR2( getMRvalue( freq * 1000 ) );
Yo_Robot 6:b4dae934e1ea 103 }
Yo_Robot 6:b4dae934e1ea 104
Yo_Robot 6:b4dae934e1ea 105 // INICIAR Timer
Yo_Robot 6:b4dae934e1ea 106 else if( command == 'I')
Yo_Robot 6:b4dae934e1ea 107 startTimer2( );
Yo_Robot 6:b4dae934e1ea 108
Yo_Robot 6:b4dae934e1ea 109 // PARAR Timer
Yo_Robot 6:b4dae934e1ea 110 else if( command == 'P')
Yo_Robot 6:b4dae934e1ea 111 stopTimer2( );
Yo_Robot 6:b4dae934e1ea 112
Yo_Robot 6:b4dae934e1ea 113 }
Yo_Robot 6:b4dae934e1ea 114
Yo_Robot 4:552beeda4722 115 int getMRvalue( int fout )
Yo_Robot 3:8d5a9e3cd680 116 {
Yo_Robot 4:552beeda4722 117 float exact, error;
Yo_Robot 4:552beeda4722 118 int toRegister;
Yo_Robot 4:552beeda4722 119
Yo_Robot 4:552beeda4722 120 exact = (24000000 /(fout*2) ) -1;
Yo_Robot 4:552beeda4722 121 toRegister = exact; // Valor redondeado;
Yo_Robot 4:552beeda4722 122 error = exact - toRegister;
Yo_Robot 4:552beeda4722 123
Yo_Robot 6:b4dae934e1ea 124 pc.printf( "\n\n MR value: %d\n error: %f\n" ,toRegister ,error );
Yo_Robot 4:552beeda4722 125
Yo_Robot 4:552beeda4722 126 return toRegister;
Yo_Robot 3:8d5a9e3cd680 127 }
Yo_Robot 3:8d5a9e3cd680 128
Yo_Robot 3:8d5a9e3cd680 129
Yo_Robot 3:8d5a9e3cd680 130 void setMR2( int newValue )
Yo_Robot 3:8d5a9e3cd680 131 {
Yo_Robot 4:552beeda4722 132 LPC_TIM2->MR2 = newValue; // Las dos salidas son identicas
Yo_Robot 4:552beeda4722 133 LPC_TIM2->MR3 = newValue; // Para testear el programa.
Yo_Robot 3:8d5a9e3cd680 134 }
Yo_Robot 3:8d5a9e3cd680 135
Yo_Robot 3:8d5a9e3cd680 136
Yo_Robot 3:8d5a9e3cd680 137
Yo_Robot 3:8d5a9e3cd680 138 void startTimer2()
Yo_Robot 3:8d5a9e3cd680 139 {
Yo_Robot 3:8d5a9e3cd680 140 // Arrancer el Timer 2
Yo_Robot 3:8d5a9e3cd680 141 LPC_TIM2->TCR = 1;
Yo_Robot 3:8d5a9e3cd680 142 }
Yo_Robot 3:8d5a9e3cd680 143
Yo_Robot 3:8d5a9e3cd680 144 void stopTimer2()
Yo_Robot 3:8d5a9e3cd680 145 {
Yo_Robot 4:552beeda4722 146 // Detener el Timer 2
Yo_Robot 3:8d5a9e3cd680 147 LPC_TIM2->TCR = 0x2;
Yo_Robot 4:552beeda4722 148 }
Yo_Robot 4:552beeda4722 149
Yo_Robot 6:b4dae934e1ea 150
Yo_Robot 6:b4dae934e1ea 151
Yo_Robot 6:b4dae934e1ea 152
Yo_Robot 6:b4dae934e1ea 153
Yo_Robot 4:552beeda4722 154 /* LEGACY FUNCTIONS
Yo_Robot 4:552beeda4722 155 *
Yo_Robot 5:c5aea1eb10bb 156 * El codigo actual no hace referencia a estas funciones
Yo_Robot 5:c5aea1eb10bb 157 * sin embargo no hay problema en definirlas.
Yo_Robot 4:552beeda4722 158 */
Yo_Robot 4:552beeda4722 159 void setMR3( int newValue )
Yo_Robot 4:552beeda4722 160 {
Yo_Robot 4:552beeda4722 161 LPC_TIM2->MR3 = newValue;
Yo_Robot 4:552beeda4722 162 }
Yo_Robot 4:552beeda4722 163
Yo_Robot 4:552beeda4722 164
Yo_Robot 4:552beeda4722 165 void setPrescaler( int newValue)
Yo_Robot 4:552beeda4722 166 {
Yo_Robot 4:552beeda4722 167 LPC_TIM2->PR = newValue;
Yo_Robot 4:552beeda4722 168 }