Salut à tous,
me re-re-re voilà pour mon soucis de programme qui mesure le dephasage de 2 arbres tournants.
@dfgh si tu me lis
pensant que mon affaire etait reglé j'ai testé le programme avec un arbre qui ne se dephase pas et là je trouve une valeur de 8° à 2000 trs/min
je ré-explique le truc pour ceux qui ne connaissent pas mes aventures.
j'ai un capteur optique en bas de l'arbre, il mesure la vitesse de l'arbre et il va aussi servir de reference pour mesurer le dephasage avec l'arbre du haut.
l'arbre du haut et lui un interrupteur qui s'ouvre et se ferme 4 fois pendant un tour, et je compare le temps entre un top en haut et un top en bas.
dans mon cas present à 400trs/min je dois avoir un temps calculé entre les tops du haut et du bas, ok.
j'accelere la rotation de l'arbre et j'ai donc un temps qui reduit mais qui est calculé en angle proportionellement à l'angle de rotation et qui est censé donner un angle de decalage similaire que ce soit à 400 trs comme à 2000.
hors entre 400 et 2000 j'ai 8° d'ecart .... à quoi serait-ce dû ?
le temps du calcul ? un mauvais calcul ? un probleme d'ordre dans le programme ?
faudrait t'il que j'utilise plutot 2 capteurs optiques ?
est-ce parce que j'utilise 2 interruptions et que celle de la borne 2 est prioritaire ?
j'ai vu que ça jouait, j'ai fait pleins de tests et il ne me reste plus beaucoup de cheveux ... alors je reviens vers vous
vous pourriez m'aider ?
//potard sur a0 broche centrale
//les 2 autre pin sur 5v et ground
//sabertooth port S1 sur 8 arduino
//moteur sur m1a et m1b
//0v sabertooth sur ground
//RUPTEUR ET OUTPUT
//UN FIL SUR BORNE 2
//UN FIL SUR 5V
//capteur optique ET INPUT
//D0 SUR BORNE 3
//capteur optique si input_pullup
//UN FIL SUR BORNE 2
//UN FIL SUR gnd
//commande moteur
const int potar = A0; //la broche pour régler la vitesse
//rupteur
const byte PIN_SIGNAL = 2;
volatile unsigned long last_micros;
//optique
const byte PIN_SIGNAL1 = 3;
unsigned long periode2 = 0;
unsigned long periode3 = 0;
volatile unsigned long last_micros1;
//dephasage
float dephasage = 0;
//COMMUN DEBOUNCING TIME
long debouncing_time = 15; //Debouncing Time in Milliseconds
//angle came
int buttonState = 0;
int lastButtonState = 0;
long temps_total = 0;
int angle2 = 0;
int angle4 = 0;
int angle6 = 0;
int angle8 = 0;
const int angle_total = 360;
long p1 = 0;
long p2 = 0;
long p3 = 0;
long p4 = 0;
long p5 = 0;
long p6 = 0;
long p7 = 0;
long p8 = 0;
int compteur =0;
volatile byte compteur_ticks = 0;
volatile byte compteur_optique = 0;
//unsigned long previousMicros = 0;
//unsigned long previousMicros1 = 0;
float periode=0;
float periode1=0;
float vitesse1=0;
float vitesse2=0;
float vitesse3=0;
void debounceInterrupt1() {compteur_optique++;}
//void debounceInterrupt() {compteur ++;}
unsigned long previousMicros = micros();
unsigned long previousMicros1 = micros();
unsigned long fin_rupteur = 0;
unsigned long fin_opto = 0;
float delta = 0;
/** Fonction setup() */
void tick() {
fin_rupteur = micros();
}
void debounceInterrupt() {
if((long)(micros() - last_micros) >= debouncing_time*100) {
tick();
last_micros = micros();
}
}
void setup () {
Serial.begin(115200);
pinMode(PIN_SIGNAL, OUTPUT);
attachInterrupt(digitalPinToInterrupt(PIN_SIGNAL), debounceInterrupt, FALLING);
pinMode(PIN_SIGNAL1, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIN_SIGNAL1), debounceInterrupt1, FALLING);
}
void loop() {
int vitesse = analogRead(potar);
periode2 = pulseIn(PIN_SIGNAL1, LOW, 1000000);
periode3 = pulseIn(PIN_SIGNAL1, HIGH, 1000000);
Serial.print("vitesse optique ");
vitesse1 = 60000000 / (periode2+periode3);
Serial.println(vitesse1);
if (compteur_optique >= 1)
{
if (fin_rupteur > 0)
{
fin_opto = micros();
}
periode1 = micros() - previousMicros1;
previousMicros1 = micros();
compteur_optique = 0;
}
if (fin_opto > 0 )
{
delta = fin_opto - fin_rupteur;
fin_rupteur = 0;
fin_opto = 0;
}
if (( (vitesse1>1) && (vitesse1<500) ))
{
vitesse2 = ((delta/1000000)*360)/(1/(vitesse1/60));;
Serial.print("vitesse2 ");
Serial.println(vitesse2);
}
Serial.print("delta ");
Serial.println(((delta/1000000)*360)/(1/(vitesse1/60)) - vitesse2);
Serial.println(" ");
delay(300);
}