ESCUELA MILITAR MILITAR DE INGENIERÍA MCAL. ANTONIO JOSE DE SUCRE ´´BOLIVIA´´
EXAMEN 2do PARCIAL
8
INGENIERIA DE SISTEMAS ELECTRONICOS SISTEMAS DE MICROPROCESADORES ALUMNOS:
A9607-5
APAZA BUTRON DIEGO PALERMO
A9533-8
INCA NINA MARCO VLADIMIR VLADIMI R
PARALELO:
7mo Semestre
FECHA:
23 / 05 / 2012
LA PAZ - BOLIVIA
ROBOT SENSOR PING
OBJETIVO Graficar nuestro entorno atravez del sensor ultrasonido PING , que se
visualiza en el LCD grafico
OBJETIVO DE LA PRUBA
1. Programamos un algoritmo para visualizar si el sensor mide distancia tomando en cuenta la hoja de datos del PING)). El algoritmo lo hicimos de dos maneras una , con un contador de 16bits, y otra utilizando el Timer. 2. Utilizamos PWM para el movimiento del servomotor. 3. Visualizamos pixel por pixel el entorno.
PROGRAMAS
Inicio
Configurando PD5 como salida Poner el pin en estado alto =1
Un pulso de duración de 5us (según al hoja de datos)
Poner en estado bajo PD5 PD5 como entrada
PD5==0 Se mantiene hasta que el sensor responda
2
Comienza el Timer , o contador de 16 bits
Espera mientras esta en Uno PIND==1
Ts=Obtener el dato del Timer o del contador *velocidad del contadpr Deshabilita el timer usado anteriormente
Obtener el dato de la distancia en función del tiempo obtenido Dist=ts*100*340/2 [cm]
Modulacion porancho de pulso PWM Para el funcionamiento del motor
int t; //timerInit(); //Configure TIMER1 TCCR1A|=(1<
t=170;t<=389;t=t+5 Muestra el porcentaje de recporrieno del motor siento la var “x” El an ulo de recorrido sea var “t”
x,t del entorno Grafica
El pixel estara en funcion de los siguientes parametros, t(angulo del servo ), distancia,
CODIGO
/* includes */ #include
#include #include #include "global.h" #include "uart.h" #include "rprintf.h" #include "a2d.h" #include "timer.h" PWM, etc) #include "t6963c.h" #include "menu_inicio.h" #include "menu1.h" #include "rostrobien.h" #include (nombres : port, pin , etc) #include interrupcion) #include #include "global.h" globales #include u16 as=1; uint8_t x,xx, y, r;//,ccad; //void wait(void); void oscope(void); void rprintfFloatG(char numDigits, double x); void delay_us(unsigned short time_us) ; double p; u16 cont; float tiempous=0; float mostar,dist; u08 oldbuffer[128]; u08 newbuffer[128]; 4
// access to controller I/O // integer types // access to program memory // include uart function library // include printf function library // include A/D converter function library // include timer function library (timing, // definitions and prototypes
// include I/O definiciones // include nombres "signal" (nombres // include soporte para interrupciones // include configuraciones
int main (void) { /*****LCD**********/ lcd_initialise(); lcd_clear_graphics(); lcd_clear_text(); lcd_write_command(LCD_DISPLAY_MODES_GRAPHICS_ON | LCD_DISPLAY_MODES_TEXT_ON); rprintfInit(lcd_write_char);
lcd_gotoxy(2,6);rprintf("Robot PING"); cont=0; //SERVO ********** //int t; //timerInit(); /* //Configure TIMER1 TCCR1A|=(1<
DDRC=0xFF; //PORTC: Salida // SALIDA PD0 cbi(PORTD,0); //PD0=0 // espera 2Us sbi(PORTD,0); //PD0=1 _delay_us(5); //ESPERA DE 5us
cbi(PORTD,0); // PD0=0 /******FIN DEL PULSO******/ cbi(DDRD,0); //ENTRADA PD0 sbi(PORTD,0); //PULL UPS ACTIVADOS //_delay_us(10); while((PIND & _BV(0))==0){} if(cont<65536) { cont++;
_delay_ms(1); } while((PIND & _BV(0))==1) {} mostar=cont; lcd_gotoxy(2,4); rprintfFloatG(4,mostar); //_delay_ms(1); dist=mostar*0.001*345/2; lcd_gotoxy(1,1);rprintfFloatG(1,dist); //DrawLine(60,32,dist,32,1); if(){} lcd_set_pixel(mostar, dist); //delay_us(500); if(dist>15){sbi(PORTC,0);} else{cbi(PORTC,0);} _delay_us(200); }
/* while (3) {
for (t=170;t<=389;t=t+5)
{ x=100*(t-170)/219; lcd_gotoxy(2,4); rprintfFloatG(4,x); OCR1A=t; //180 degree wait(); } }*/ } //-----------------subrutinas---------------------void oscope(void) { u08 i=0; for(i=0; i<128; i++) { oldbuffer[i] = newbuffer[i]; // for(i=0; i<128; i++) newbuffer[i] = a2dConvert8bit(0); //for(i=0; i<128; i++) lcd_set_pixel(i,newbuffer[i]>>2); } 6
//{ lcd_clear_pixel(i,oldbuffer[i]>>2); }
void rprintfFloatG(char numDigits,double x) { unsigned char firstplace = FALSE; unsigned char negative; unsigned char i, digit; double place = 1.0; // save sign negative = (x<0); // convert to absolute value x = (x>0)?(x):(-x); // find starting digit place for(i=0; i<15; i++) { if((x/place) < 10.0) break; else place =place*10.0; } // print polarity character if(negative) rprintfChar('-'); else rprintfChar('+'); // print digits for(i=0; i
uint8_t i; for(i=0;i<50;i++) { _delay_loop_2(0); } }*/
CONCLUSIONES
Concluimos que para tener algo mas preciso del funcionamiento del sensor PING)) es necesario saber el funcionamiento del Timer , asi también es posible con el Flanco de subida y de bajada .
8