Red de conocimiento informático - Aprendizaje de código fuente - Programa de seguimiento de coches inteligentes

Programa de seguimiento de coches inteligentes

El módulo de seguimiento del carro eléctrico se transfiere desde: /s/blog_4bb018e10100ermy.html como referencia: //Incluye los archivos de encabezado requeridos

#include ioM16v.hgt;

#include lt;macros.hgt;

#include "time1_init.h"

#include "motor.h"#definir adelante 1

#define hacia atrás 0

#define compare(x,y) (xlt;y?1:0)

#define mid 0X17//Inicialización de puerto

void port_init(void)

{

PORTA = 0x00;

DDRA = 0x00;

PORTB = 0x00;

DDRB = 0x08;

PORTC = 0x00;

DDRC = 0x00;

PORTD = 0x00;

DDRD = 0x00 ;

}void timer0_init(void)

{

TCCR0 = 0x00; //Detener el temporizador

TCNT0 = 0x00; //Valor inicial

OCR0 = 0x17; //Valor coincidente

TIMSK |= 0x00; //Interrupción habilitada

TCCR0 = 0x7D;

}void adc_init(void)

{

//inicialización de conversión adc

ADCSRA = 0x00; //Deshabilitar conversión AD

ADCSRA|=BIT(ADIF);

ADMUX=0X46;

SFIOR |= 0x00;

ACSR = 0x80; Deshabilitar el comparador analógico

ADCSRA = 0xE7;

}void init_devices(void)

{

CLI() //Deshabilitar todo interrupciones

MCUCR = 0x00;

MCUCSR = 0x80; //Deshabilitar JTAG

GICR = 0x00;

port_init(); /p>

timer0_init();

timer1_init();

adc_init();

SEI() //Habilitar interrupción global

p>

}uint sensor_head[3], sensor_back[3], cord; //Almacena los valores convertidos AD de 6 sensores

uchar offset; //La línea negra desplaza el eje central. de la distancia del automóvil

uint sensor_compare_head[3]={300, 300, 300}, sensor_compare_back[3]={300, 300, 300} // El umbral para juzgar si la línea negra está por debajo el sensor uchar start_head_sensor(void )

{

uchar i, j=0, sum=0

ADMUX=0X40; >ADCSRA=0xC7;

mientras(ADCS

RAamp;BIT(ADSC));

for(i=0;ilt;3;i)

{

ADMUX=0X40 i; Sensor frontal 0, 1, 2 canales

ADCSRA=0xC7;

while(ADCSRAamp;BIT(ADSC));

sensor_head[i]= ADC;

}

for(i=3;i;i--)

{

if(compare(sensor_head[ i- 1], sensor_compare_head[i-1]))

{

suma =i-1;

j;

}

}

if(j)

offset=sum*2/j;

ADMUX=0X46;

ADCSRA=0xE7;

compensación de retorno;

}

uchar start_back_sensor(void)

{

uchar i, j=0, suma=0;

ADMUX=0X43;

ADCSRA=0xC7

mientras(ADCSRAamp;BIT(ADSC) );

for(i=0;ilt;3;i)

{

ADMUX=0X43 i; //Habilitar los canales del sensor frontal 0 , 1 y 2

ADCSRA=0xC7;

mientras(ADCSRAamp;BIT(ADSC));

sensor_back[i]=ADC; >

}

for(i=3;i;i--)

{

if(compare(sensor_back[i-1], sensor_compare_back[i-1 ]))

{

suma =i-1

j;

}

if(j)offset=sum*2/j;

ADMUX=0X46;

ADCSRA=0XE7;

desplazamiento de retorno

}//Función de filtro del sensor de ángulo

uint cord_sensor(void)

{

uchar i;

uint max=0, min=1023, suma=0;

for(i=0;ilt;5;i)

{

ADCSRA| =BIT(ADIF);

mientras(!(ADCSRAamp;BIT(ADIF)));

cordón=ADC;

suma =cordón;

p>

max=(maxgt; cord)?max: cord;

min=(minlt; cord)?min: cord;

}

return (sum-max-min)/3;

}void direc_ctrl(uchar x, uchar y)

{

si(y)

{

si(x==0)OCR0=mediados de 3;

if(x==4)OCR0=mediados de 3;

<

p>if(x==2) OCR0=mid;

}

else OCR0=mid x-2

}void menmber_path(void)

{

uchar j;

uint i

uint max_head[3]={0, 0, 0}, min_head[ 3]={1023, 1023, 1023}, max_back[3]={0, 0, 0}, min_back[3]={1023, 1023, 1023};

for(i=4000; i; i--)

{

start_head_sensor();

for(j=0;jlt;3;j)

{

max_head[j]=(max_head[j]gt; sensor_head[j])?max_head[j]: sensor_head[j];

min_head[j]= ( min_head[j]lt;sensor_head[j])?min_head[j]:sensor_head[j];

}

start_back_sensor();

para( j=0; jlt; 3; j )

{

max_back[j]=(max_back[j]gt; sensor_back[j])?max_back[j]:sensor_back[ j];

min_back[j]= (min_back[j]lt; sensor_back[j])?min_back[j]: sensor_back[j];

}

}

for(j=0;jlt;3;j)

{

sensor_compare_head[j]=(max_head[j] min_head[ j])/2;

sensor_compare_back[j]=(max_back[j] min_back[j])/2;

}

}

uchar head_sensor_all(void)

{

start_head_sensor();

if( comparar(sensor_head[0], sensor_compare_head[0]) amp ;amp; comparar(sensor_head[1], sensor_compare_head[1]) amp;amp; comparar(sensor_head[2], sensor_compare_head[2]))

return 1;

else

return 0;

}uchar back_sensor_all(void)

{

start_back_sensor();

si (comparar(sensor_back[0], sensor_compare_back[0]-30) comparar(sensor_back[1], sensor_compare_back[1]-30) comparar(sensor_back[2], sensor

_compare_back[2]-30))

devuelve 1;

else

devuelve 0;

}

void search_path_ahead(uchar velocidad)

{

motor_autorun(adelante, velocidad);

mientras(1)

{

if(head_sensor_all())

{

motor_stop();

retorno;

}

else

{

direc_ctrl(desplazamiento, 1

}

}

); }

void search_path_backward(uchar velocidad)

{

motor_autorun(0, velocidad);

mientras(1)

{

if(back_sensor_all())

{

motor_stop();

regresar;

}

else

direc_ctrl(desplazamiento, 0

}

}

);