Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

yoyo91 a écrit :

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 wink
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