fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Futuro seguidor de linea

7 Respuestas
3 Usuarios
0 Reactions
3,083 Visitas
freire
Respuestas: 12
Topic starter
(@freire)
Active Member
Registrado: hace 18 años

Hola, estoy haciendo un cutre-seguidor de linea, el problema es que no se como hacer para que cada vez k se llama a la funcion esta empiece de nuevo y siempre me da un valor alto (5v) sea cual sea el valor del pwm, nose si me explico... si le coloco un delay dentro de cada if, tonces si me funciona bien, pero no quisiera que el programa se quedara esperando en el delay. Graciass!!

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,124,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_pwm1_duty(0);
set_pwm2_duty(0);
setup_comparator(NC_NC_NC_NC);

while(1){
// LINEA NEGRA
lectura=input_d(); // D7 D6 D5 D4 ///// D3 D2 D1 D0

if(lectura==0x01){ //D0 +derecha
MD_AVANZA (0);
MI_AVANZA (511);

}
else if(lectura==0x80){ //D7 +izquierda
MD_AVANZA (511);
MI_AVANZA (0);

}
else{
MD_AVANZA (1023);
MI_AVANZA (1023);

}

}

}

void MD_AVANZA (int pwm1){
output_high(IN1);
output_low(IN2);
set_pwm1_duty(pwm1);
}

void MI_AVANZA (int pwm2){
output_high(IN3);
output_low(IN4);
set_pwm2_duty(pwm2);
}

Responder
6 respuestas
garrocha
Respuestas: 1110
(@garrocha)
Ardero
Registrado: hace 19 años

Montate un "reloj" y comprueba cuanto tiempo lleva funcionando el pwm antes de volver a escribir sobre el, porque lo que te pasa es que no le das tiempo al pwm a funcionar y lo re-seteas (literalmente) antes de que llegue a hacer algo. Pseudocodigo de ejemplo:

Interrupcion reloj()
{
si timer desbordado
reloj ++
}

y ahora antes de setear los pwm

if(relojpwm1>reloj)
{
Haz lo que sea;
relojpwm1+10 (o los ciclos de retardo que quieras)
}

Con eso evitaras entrar en la funcion antes de tiempo.

Un Saludo

Responder
freire
Respuestas: 12
Topic starter
(@freire)
Active Member
Registrado: hace 18 años

sigo sin exarlo a funcionar, ya esk nose k toy liando, ni k toy haciendo mal!!!, el nuevo codigo lo he exo con interrupciones, pero nose xk pero no me entra en el while principal, o como cambiar el valor k le mando a las interrupciones, nose si me explico, abe si me podrias exar una mano!!! gracias!!

#include <main.h>

#define ajuste 255 //Salta la interrupcion cada x tiempo

#DEFINE EN_A PIN_C2 //MOTOR DERECHA
#DEFINE EN_B PIN_C1 //MOTOR IZQUIERDA

#DEFINE IN1 PIN_B1
#DEFINE IN2 PIN_B2
#DEFINE IN3 PIN_B3
#DEFINE IN4 PIN_B4

int TICKS;
int PWM1;
int PWM2;

#int_TIMER0
void timer0_isr() {

if(TICKS<=PWM1)output_high(EN_A);
if(TICKS<=PWM2)output_high(EN_B);

if(TICKS>PWM1)output_low(EN_A);
if(TICKS>PWM2)output_low(EN_B);

if(TICKS==255)TICKS=0;

TICKS++;
set_timer0(ajuste);
}

void main()
{
TICKS=0;
PWM1=0;
PWM2=0;

output_high(IN1);
output_low(IN2);
output_high(IN3);
output_low(IN4);

set_timer0(ajuste);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);

while(true){
// LINEA NEGRA
unsigned char lectura=input_D(); // D7 D6 D5 D4 ///// D3 D2 D1 D0
if(lectura==0x01){ //D0 +derecha
PWM1=255;
PWM2=0;
output_high(pin_c4);
}
else if(lectura==0x80){ //D7 +izquierda
PWM1=0;
PWM2=255;
output_high(pin_c5);
}
else{
PWM1=255;
PWM2=255;
output_high(pin_c6);
}
}

}

Responder
freire
Respuestas: 12
Topic starter
(@freire)
Active Member
Registrado: hace 18 años

bueno pues ya ta casi solucionado, x lo visto el pic se kedaba "cogio", alguien me puede decir k preescaler minimo se le puede poner?? me interesaria k se desbordara cada 0,4 us, x tener una resolucion de "8 bits", es decir que cuente hasta 255, y que tenga un periodo de 100 us aprox, para tener una frecuencia de 10khz

Responder
garrocha
Respuestas: 1110
(@garrocha)
Ardero
Registrado: hace 19 años

¿Que reloj, y pic, le ties puesto?

Responder
Página 1 / 2
Compartir: