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) p>
{
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)
{ p>
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
}
}
);