Pages : 1
#1 Le 09/12/2007, à 19:21
- yoyo91
Robot suiveur de ligne
Bonjour,
Dans le cadre de l iut nous fabriquons un robot suiveur de ligne pour participer a une compétition inter iut.
J ai deux questions qui me trotte .
1) Comment faire en sorte que GPSIM prenne en compte la reference de mon pic qui est un 18f4550.
2) Pour ce qualifier pour la competition le robot doit passer trois epreuves et une des epreuves et d effectuer un carre mais sans ligne blanche juste a l aide des timers.
Mais je n arrive pas a comprendre comment fonctionne les timers. si quelqu un peut m expliquer en detail je serai ravi.
Voila le code des timers
#include <stdio.h>
#include <stdlib.h>
#include <p18f4550.h>
#include "gamelcd_v3.h"
#include "gamelinit_v3.h"
#include "gameladc_v3.h"
#include "gamelpwm_v3.h"
#include <timers.h>
void main()
{
char BP1=0,BP2=0,BP0=0,J=0,SW,etat=0;
int GG,DD,D,G,R,DDD,alpha;
lcd_init();
pwm_setdc2(0);
pwm_setdc1(0);
TRISA=0xBF;
TRISC=0xF9;
TRISE=0xFF;
TRISB=0xFF;
adc_init(6);
pwm_init(150,2);
G=adc_read(3);
D=adc_read(4);
OpenTimer0(TIMER_INT_OFF &
T0_16BIT &
T0_SOURCE_INT &
T0_PS_1_256); //config timer
WriteTimer0(0);
while (1)
{
if (etat==0)
{
J=PORTEbits.RE2;
if (J==1)
{
pwm_setdc2(300);
pwm_setdc1(300);
while (ReadTimer0()<46893); //attente de 0.5s
etat=1;
}
}
else if (etat==1)
{
pwm_setdc2(0);
pwm_setdc1(300);
while (ReadTimer0()<46893); //attente de 0.5s
etat=2;
}
else if (etat==2)
{
pwm_setdc2(0);
pwm_setdc1(0);
while (ReadTimer0()<46893); //attente de 0.5s
etat=3;
}
else if (etat==3)
{
etat=0;
}
}
}
Voila normalement le code ci dessus devrait demarrer les deux roues puis en arreter une pour effectuer la rotation puis eteindre le moteur pour redemarrer les deux en mm temps.
Mais le reel probleme est que je n arrive pas a modifier la longueur du temps d arret.
Hors ligne
#2 Le 09/12/2007, à 22:11
- Link31
Re : Robot suiveur de ligne
le reel probleme est que je n arrive pas a modifier la longueur du temps d arret.
Je ne connais strictement rien à la bibliothèque que tu utilises, mais en regardant le code ça me semble assez clair :
Cette ligne impose un temps d'attente de 0,5 seconde :
while (ReadTimer0()<46893); //attente de 0.5s
Il suffit donc de modifier la valeur maximale que doit atteindre le timer avant de continuer (46893), ou de répéter cette ligne dans le cas o๠ReadTimer0() ne supporterait pas de valeur de retour plus grande.
En tout cas, il me semble qu'il devrait y avoir une ligne pour remettre à zéro le compteur après chaque attente, en utilisant probablement la fonction :
WriteTimer0(0);
Sinon, comment la fonction ReadTimer0() peut-elle détecter que le while(1) est entré dans une nouvelle itération ?
Dernière modification par Link31 (Le 09/12/2007, à 22:12)
Hors ligne
#3 Le 09/12/2007, à 23:02
- robrob
Re : Robot suiveur de ligne
Cette ligne aussi est importante, puisqu'elle configure ton timer:
OpenTimer0(TIMER_INT_OFF &
T0_16BIT &
T0_SOURCE_INT &
T0_PS_1_256); //config timer
TIMER_INT_OFF -> pas d'interruption
T0_16BIT -> timer sur 16 bits (donc pas la peine d'attendre qu'il dépasse 65535
T0_SOURCE_INT -> source de l'horloge interne (sans doute l'oscillateur principal, à vérifier)
T0_PS_1_256 -> prédiviseur de l'horloge à 256
La fréquence du timer c'est fréquence de sa source d'horloge (qui n'est pas forcement l'oscillateur principal) divisée par la valeur du prédiviseur. Si tu veux une durée de tempo plus grande, regarde donc aussi les valeurs de prédivision disponible (il me semble que ça peut monter à 1024).
Dernière modification par robrob (Le 09/12/2007, à 23:05)
Hors ligne
#4 Le 10/12/2007, à 19:23
- yoyo91
Re : Robot suiveur de ligne
Merci de vos réponses j'essaie demain sur mon robot en cours je vous tient au courant.
Hors ligne
#5 Le 12/12/2007, à 18:16
- yoyo91
Re : Robot suiveur de ligne
Merci pour votre petit aide voici comment gérer les pauses pour les pwm
void main()
{OpenTimer0(TIMER_INT_OFF &
T0_16BIT &
T0_SOURCE_INT &
T0_PS_1_128); //config timer
WriteTimer0(0);
if (J==1)
{
pwm_setdc2(280); // Valeur attribuée aux pwm d'apres des focntions que l'ont ma fourni
pwm_setdc1(300);
for (i=0;i<=LD;i++)//Permet de faire une boucle du nombre de seconde que l'ont veut laisser les pwm aux valeurs précédentes
{
WriteTimer0(0);
while (ReadTimer0()<46893); //attente de 1s
}
}
}
Hors ligne
Pages : 1