les valeurs injectées dans ton graphe son issues d'où ?
Elles proviennent de la mesure de vitesse issue des encodeurs rotatifs positionnés sur des roues folles.
les axes correspondent à quoi ?
L'axe x est le temps (par pas de 50ms)
L'axe y est la vitesse linéaire de la roue codeuse (en m/s)
si tu montrais ton code déjà smiley-wink
//#include <SimpleTimer.h>
#include <HTCL2032.h>
#include "stdio.h"
#include "stdlib.h"
#include <math.h>
#include <avr/interrupt.h>
/* ======================================================
CONSTANTES et BROCHES
==========================================================*/
//GENERAL
#define TEMPS_ECHANTILLONAGE_REGULATION 50 //ms
//DIMENSIONS
#define MM_TICK 0.138 //Le nombre de mm pour 1 tick
#define RRoueCodeuse 263 //mm
//ENCODEURS
#define X 0 //Encodeur Droit
#define Y 1 // Encodeur Gauche
// MOTEUR
#define M1_PWMN 9 //M1_EN Speed Control
#define M2_PWMN 13 //M2_EN Speed Control
#define M1_EN 0 //M1_EN Direction Control
#define M2_EN 1 //M2_EN Direction Control
/* ======================================================
DECLARATION STRUCTURES
==========================================================*/
typedef struct
{
long gauche;
long droit;
long oldDroit;
long oldGauche;
} Encodeur;
typedef struct
{
float reelleD;
float reelleG;
} Vit;
typedef struct
{
unsigned long tempsOld;
unsigned long temps;
} TempoMillis;
/* ======================================================
VARIABLES GLOBALES
==========================================================*/
Encodeur encodeur;
TempoMillis tempoMillis;
Vit vitesse;
/* ======================================================
FONCTIONS
==========================================================*/
void stop(void) //Stop
{
digitalWrite(M1_PWMN,0);
digitalWrite(M1_EN,LOW);
digitalWrite(M2_PWMN,0);
digitalWrite(M2_EN,LOW);
}
void advanceG(char a) //Move forward
{
analogWrite (M1_PWMN,a);
digitalWrite(M1_EN,LOW);
}
void advanceD(char b) //Move forward
{
analogWrite (M2_PWMN,b);
digitalWrite(M2_EN,LOW);
}
void back_offG (char a) //Move backward
{
analogWrite (M1_PWMN,a); //PWM Speed Control
digitalWrite(M1_EN,HIGH);
}
void back_offD (char b) //Move backward
{
analogWrite (M2_PWMN,b);
digitalWrite(M2_EN,HIGH);
}
/* ======================================================
SETUP
==========================================================*/
void setup(void)
{
//----------------DEBUG MODE------------------
Serial.begin(9600);
delay(100);
//----------------------------------------------
//IO
pinMode(M1_PWMN, OUTPUT);
pinMode(M1_EN, OUTPUT);
pinMode(M2_PWMN, OUTPUT);
pinMode(M2_EN, OUTPUT);
digitalWrite(M1_PWMN,LOW);
digitalWrite(M2_PWMN,LOW);
//INIT
init_hctl ( );
}
/* ======================================================
LOOP
==========================================================*/
void loop(void)
{
delay(5000);
advanceD(127);
advanceG(127);
lecture();
}
void lecture()
{
do
{
tempoMillis.temps=millis();
if((tempoMillis.temps-tempoMillis.tempsOld)>=TEMPS_ECHANTILLONAGE_REGULATION)
{
feedback();
tempoMillis.tempsOld=tempoMillis.temps;
}
}while(1);
}
void feedback()
{
// Sauvegarde des anciennes valeurs des encodeurs
encodeur.oldDroit=encodeur.droit;
encodeur.oldGauche=encodeur.gauche;
// Récupérer la valeur des codeurs
hctl_Query(X);
hctl_Query(Y);
// Calculer la vitesse D et G en mm
vitesse.reelleD=((encodeur.droit-encodeur.oldDroit)*MM_TICK)/TEMPS_ECHANTILLONAGE_REGULATION;
vitesse.reelleG=((encodeur.gauche-encodeur.oldGauche)*MM_TICK)/TEMPS_ECHANTILLONAGE_REGULATION;
// Debug
//Serial.print("VD : ");// Mesure en mm/ms
//Serial.print(i);
// Serial.print("\t");
//Serial.print(vitesse.reelleD);
//Serial.print("\t");
//Serial.print("VG : ");
Serial.println( (vitesse.reelleG+vitesse.reelleD)/2 );
}
/* ======================================================
FONCTIONS SUPPORT
==========================================================*/
/*------------------------------------------------------------------------------
Fonction : hctl_Query
Description : Permet de mettre à jour la valeur de l'encodeur demandé
Argument : channel --> Encodeur Droit ou encodeur Gauche
Retour :
--------------------------------------------------------------------------------*/
void hctl_Query ( int channel )
{
long data = 0;
int i;
digitalWrite(PIN_X_Y, channel); //Selection de la voie
delay (1);
digitalWrite(PIN_OE,LOW); //Demande de lecture
delay (1);
//DEBUT LECTURE
// lecture de MSB
digitalWrite(PIN_SEL1, LOW);
digitalWrite(PIN_SEL2, HIGH);
for( i = 7 ; i > -1 ; i-- )
{
data += digitalRead ( tabPinDataHCTL[i] ) ;
data = data << 1;
}
// lecture du 3eme bytes
digitalWrite(PIN_SEL1, HIGH);
for( i = 7 ; i > -1 ; i-- )
{
data += digitalRead ( tabPinDataHCTL[i] ) ;
data = data << 1;
}
// lecture du 2eme bytes
digitalWrite(PIN_SEL1, LOW);
digitalWrite(PIN_SEL2, LOW);
for( i = 7 ; i > -1 ; i-- )
{
data += digitalRead ( tabPinDataHCTL[i] ) ;
data = data << 1;
}
// lecture de LSB
digitalWrite(PIN_SEL1, HIGH);
digitalWrite(PIN_SEL2, LOW);
for( i = 7 ; i > 0 ; i-- )
{
data += digitalRead ( tabPinDataHCTL[i] ) ;
data = data << 1;
}
data += digitalRead ( PIN_D0 ) ;
digitalWrite(PIN_OE,HIGH); //Arret lecture
//FIN DE LECTURE
if ( channel == X )//voie X
{
encodeur.droit = data ;
}
else //voie Y
{
encodeur.gauche = data ;
}
}
/*------------------------------------------------------------------------------
Fonction : init_hctl
Description : Initialise le compteur_decompteur incrémental
Argument :
Retour :
--------------------------------------------------------------------------------*/
void init_hctl ()
{
tabPinDataHCTL[0] = PIN_D0;
tabPinDataHCTL[1] = PIN_D1;
tabPinDataHCTL[2] = PIN_D2;
tabPinDataHCTL[3] = PIN_D3;
tabPinDataHCTL[4] = PIN_D4;
tabPinDataHCTL[5] = PIN_D5;
tabPinDataHCTL[6] = PIN_D6;
tabPinDataHCTL[7] = PIN_D7;
// Serial.println(tabPinDataHCTL[7]);
//Codeur incrémental et compteur
pinMode(PIN_D0, INPUT);
pinMode(PIN_D1, INPUT);
pinMode(PIN_D2, INPUT);
pinMode(PIN_D3, INPUT);
pinMode(PIN_D4, INPUT);
pinMode(PIN_D5, INPUT);
pinMode(PIN_D6, INPUT);
pinMode(PIN_D7, INPUT);
pinMode(PIN_RSTNX, OUTPUT);
pinMode(PIN_RSTNY, OUTPUT);
pinMode(PIN_OE, OUTPUT);
pinMode(PIN_SEL1, OUTPUT);
pinMode(PIN_SEL2, OUTPUT);
pinMode(PIN_X_Y, OUTPUT);
/*pinMode(PIN_TEST, OUTPUT);
pinMode(PIN_U_DX, INPUT);
pinMode(PIN_U_DY, INPUT);*/
reset_hctl(X);
reset_hctl(Y);
encodeur.droit=0;
encodeur.gauche=0;
encodeur.oldDroit=0;
encodeur.oldGauche=0;
}
/*------------------------------------------------------------------------------
Fonction : reset_hctl_X
Description : Reset les deux voies
Argument :
Retour :
--------------------------------------------------------------------------------*/
void reset_hctl (int channel)
{
if ( channel == X ) //X = DROIT
{
//Serial.println("ResetX");
digitalWrite ( PIN_RSTNX, LOW );
delay ( 5 );
digitalWrite ( PIN_RSTNX, HIGH );
delay ( 5 );
encodeur.droit=0;
}else if (channel == Y)
{
//Serial.println("ResetY");
digitalWrite ( PIN_RSTNY, LOW );
delay ( 5 );
digitalWrite ( PIN_RSTNY, HIGH );
delay ( 5 );
encodeur.gauche=0;
}
//Configuration du mode de l
// digitalWrite(PIN_EN1, HIGH);
//delay (25);
//digitalWrite(PIN_EN2, HIGH); //lecture mode 4X
//delay (25);
}