Bonjour,
Ayant un projet trop complexe pour moi, je voulais savoir comment faire pour réecrire mon programme avec des swith ( ) et case () et peut être des while.
Mais d’abord il me semble que je dois expliquer mon programme
Dans ce dernier, je controle la vitesse du moteur en changeant la valeur de la vitesse de reglage appelée « Setpoint ». Ce Setpoint que je change (augmente ou baisse) depend des valeurs que je choisis de la tension de sortie du moteur appelée « val-output » et de la vitesse réelle appelée « moyenne ». Je prends la vitesse moyenne pour avoir une valeur stable de la vitesse car le codage incrémental est fait avec deux codeurs ce qui me donnait la variable « duration » (à l’origine dans le programme) avec deux valeurs differentes dans void loop.
Aussi cette moyenne est négative quand le moteur tourne dans le sens back() et positive dans le sens advance ().
Ces 3 données « Setpoint » , « val-output » et «« moyenne » sont issues d’un algorithme PID qui a pour but de s’approcher de la vitesse désirée « Setpoint » avec le moins de marge d’erreur possible.
L’algo PID corrige l’erreur de vitesse en baissant ou augmentant la tension du moteur
Deslors si je regle le programme avec une vitesse 45 en AVANT
Setpoint=45
advance()
Je dois avoir une vitesse moyenne = 45 et ;
Si Setpoint=45
back()
Je dois avoir une vitesse moyenne = -45
et val-ouptut est entre 53 et 55 dans les deux cas.
Les données Setpoint et val-ouput sont toujours positives. Elles sont proportionnelles : pour une vitesse moins elevée, il faut une tension moins elevée
Grâce à l’algo PID, si je bloque le moteur la tension augmente --> la donnée val-ouput augmente et
si j’accompagne le moteur dans son sens de fonctionnement (si je l’accelere un peu) --> la donnée val-output diminue.
Ce que j’ai programmé est Si j’ai l’état Setpoint=55 et marche AVANT qu’on pourrait nommer « Set55A » et val-output > 70 alors je baisse la vitesse en donnant un nouveau reglage Setpoint= 25, que j’aimerai nommer « Set25A ».
Mon moteur est maintenant reglé à Setpoint= 25, advance () nommé « Set25A » ; à cette vitesse la tension de sortie du moteur val-output est environ = 45.
NB : Pour arriver à cette vitesse de 25, le moteur est passé de 55 à 25 ; Et voir si je l’ai bloqué longtemps à 0.
Je suis à Set25A, de nouveau, je bloque le moteur et si la donnée val-output > 55 alors je souhaite que mon moteur change de sens.
Le programme va vers l’état Setpoint=25, back () la vitesse moyenne passe de 25 ou de 0 à -25 et val-output revient peu à peu aux alentours de 45. Ici l’état est « Set25B ».
Si je rebloque le moteur à l’état « Set25B », je veux qu’il change de sens, celui-ci doit aller en « Set25A », la vitesse passe de – 25 à 0, ou si je n’ai pas attendu que le moteur arrive jusqu’à -25, la vitesse peu passer de -5 à 0 ou même de 0 à 0.
Mon probleme et que si je bloque longtemps le moteur à 0, le programme bugait et les états « Set25A », ou « Set25B », ne fonctionnait plus car le moteur allait dans l’autre sens que celui souhaité.
Pour faire ce changement d’état de « Set25B » à « Set25A », j’ai ajouté respectivement les conditions tels que si le moteur vient de
-
: « Set25A » et que la vitesse moyenne < 20 et > 5 alors change de sens (va à l’état « Set25B »)
-
: « Set25B » et que vitesse moyenne >-20 et < -5 alors change de sens (va à l’état « Set25A »)
Comme ça le programme n’attend pas la vitesse 0 et se force à choisir l’un ou l’autre état.
Il y a surement d’autres meilleurs astuces pour passer d’un état de vitesse et sens du moteur à un état de vitesse et sens du moteur à l’autre et j’en ai usé, mais pour l’instant j’aimerais juste éclaircir mon programme.
Comme mon programme va se compliquer, (la vitesse du moteur devra augmenter et ralentir selon la forme d’ une onde sinusoïdale dont les parametres d’amplitude et de phase vont eux-même varier selon la vitesse d’un autre moteur !!!), j’ai vraiment besoin de clarifier mon programme avec autres choses que des if.
Aussi, j’aimerai que si le programme oscille entre « Set25A »et « Set25B » plus de 5 secondes, alors il va a l’état « Set55A » par exemple.
Merci pour vos aides.
PS : Si un informaticien peut m’aider je suis preneur et même pour discuter d’un devis.
Je vais essayer de faire un diagramme d'état pour formaliser mon projet dans peu de temps.
Cordialement,
programme_education_0_fonctionne_2.4_propre_light.ino (14.7 KB)