Concernant le programme de gestion d'un servo-moteur dans le cadre de la mise au point d'un manchon variable sur BAA...
Je voudrais disposer d'une possibilité de paramétrer une courbe avec des points d'inflexion, à l'image de ce que nous avons dans le soft de l'Ignitec pour l'avance ou la valve. Voici l'idée :

En
rouge, c'est ce que me donne le programme actuel (à cela près que la gouverne du servo a un mouvement circulaire, mais faisons simple pour la compréhension): une variation linéaire, proportionnelle au régime dans la fourchette de valeurs spécifiées.
En
bleu, ce dont j'aimerais disposer afin de choisir la courbe d'ouverture du manchon aux différents régime, d'une manière non-linéaire.
J'ai modifié le programme déjà testé (effacement de lignes inutiles et quelques simplifications)( fichier original ici
http://d34.e-loader.net/8TW8mUW8Wd.ino)
Ajouté:// paramétrage courbe de débattement servo
int regime1=0 ; // régime au 1er point d'inflexion de la courbe
int angle1=0 ; // angle atteint à regime1
int regime2=0 ; // régime au 2nd point d'inflexion de la courbe
int angle2=0 ; // angle atteint à regime2
et modifications dans le loop:void loop(){ // debut de la fonction loop()
mesure_n3= mesure_n2;
mesure_n2 = mesure_n1;
mesure_n1 =mesure_n;
mesure_n = pulseIn (tacho, HIGH, 600000);
if (mesure_n > 8000) moy = 20000 ; // règle le cas de l'absence d'impulsion
else if (mesure_n <= 8000) moy= (mesure_n3 + mesure_n2 + mesure_n1 + mesure_n)/4; // effectue une moyenne sur 4 mesures
unsigned long rpm=30000000/moy;
if( rpm < 3750 ) rpm=3750; // fixe la limite basse de régime
else if ( rpm >12000) rpm = 3700; // règle le problème d'une absence d'impulsion (moteur arrêté)
//**** définition de la forme de la courbe de débattement***//
if (rpm <regime1) angle_servo=map( rpm,3700,regime1,POS_MIN,angle1); // définit la courbe de débattement jusqu'au 1er point d'inflexion
else if (regime1 <= rpm && rpm< regime2) angle_servo=map(rpm,regime1,regime2,angle1,angle2) ; // définit la courbe de débattement entre le 1er et le second point d'inflexion
else if (regime2 <= rpm ) angle_servo=map(rpm,regime2,10000,angle2,POS_MAX); // définit la courbe de débattement entre le 2nd point d'inflexion et le maxi...
}
... Pas encore testé avec la carte. Si je ne me suis pas trompé, en donnant une valeur chiffrée à "regime1, angle1, regime2, angle2", je doit pouvoir obtenir une courbe à 4 segments (en comptant la plage < 10000 rpm)
Pour obtenir la courbe du diagramme au-dessus, je rentre dans l'ordre 5500, 30, 8000, et 70, et c'est bon.
L'avis des spécialistes SVP: ça marche (même si c'est peut-être "lourd" au yeux d'un pro), ou il y du bug là-dedans?