Go Down

Topic: positionnement moteur CC et codeur (Read 410 times) previous topic - next topic

Nesrina

Bonjour, cela fait plusieurs semaines que je travail sur un projet de positionnement d'un moteur CC en fonction d'une consigne
après quelques recherches et d'inspirations trouvées ici et là, j'ai écrit un programme mais celui-ci ne fonctionne pas
la principe, j'envoi une consigne de position par mon PC et normalement je dois aller à cette position
mais cela ne marche pas
une fois la comparaison faite le moteur tourne mais ne s'arrête pas sauf si je lui donne une consigne de 0
je pense qu'il y a un blocage entre la lecture et la comparaison de la position actuelle.
Pouvez-vous aider à corriger mon programme pu à me donner des liens qui pourraient m'aider ?
materiel : moteur Cytron avec codeur intégré, connu sur ce forum
Merci de prêter attention à mon post
cordialement


// code pour vitesse moteur et codeur avec commandes par clavier
// consigne pour positionnement moteur CC


// Prérequis savoir utiliser un timer
#include <TimerOne.h> // Pour le timer
#include <Wire.h>

// Prérequis savoir utiliser les define
// Partie à modifier pour indiquer en define quel pin est branché où A et B à brancher sur 2 et 4
#define ENCODEURA 2
#define ENCODEURB 4

// Variables vers LS290/////

int ENA=5;//Branché sur Arduino pin 5(output pwm) vers LS290 moteur A;
int ValconA; // valeur de la consigne carte LS290;
int IN1=10;//Sur Arduino pin 10
int IN2=9;//Sur Arduino pin 9
int position; // position désirée


// prérequis : volatile => pour toute variable qui sera utilise dans les interruptions

volatile int count =0; // comptage de tick d'encoder  qui sera incrémenté sur interruption " On change " sur l'interruption matériel 0 qui se fait sur le pin 2
volatile double speed =0; // vitesse du moteur
volatile byte laststate =0;  // etat précédent de l'encodeur
String consigne ="";
byte Cons;


void setup()
{

// on initialise les entrées et sorties
 pinMode(ENCODEURA, INPUT_PULLUP);
 pinMode(ENCODEURB, INPUT_PULLUP);
 
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
 pinMode(ENA,OUTPUT);

 
attachInterrupt(0,counter, CHANGE); // on crée l'interruption sur changement sur la pin 2 => interruption 0, la routine counter va se faire toute seule sans l'appeler à chaque changement d'état sur le pin 2

Timer1.initialize(100000); // On défini le timeur : 100000 microseconds ( 0.1 sec - or 10Hz )
Timer1.attachInterrupt( timerIsr ); // attach the service routine here la fonction timerIsr est une routine qui va se faire automatiquement 10* par secondes sans l'appeler

Serial.begin(9600); // Définit vitesse de transmission série
Serial.println("Execution du controle par clavier");
}

void lire_consigne (void)
{
  char car; // variable caractere recu
  consigne = "";
  while (car != 10){
    if (Serial.available() > 0){
      car = Serial.read();
      consigne = String(consigne + car);
    }}}


void positionPlus ()
{ // début de void position+
   digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  analogWrite(ENA,150);
 
  Serial.println ("Position    PLUS");
  Serial.print ("consigne Cons position demandée :  ");
  Serial.println(Cons);
  Serial.print ("pisition actuelle :  ");
  Serial.println(count);
 
}  // fin void position +

void positionMoins ()
{
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
  analogWrite(ENA,150);
  Serial.println ("Position    MOINS");
  Serial.print ("consigne Cons position demandée :  ");
  Serial.println(Cons);
  Serial.print ("pisition actuelle :  ");
  Serial.println(count);
}

void loop(){
  lire_consigne();
  Cons = (consigne.toInt());
   Serial.print("nombre de clik : ");
  Serial.println(count);
      if (( (Cons + 2) < count)) {
      positionMoins();
    }
  if (( (Cons - 2) >count)) {
      positionPlus();
    }
   
    else
    { 
     
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, LOW);
  analogWrite(ENA,0);
    }
   
  Serial.print ("consigne Cons position demandée :  ");
  Serial.println(Cons);
  Serial.print ("pisition actuelle :  ");
  Serial.println(count);
  ConsPlus= Cons + 2;
  ConsMoins = Cons - 2;


} //fin loop


// Encoder counter 0

void counter()
{
  byte state=PIND;
 
  state|=B11101011;  // mask pour ne regarder que les changements sur 2 et 4
  // Modifier le MASK  B01111011 par BXXXXXXXX mettre des 0 là où sont les pins utilisés par l'encodeur
  if( state!=laststate)
  {
    (((state&(1<<ENCODEURA))>>ENCODEURA)^((state&(1<<ENCODEURB))>>ENCODEURB))?count--:count++;
    laststate=state;
  }

}


// Timer event to calculate speed from counters

void timerIsr()
{
    speed=count; // on a le nombre de tick ( signé ) par unité de temps  = vitesse
    //count=0; // On remet le compteur de tick à 0
}


 

3Sigma

Bonjour,

Tu n'es pas dans la bonne section du forum.
A part ça, que fait cette ligne en algorithmie écrite en français ?

(((state&(1<<ENCODEURA))>>ENCODEURA)^((state&(1<<ENCODEURB))>>ENCODEURB))?count--:count++;

Tu aurais tout intérêt à l'écrire de façon plus lisible car dans deux mois tu te poseras toi-même cette question.

Sinon, que s'affiche-t-il dans le moniteur série quand tu exécutes le programme ?

Go Up