Documentos de Académico
Documentos de Profesional
Documentos de Cultura
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR_HOOK(void)
{
// Manejo de los botones:
if ((!(P1IN&BIT3))|(!(P1IN&BIT2)))
{ ciclospuls++; // si alguno de los 2 botones está pulsado, cuenta ciclopuls
i=0; /// cada vez que se cambie de estado, i=0;
}
if(!(P1IN&BIT2))
{
estado=2;
i=0;
ciclospuls=0;
}
}
}
if (estado!= 0)
{
i++; // el voltaje pwm cambiará cada 0.02 s, y también se grabará un voltaje cada 0,02s
}
LPM0_EXIT;
}
Para conocer la velocidad del coche en cada punto del trayecto, mediremos la tensión en
los raíles, que oscila entre 0 y 14 voltios. Dado que el ADC puede leer tensiones en un
rango de 0 a 3,6 voltios, hay que montar un divisor resistivo que reduzca el valor a
medir. Para ello se usan 4 resistencias de 330 Ohm en serie, que dejan el máximo en 3,5
voltios. Se conectan de la siguiente forma:
Para ir almacenando los valores leídos por el ADC, se planteaba el problema de que un
array de digamos, 500 ints, (10s) no cabía en la ram ni en la memoria de información del
micro. Para ello, hubo que reservar un espacio en la flash, que en un principio se pensó
de 2 segmentos de 512 bytes. En el archivo .CMD, se modificaron las siguientes líneas:
MEMORY
{
SFR : origin = 0x0000, length = 0x0010
PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0
PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100
RAM : origin = 0x0200, length = 0x0200
INFOA : origin = 0x10C0, length = 0x0040
INFOB : origin = 0x1080, length = 0x0040
INFOC : origin = 0x1040, length = 0x0040
INFOD : origin = 0x1000, length = 0x0040
FLASHDATOS : origin = 0xC000, length = 0x0400
FLASH : origin = 0xC400, length = 0x3BDE
BSLSIGNATURE : origin = 0xFFDE, length = 0x0002, fill = 0xFFFF
INT00 : origin = 0xFFE0, length = 0x0002
INT01 : origin = 0xFFE2, length = 0x0002
INT02 : origin = 0xFFE4, length = 0x0002
INT03 : origin = 0xFFE6, length = 0x0002
INT04 : origin = 0xFFE8, length = 0x0002
INT05 : origin = 0xFFEA, length = 0x0002
INT06 : origin = 0xFFEC, length = 0x0002
INT07 : origin = 0xFFEE, length = 0x0002
INT08 : origin = 0xFFF0, length = 0x0002
INT09 : origin = 0xFFF2, length = 0x0002
INT10 : origin = 0xFFF4, length = 0x0002
INT11 : origin = 0xFFF6, length = 0x0002
INT12 : origin = 0xFFF8, length = 0x0002
INT13 : origin = 0xFFFA, length = 0x0002
INT14 : origin = 0xFFFC, length = 0x0002
RESET : origin = 0xFFFE, length = 0x0002
}
Además, hubo que indicarle al compilador que excluyera esos segmentos del borrado cada vez
que cargase el programa en el micro.
Más tarde, se decidió cambiar el tipo de dato a char, dado que el rango de un int (1024)
es excesivo para la aplicación que queremos (el mando no tiene tanta precisión), por lo
que tanto espacio se volvió innecesario. Además, para simplificar más el problema, se
redujo el tiempo máximo de grabación de 10s a 6s, por lo que el volcado del vector
temporal volt (guardado en ram) a la flash, se puede realizar en un solo golpe con la ram
que queda disponible con el resto del programa en funcionamiento. (300 * 8 = 2400bits).
//EMPIEZA LA ESCRITURA
for(k=0;k<=numdato;k++)
{
Puntero1[k]=(dato[k]);
}
Cuarta parte: regulación del voltaje de salida con PWM y amplificación con puente en h.
Para mandar tensión al circuito, configuramos el timer A0 de manera que TA0CCR0 sea
múltiplo de 256. Para tener un valor aceptable de frecuencia, se escogió un factor 63.
En el bucle del programa, este valor se irá actualizando al compás del timer 1 de la
siguiente forma:
//CONFIGURACIÓN PINES:
//
// // P1.6 PWM: (salida al puente h)
// P1DIR|=BIT6; //P1.6 salida
// P1SEL|= BIT6; //P1.6 pwm
// P1SEL2&=~BIT6; //P1.6 pwm
// MÁQUINA DE ESTADOS
switch (estado)
{
if(i<=ivuelta)
{ P1OUT|=BIT7;
ADC10CTL0 |= ADC10SC; // Empieza conversión del ADC
while( ADC10CTL1 & ADC10BUSY ); // Espero a la conversión
x= ADC10MEM>>2; // pasamos a precisión 8 bits
(despreciando los 2 bits menos significativos)
volt[i]=(char) x; // al hacer cast, nos quedamos sólo con
los 8 bits del formato char
}
if(i==ivuelta)
{ guarda_flash_vector(volt,300); // vuelca el vector en la flash
i=0;
estado=0;
P1OUT&=~BIT7;
a=lee_volt(5); // para comprobar que está escribiendo
}
break;
// ACTIVAR PWM:
break;
}
}
En este documento ya se ha corregido dicho fallos. Se incluyen también vídeos del proyecto
en funcionamiento.
Mejoras posibles:
Ampliar el tiempo de grabación creando una función que permita guardar datos en la
flash en más de un volcado, inicializando a cero el array auxiliar volt cada vez.
También habría que modificar la función guarda_flash para poder continuar el
guardado en el siguiente segmento, de manera que se aproveche todo el espacio
reservado.
Añadir un semáforo de salida con un led, que avise de cuando empieza el tiempo de
grabación/reproducción.