ModelleisenbahN

Accueil > La conception > L’électronique et l’informatique > La carte de commande 6 servo-moteurs, le logiciel

La carte de commande 6 servo-moteurs, le logiciel

publié par Jean-Luc, le mercredi 21 août 2013

Tags servo

Le logiciel de la carte 6 servos remplit les fonctions suivantes :

  • pilotage de chacun des 6 servos avec détection d’erreur
  • interfaçage avec le contrôleur central : réception de commandes, émission de l’état des servos.

Le pilotage des servos

Multiplexage des servos

Comme indiqué dans « La carte de commande 6 servo-moteurs, le matériel » un servo-moteur est commandé via une consigne en PWM qui se répète toutes les 20 ms. Comme 6 servos sont à commander, les 20 ms sont découpés en 6 intervalles de 3,33 ms. Dans chacun de ces intervalles, la PWM du servo correspondant est générée. C’est à dire que le signal de commande est mis à 1 au démarrage de l’intervalle et mis à 0 au bout du temps correspondant à la position demandée.

PNG - 31 ko
Multiplexage de la commande des servos sur 6 slots de 3,33ms
(clic sur l'image pour agrandir ou télécharger)

Les instants des slots sont gérés au moyen d’un timer 8 bits. Il n’est pas possible de compter jusqu’à 3,33 ms et le tick de base a donc été fixé à approximativement un sixième de 3,33 ms, soit 552 µs. Par conséquent, une interruptions est générée tous les 552 µs et toutes les 6 interruptions le logiciel gère l’un des servos.

Le signal de commande est mis à 1 et un second timer est programmé avec la durée voulue pour la PWM. Lorsque ce timer expire, une interruption est générée et le logiciel remet la commande à 0.

Machine d’états d’un servo

À chaque servo est associée une machine d’états qui permet de fixer la valeur des signaux de commande d’allumage et de PWM. Les entrées de cette machine sont les états des interrupteurs de fin de course et les commandes reçues (allumage, consigne de position) ainsi que des variables internes.

PNG - 100.7 ko
Machine d’états associée à chaque servo
(clic sur l'image pour agrandir ou télécharger)

La machine démarre dans l’état initial éteint avec une consigne égale à l’état des interrupteurs de fin de course. Un commande d’allumage, on, conduit au calcul d’une vitesse de déplacement nulle si le servo est dans la position milieu et positive ou négative si l’un des interrupteurs de fin de course est enfoncé. Cette vitesse est telle que le servo va se désengager du fin de course enfoncé. La machine passe dans l’état calib.

Dans l’état calib, la vitesse est maintenue tant que l’interrupteur de fin de course concerné est enfoncé (fdc = consigne). Dès qu’il n’est plus enfoncé (fdc ≠ consigne), la vitesse de déplacement est mise à 0 et la machine passe dans l’état arrêt.

On reste dans l’état arrêt tant que la consigne est identique à l’état des interrupteurs de fins de course (fdc = consigne). Si la consigne n’est pas atteinte ou change (fdc ≠ consigne), la vitesse permettant de satisfaire la consigne est calculée et la machine passe dans l’état op.

Dans l’état op, la vitesse est maintenue tant que l’interrupteur de fin de course concerné n’est pas enfoncé (fdc ≠ consigne). Dès qu’il est enfoncé (fdc = consigne), un compteur est initialisé (cpt ⟵ N) et la machine passe dans l’état frein. On n’arrête pas immédiatement le servo, on continue de manière à bien enfoncer l’interrupteur de fin de course. Évidemment il faut tenir compte de la vitesse et de l’inertie du moteur pour calculer N. Plus la vitesse est grande et plus N doit être petit. Le calcul est le suivant N = 2 × (Vmax - V).

Dans l’état frein, le mouvement du servo est poursuivi et cpt décrémenté tant qu’il n’est pas nul. Si cpt devient nul, la vitesse du servo est mise à 0 et la machine passe dans l’état arrêt.

La PWM n’est générée que dans les états calib, op et frein.

Détection des erreurs

Le logiciel vérifie les conditions d’erreur en confrontant la valeur de la PWM (c’est à dire la position attendue du servo) avec l’état des interrupteurs de fin de course. 3 valeurs de PWM de référence sont employées : la valeur correspondant à la position milieu [1], une valeur extrême dans le sens horaire et une valeur extrême dans le sens trigonométrique. Ces deux dernières valeurs correspondent à des positions mécaniques non atteignables. Si la PWM est entre la valeur milieu et la valeur extrême horaire, on dit qu’elle est dans le secteur horaire. Si elle est entre la position milieu et la valeur extrême trigo, on dit qu’elle est dans le secteur trigo.

Les conditions suivantes sont testées :

  • interrupteur de fin de course horaire enfoncé et PWM dans le secteur trigo : panne du servo ou fin de course horaire collé ;
  • interrupteur de fin de course trigo enfoncé et PWM dans le secteur horaire : panne du servo ou fin de course trigo collé ;
  • interrupteur de fin de course horaire non enfoncé et PWM au delà de la position extrême horaire : panne du servo ou fin de course horaire manquant ou en panne ;
  • interrupteur de fin de course trigo non enfoncé et PWM au delà de la position extrême trigo : panne du servo ou fin de course trigo manquant ou en panne ;

De façon a être robuste vis-à-vis des erreurs transitoires, la détection d’une erreur ne provoque pas immédiatement le passage dans l’état erreur. Un compteur d’erreurs est associé à chaque servo. La détection d’une erreur engendre l’incrémentation de ce compteur. L’absence d’erreur engendre sa décrémentation. Si le compteur dépasse un seuil, alors le passage dans l’état erreur se produit.

La séquence l’allumage

Lorsque le logiciel démarre, tous les servos voient leur commande d’allumage mise à on. Toutefois, le comportement voulu est un allumage séquentiel, ceci afin de limiter l’appel de courant. Pour cela, un jeton autorisant l’allumage est partagé par les machines d’états des servos. Le premier servo qui s’allume prend le jeton et ne le relâche que lorsqu’il passe dans l’état arrêt ou bien si une erreur est détectée. Le servo suivant ne peut donc démarrer que lorsque le servo qui détient le jeton a terminé son allumage. Ce jeton n’est pas un booléen. En effet, chaque machine d’états doit savoir si c’est elle qui possède le jeton, ceci afin de pouvoir le relâcher au bon moment. Le jeton est donc initialisé à -1 (non possédé) et contient sinon le numéro de la machine qui le possède.

Limitation du nombre de servo en mouvement

Également pour des raisons de consommation, le nombre de servos en mouvement peut-être limité. À cet effet, un compteur est partagé par les machines d’état. Ce compteur est initialisé aux nombre de servos qui peuvent bouger simultanément. Une machine ne peut commencer un mouvement que si ce compteur est > 0. Quand une machine commence le mouvement d’un servo (passage de l’état arrêt à l’état op, elle décrémente ce compteur pour le relâcher quand elle passe dans l’état arrêt ou erreur.

Limitation du nombre de servos en mouvement

Un prochain article présentera les commandes possibles et la messagerie CAN.

Notes

[1une valeur précise n’est pas nécessaire, il suffit d’avoir une valeur correspondant à une position où aucun des interrupteurs de fin de course n’est enfoncé

Répondre à cet article

Les thèmes

Archives

Informations

ModelleisenbahN | publié sous licence Creative Commons by-nc-nd 2.0 fr | généré dynamiquement par SPIP & Blog'n Glop