Voici les schémas :
http://locoduino.org/pic/AlimentationTraction.pdfLa page qui t'intéresse est la page 3. TRACTION et GND_TRACTION sont aux bornes du moteur via un relai DPDT qui joue le rôle d'inverseur.
Concernant l'alimentation qui est sur le site de l'AMFN, ils ne sont pas arrivés à régler le gain intégral et sont restés sur une commande proportionnelle. Je pense donc que leur logiciel est faux et je pense également savoir pourquoi.
Le principe est de mesurer la FCEM et d'asservir la PWM de manière à ce que la mesure soit égal à la consigne. Si on ne connait pas grand chose en automatique (ce qui est toujours mon cas mais je me soigne
), on va raisonner de la manière suivante :
- j'applique une PWM -> le moteur tourne à une certaine vitesse
- je coupe la PWM et je mesure la FCEM (le moteur continuant à tourner sur son énergie cinétique)
- je calcule l'erreur : E = consigne - mesure (en signé bien sûr)
- j'ajoute E x gain (constante) à la PWM
Par conséquent, si E est négatif (le moteur tourne trop vite) on diminue la PWM et si E est positif (le moteur tourne trop lentement), on augmente la PWM.
En faisant ça, on n'a pas fait une commande proportionnelle intégrale on a fait une intégrale tout court et une intégrale tout court est molle : la commande suit la consigne mollement. Si on augmente le gain pour que ça soit moins mou, ça devient instable : ça pompe autour de de E = 0. Je pense que c'est ce qu'a fait l'AFMN (avec un gain pas trop fort) car ça explique qu'en ajoutant une intégrale en plus, ça génère en plus de l'instabilité et qu'ils n'aient pas pu mettre au point leur régulateur.
Donc :
Commande proportionnelleC'est contre-intuitif mais très simple : PWM = gain x erreur
- quand la vitesse est stable, l'erreur n'est pas nulle. En effet, une erreur nulle engendre une commande nulle et le moteur s'arrête.
- donc on a ce que l'on appelle un écart statique : la PWM calculée est telle que l'erreur mesurée x gain donne la PWM calculée. la FCEM de consigne n'est jamais atteinte.
- si on veut réduire l'écart statique on augmente le gain mais si le gain est trop élevé, la commande est instable.
Commande proportionnelle intégralePour annuler l'écart statique, on ajoute une composante intégrale que l'on calcule en faisant :
integrale = integrale + erreur
on a maintenant 2 gains : le gain proportionnel, GP et le gain intégral GI.On calcule la PWM en faisant :
PWM = GP x erreur + GI x integrale
La partie proportionnelle, GP x erreur, est grande si le moteur produit une FCEM éloignée de sa FCEM de consigne, elle donne donc de la pêche. Lorsque l'erreur diminue, c'est GI x integrale qui prend le relai. Lorsque la FCEM de consigne est atteinte, l'erreur est nulle et le moteur ne tourne que grace à GI x integrale
Donc la partie proportionnelle fait que la commande n'est pas molle et la partie intégrale supprime l'écart statique.
En pratique pour régler GP et GI, on commence avec GI à 0. On règle GP puis on augmente GI jusqu'à ce que ça devienne instable. On diminue alors GI jusqu'à avoir le comportement voulu.
En pratique, il faut également s'assurer que la commande ne dépasse pas les valeurs min et max de la PWM. J'ai également borné l'intégrale de manière à ce que GI x intégrale donne la valeur max de la PWM. Inutile de laisser l'intégrale s'envoler si la locomotive est bloquée par un faux contact.
Commande proportionnelle intégrale dérivéeLe problème de l'intégrale est que l'erreur s'accumulant, lorsqu'on dépasse la consigne, il faut un certain temps pour faire passer l'intégral en négatif. L'évolution est lente. L'idée est donc de mesurer deux erreurs successives et de faire la différence (dérivée). Si cette différence est importante cela signifie que l'on se rapproche vite de la FCEM de consigne et que (du fait du PI) on en était loin donc on aide a aller vite vers FCEM de consigne. Si la différence est faible ça signifie qu'on est au voisinage donc on aide moins. Ça donc donc de la pêche tout en générant de la stabilité.
Evidemment ces 3 régulations influent les unes sur les autres et c'est un peu compliqué d'appréhender le tout.
Je n'ai pas mis en œuvre la dérivée pour l'instant.
Un très bon article que j'ai trouvé :
http://www.ferdinandpiette.com/blog/2011/08/implementer-un-pid-sans-faire-de-calculs/Un bémol, vers la fin on trouve : « L'erreur statique, c'est l'erreur finale une fois que le système est stabilité. Cette erreur doit être nulle. Pour diminuer l'erreur statique, il faut augmenter Kp et Ki. ». Certes mais si Ki est > 0, l'erreur statique est nulle (au bout d'un certain temps).
Mon code de test est ici :
https://git.framasoft.org/locoduino.org/AlimentationTraction/tree/masterQuelques remarques :La FCEM est mesurée toutes les 10ms
Lorsque l'on coupe la PWM pour mesurer la FCEM, il faut attendre que le courant cesse de circuler dans la diode roue libre. Ce temps dépend de l'inductance du moteur. Sur mes tests, j'avais mis 400µs après mesure à l'oscilloscope sur quelques locomotives.
La FCEM est très bruitée, je fais donc 6 mesures que je trie. Je moyenne les 4 du milieu. Voir
https://git.framasoft.org/locoduino.org/AlimentationTraction/blob/master/MesureFCEM.cpp