IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Calcul d'incrémentation pour compteur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Par défaut Calcul d'incrémentation pour compteur
    Bonjour à tous,

    Je galère sur un petit bout de mon programme et là j'avoue que sans aide extérieure, des idées fraîches , je n'y arriverai pas.

    Pour le background je peux dire que mon projet est un petit robot qui met en œuvre 2 compteurs (roue droite et gauche) qui servent à compter la distance et le sens de rotation. Ces compteurs comptent entre 0 et 65535. Si ils arrivent à 65535 ils retournent à 0. De la même manière si une roue recule le compteur décompte.

    J'ai donc besoin d'une variable qui évolue entre -32767 et 32767 pour l'asservissement en position et, c'est là qu'est mon problème, d'une seconde variable qui évolue toujours positivement (même si le robot recule et que les compteurs décomptent) pour l'asservissement en vitesse.

    par exemple si le compteur évolue de la sorte : 1, 2, 4, 3, 1, 65530, 65500
    alors la variable pour l'asser en position donne: 1, 2, 4, 3, 1, -5, -35
    puis la variable pour l'asserv en vitesse donne: 1, 2, 4, 5, 7, 12, 42
    (Légende : Rouge : valeur qui croît; Bleu : valeur qui décroît)

    Voici la fonction que j'ai réalisé jusqu'à présent. Pour incrémenter constamment ces variables de vitesse (CmptVD et CmptVG) j'ai tenté une comparaison entre l'itération actuelle et précédente mais la variable décroit tout de même. C'est un échec.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    //---------------------------------------------------------------------------
    // 							FONCTION COMPTAGE 								-
    //	En entrée : compteurs hardware ls7366 allant de 0 à 65535				-
    //	En sortie : CmptD, CmptG allant de -32767 à +32767						-
    //				CmptVG, CmptVG allant de 0 à 65535 quelque soit le sens 	-
    //
    //					   [0]------------------------[65535]>		-
    //			<[-32767]----------[0]----------[32767]>					-
    //---------------------------------------------------------------------------
    void Comptage(void)
    {
     
    	CmptD = Qcntr_Read(QcntrD); // charger le compteur Droit
    	CmptG = Qcntr_Read(QcntrG);
    	CmptVD = CmptD;
    	CmptVG = CmptG;
     
    //---------- variable asservissement position
    		if (Qcntr_Read_Sens(QcntrD) == 0) 							// AVANCER
    		{
    			if (CmptD > 32767){CmptD = 0;}							// et dépasser 32767 = retour à 0
    		} 
    			else 													// RECULER
    			{
    				if (CmptD > 32767){CmptD = CmptD - 65535;}			// et dépasser 32767 = compter sous 0
    				if (CmptD < -32767){CmptD = 0;}
    			}
     
     
    		if (Qcntr_Read_Sens(QcntrG) == 0) 							// AVANCER
    		{
    			if (CmptG > 32767){CmptG = 0;}							// et dépasser 32767
    		} 
    			else 													// RECULER
    			{
    				if (CmptG > 32767){CmptG = CmptG - 65535;}			// et dépasser 32767
    				if (CmptG < -32767){CmptG = 0;}
    			}
     
    //---------- variable asservissement vitesse
    	if (CmptD < OldCmptD )  { CmptVD += CmptVD + (OldCmptD - CmptD) ; } else {CmptVD = CmptD;}  // calculer compteur vitesse
    	OldCmptD = CmptD; // actualiser itération précédente
     
    }
    Merci à vous!

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Il nous manque le plus important : les déclarations et donc les types des variables entières que tu manipules.

    Tu peux t'en sortir en détournant à ton profit le dépassement de capacité d'un entier - integer overflow, en anglais - sur des variables de type uint16_t (defini dans stdint.h / inttypes.h). Attention : en C le comportement d'un dépassement n'est défini que pour des opérations arithmétiques sur des entiers non signés. Il faudra ajouter une petit manip afin d'obtenir une variable bouclant entre -32767 (-32768 ?) et +32767.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Par défaut
    Il nous manque le plus important : les déclarations et donc les types des variables entières que tu manipules.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    float CmptG, CmptVG ; 		// Compteur position gauche, compteur vitesse gauche
    float CmptD, CmptVD ;
    float OldCmptD , OldCmptG ;

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Une raison particulière pour en faire des float ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (CmptD > 32767)
    {
        CmptD = CmptD - 65535;
    }
    if (CmptD < -32767)
    {
        CmptD = 0;
    }
    Ces deux blocs :

    • sont interdépendants (peut-être faudrait-il un else ?) ;
    • ne sont pas symétriques du point de vue logique : les deux traitements ne sont pas équivalents.


    Tu as du code dupliqué : fais une fonction si tu dois appliquer l'invariant à plus d'une variable.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Par défaut
    Pas de raison particulière non.

    Tu as du code dupliqué : fais une fonction si tu dois appliquer l'invariant à plus d'une variable.
    Pardon mais je ne comprend pas cette phrase.

    De toute manière ce qui m’amène ici c'est l'autre partie du programme qui concerne la variable CmptVD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //---------- variable asservissement vitesse
    	if (CmptD < OldCmptD )  { CmptVD = CmptVD + (OldCmptD - CmptD) ; } else {CmptVD = CmptD;}  // calculer compteur vitesse
    	OldCmptD = CmptD; // actualiser itération précédente

  6. #6
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Citation Envoyé par fred7 Voir le message
    Pas de raison particulière non.
    Alors ne les utilise pas les float sont fait pour faire des calculs mathématique plus poussé , mais ne sont pas très précis les comparaison avec des nombre entier peut causer quelque souci.

    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (CmptD > 32767){CmptD = 0;}							// et dépasser 32767 = retour à 0
    		} 
    			else 													// RECULER
    			{
    				if (CmptD > 32767){CmptD = CmptD - 65535;}			// et dépasser 32767 = compter sous 0
    				if (CmptD < -32767){CmptD = 0;}
    			}
    utilise un short , ça t'évitera ce genre de calcul !

Discussions similaires

  1. Problème de calcule en SQL !
    Par FilipeVV dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/09/2005, 11h45
  2. Problème de calcul matricielle
    Par Clad3 dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 29/06/2005, 21h45
  3. problème de calcul des normales par sommet
    Par captainSeb dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/01/2005, 13h42
  4. [Calendar]Problème de calcul de date
    Par valerie90 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 08/12/2004, 12h13
  5. Problème de calcul unix_timestamp
    Par petit_stagiaire dans le forum Administration
    Réponses: 2
    Dernier message: 28/04/2004, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo