Probleme de code pour codeur incremental et controle du moteur

Salut a tous,

je possède un Robot Car donc j aimerais faire déplacer et parallèlement mesurer la vitesse.
Pour la mesure de la vitesse j’utilise un codeur incrémental (Point de vue Hardware) , une interruption et un Timer (Point de vue software).

je réussis a faire déplacer ma voiture en mesurant simultanément ma vitesse lorsque je définis le PWM a 255 . Par contre lorsque je définis le PWM a (100 ou a 200) ma voiture ne se déplace pas ,ce qui n est pas normal puisqu’avec ces valeurs de PWM elle se déplace normalement lorsque je n essaye pas de mesurer la vitesse simultanément.

Lorsque je commente le Timer elle fonctionne normalement avec ces valeurs de PWM (100 ou 200) , je ne sais pas ou se trouve le problème ?

club-elec.ino (2.21 KB)

Bonjour

post ton code dans les balises

hello tu es sur de tes manips?

chez moi: ton prg dans une mega, un générateur de fréquences sur D2 et un oscillo sur D9.

la vitesse sur 100, générateur sur 1000 Hertz, moniteur affiche 923 toutes les secondes oscillo affiche un signal carré, partie utile 700µ et partie non utile 1ms edit: oscillo sur D9 ou je n'ai pas compris ta demande

Salut a tous voici mon code

#include "TimerOne.h"

// définition des pins de l'Arduino qui contrôlent le  moteur droit (jaune)
#define pinIN1 5
#define pinIN2 6
#define pinENA 9 // doit être une pin PWM 

// définition des pins de l'Arduino qui contrôlent le  moteur gauche(Bleue)
#define pinIN3 13
#define pinIN4 4
#define pinENB 10  // doit être une pin PWM 
volatile int comptageImpulsion=0; // variable accessible dans la routine interruption externe 0


unsigned long lastPulseTime1 ,lastPulseTime2;
volatile  float interval1 = 0  ,interval2 = 0;
volatile int pos1 = 0;  // Position (en nombre de pas) du codeur
volatile int apos1 = 0;
volatile int pos2 = 0;  // Position (en nombre de pas) du codeur
volatile int apos2 = 0 ;
volatile float vit1 = 0;
volatile float vit2 = 0;
const int pas= 20 ;// nombre de Pas(Impuls sur la roue)
//float angularvit= 0 ;
const int radius = 3.325  ; // cm;

float max_speed = 113.04 ; //cm/s

void setup() {
Serial.begin(9600); 

// Moteur Gauche
  pinMode(pinIN1, OUTPUT);
  pinMode(pinIN2, OUTPUT);
  pinMode(pinENA, OUTPUT);

 // Moteur droit
  pinMode(pinIN3, OUTPUT);
  pinMode(pinIN4, OUTPUT);
  pinMode(pinENB, OUTPUT);
  
Timer1.initialize(1000000); 

attachInterrupt(0, gestionINT0, RISING); 

 Timer1.attachInterrupt( ISR_timerone ); // Enable the timer


  // put your setup code here, to run once:

}

void loop() {

  

analogWrite(pinENA,100); 
digitalWrite(pinIN1, false); 
digitalWrite(pinIN2, true);

//Serial.print("Nombre impulsions = ");
//Serial.println(comptageImpulsion);


// le moteur droit tourne en marche avant 
  analogWrite(pinENB, 100); 
  digitalWrite(pinIN3, false); 
  digitalWrite(pinIN4, true);
}


void gestionINT0() {// la fonction appelée par l'interruption externe n°0

comptageImpulsion=comptageImpulsion+1; // Incrémente la variable de comptage

}

void ISR_timerone()
{
  Timer1.detachInterrupt();  // Stop the timer
  Serial.print("Motor Speed 1: "); 
  float rotation1 = (comptageImpulsion / pas) ;// calculate RPS for Motor 1 tour/s
  float speed1 = ( 2*3.14*radius)*rotation1;
  Serial.println(speed1);  
  Serial.print(" RPM - "); 
  comptageImpulsion= 0;  //  reset counter to zero
  Timer1.attachInterrupt( ISR_timerone );  // Enable the timer
}

Voici exactement mon code , mon moteur ne tourne pas avec un PWM a 100

Merci de votre Feedback

@J4l13n

j'ai déjà posté mon code dans les balises

@dfgh

Donc si je comprends bien tu as réussi à lire la vitesse avec un PWM de 100?

oui

@dfgh

Malheuresement je n y arrive pas je ne sais pas ou se trouve le problème . Lorsque je mets le pwm a 255 ca marche tres bien , mais des que je le mets a une valeur en dessous ca ne fonctionne pas :confused:

J'utilise un L298N(H-Bridge) pour alimenter les moteurs

Bonsoir,

il y a conflit de timer1 entre tes PWM (9 et 10) et le timer1 pour tes ISR, il faut soit changer de pins PWM soit changer de timer pour tes ISR