Aide Affichage de la valeur angulaire d'un codeur

Moi33

Moi33

Apprenti
Bonsoir,
Avec le code ci dessous, je lis la variation de position d'un codeur et je l'affiche sur un écran.
Le souci de ce code est que la variation s'affiche en valeur angulaire dans le sens horaire et une autre valeur dans le sens trigonométrique. Entrée A et Entrée B.
J'aimerai que la mesure n'est qu'une ligne d'affichage pour laquelle on incrémente quand on tourne dans un sens et que l'on des-incrémente quand on tourne dans l'autre sens.
D'avance merci pour votre aide.
Cordialement.
Bruno


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//pinMode(swPin,INPUT_PULLUP);
LiquidCrystal_I2C lcd(0x27,20,4); // définissez l'adresse LCD sur 0x27 pour un affichage de 20 caractères et 4 lignes
//certains affichages peuvent utiliser 0x3F pour l'adresse
// SCL - A5, SDA - A4, VCC - +5, Gnd - Gnd

// Codeur 1024 pas pour 360° soit 0.3515625°/pas
// Codeur Heidenhain 18000 pas pour 360° soit 0.02°/pas

int PasCodeurpartour = 18000 ; // SET nombre de pas du codeur pour 1 tour

#define A_PHASE 2
#define B_PHASE 3
unsigned int flag_A = 0; //Affecter une valeur au bit A
unsigned int flag_B = 0; //Affecter une valeur au bit B
/** * */
void setup() {

lcd.init(); // initialiser l'écran lcd
// Affiche le message de bienvenue sur l'écran LCD.
lcd.backlight();
lcd.setCursor(5,0);
lcd.print("Position ");
lcd.setCursor(5,1);
lcd.print("angulaire");
lcd.setCursor(5,2);
lcd.print("Numerique");
lcd.setCursor(3,3);
delay(1500);
lcd.init(); // initialiser l'écran lcd

pinMode(A_PHASE, INPUT);
pinMode(B_PHASE, INPUT);
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt( A_PHASE), interrupt, RISING); //Mode d'interruption lorsque la broche passe de bas en haut
}
void loop() {

float DegresTrigo = flag_A * 0.02;
float DegresHoraire = flag_B * 0.02;

Serial.print("Sens Trigonometrique: ");
Serial.println(flag_A);
Serial.println(DegresTrigo);
lcd.setCursor(0,0);
lcd.print("Sens Trigonometrique");
lcd.setCursor(6,1);
lcd.print(DegresTrigo);
lcd.setCursor(13,1);
lcd.print("degres");

Serial.print("Sens horaire: ");
Serial.println(flag_B);
Serial.println(DegresHoraire);
lcd.setCursor(1,2);
lcd.print("Sens horaire:");
lcd.setCursor(6,3);
lcd.print(DegresHoraire);
lcd.setCursor(13,3);
lcd.print("degres");

delay(50);

}
void interrupt()
{ char i;
i = digitalRead( B_PHASE);
if (i == 1)
flag_A += 1;
else
flag_B += 1;
}
 
S

speedjf37

Compagnon
Bonjour,

Est ce la position est figée sur un tour max ou sur une rotation libre ?

Quelle vitesse max ?

Jf
 
Moi33

Moi33

Apprenti
Est ce la position est figée sur un tour max ou sur une rotation libre ?
Bonjour,
pour l'instant, le déplacement ne s'effectue que sur ± 1 tour.
J'ai ajouter cette ligne: float Position = DegresTrigo - DegresHoraire; et je fais ensuite apparaître sur l'écran la valeur de Position.
A priori, ça à l'air de fonctionner, mais j'ai l'impression que je perds des pas et que je me retrouve avec des écarts après une rotation dans un sens et une autre dans l'autre.
Il faut que je contrôle la fréquence que peut admettre une Arduino sur ces entrées 2 et 3 pour voir si ces entrées acceptent un codeur à 18000 pas par tour.
Pour la suite le N max sera de 3000 tr/min.

Cordialement.

Bruno
 
S

speedjf37

Compagnon
Il faut que je contrôle la fréquence que peut admettre une Arduino sur ces entrées 2 et 3 pour voir si ces entrées acceptent un codeur à 18000 pas par tour.
Pour la suite le N max sera de 3000 tr/min.
Avec cette définition et en plus cette vitesse l'Arduino ne suivra pas même avec les interruptions.

Dans tous les cas il faudra utiliser un compteur matériel.
Avec la quadrature cela fera 18000*4 * (3000/60) impulsions/s
Il n'y aura une interruption qu'a chaque débordement du compteur (- 0 + 18000(*4)).

Il y des LIB encoder qui gèrent cela.
C'est ce que j''utilise avec l'esp32 sur Minithread_JF dérivé du Minithread de Pailpoe.

Un exemple:

JF
 
Dernière édition:

Sujets similaires

G
Réponses
123
Affichages
5 141
gaston83
G
V
Réponses
62
Affichages
37 126
Dardar88
Dardar88
V
Réponses
7
Affichages
1 524
vibram
V
S
Réponses
112
Affichages
19 236
manum01
M
Haut