Etape 11 : Contrôle et problèmes du moteur d’asservissement
Théorie du contrôle et mon application
Comment savons-nous comment contrôler quelque chose ? Nous consulter sa fiche technique. C’est exactement ce que j’ai fait (il y a longtemps) avec ce servo et découvert que j’avais besoin d’un signal 50Hz du rapport cyclique variable. C’est un peu lent pour un module PWM hardware qui nous sommes sur le court avec toute façon (nous avons besoin pour les moteurs de piste au volant), ce signal de servo doit être peu banged - logiciel généré.
Sachant cela, j’ai calculé un timer pour générer une interruption chaque 20ms. Pour cette tâche, j’ai utilisé le module Timer3 libre du microcontrôleur. Sachant que :
FOSC = 48 [MHz], nous constatons que Fosc / 4 = 12 [MHz], et de là nous calculons Tinstruction = 83.33 [ns]
C’est le temps nécessaire à une seule instruction à remplir dans le PIC et la base de temps pour tous les modules d’horloge interne. Nous savons également que Timer3 est un timer/compteur 16 bits, donc il peut compter jusqu'à 65535 et débordement + donner une interruption à l’échelon suivant. Il faut le configurer pour qu’il donne à cette interruption chaque 20 [ms]. Pour ce faire, j’ai calculé le nombre d’incréments de minuterie qui sont nécessaires pour 20 [ms] s’écouler :
20 [ms] / 83.33 [ns] = 240096
Il s’agit d’une valeur qui ne tient pas dans la chaîne de compteur 16 bits, donc nous allons devoir ralentir la vitesse d’incrémentation en quelque sorte : c’est facile à faire à l’aide de convertisseurs. En assignant un Prédiviseur 1:4 pour cette horloge, nous dire le PIC pour incrémenter la minuterie s’inscrire à un taux quatre fois plus lent que cette horloge interne de 83.33 [ns].
240096 / 4 = 60024
Cela se traduit par : avec la comte vitesse a diminué à 332.33 [ns], la minuterie devra prendre 60024 étapes jusqu'à ce que nos 20 [ms] s’écoule. Nous avons pour déclencher une interruption, lorsque cela se produit, et quand les interruptions produisent-ils ? Lorsque la minuterie déborde. Cela étant dit, nous soustraire cette valeur de la valeur de dépassement de capacité de 65536 :
65536 - 60024 = 5512 = 0x1588
Si nous avons mis cela dans la chaîne de compteur TMR3 chaque fois que le drapeau de l’interruption est défini par l’événement de dépassement de capacité, nous aurons une belle 20 [ms] interrompre le taux qui peut être utilisé pour cet algorithme de servo.
Ensuite, nous devons traiter de changer le rapport cyclique. Cela aurait été très facile à faire si j’ai eu un module de comparaison disponible, mais malheureusement je n’ai pas. Pour y remédier, j’ai défini une variable qui j’ai basculé chaque fois une interruption est venu. Connaissant la valeur de cette variable m’a permis de faire la distinction entre deux interrrupts différents : celui qui a déclenché un front montant au début de la 20 [ms] période et qui a déclenché le front descendant basé sur le cycle de service requis. Parce que le front est obligatoire, chaque fois l’interruption est déclenchée, un notre variable est « 0 », nous envoyons la broche e/s à l’État haut. Basé sur le temps requis sur (prenons 1 [ms] pour l’instant), nous calculons rapidement une nouvelle valeur d’init compteur minuterie, donc le minuteur déborde à nouveau après ce laps de temps. Pour 1 [ms] ce calcul est le suivant :
1 [ms] / 333,3 [ns] = 3000
Nous avons donc mis Registre compteur de TMR3 :
TMR3 = 65536-3000 = 62536
et attendez la prochaine interruption. Lorsqu’elle survient, nous envoyons la broche e/s à faible état et configurer la chaîne de comptoir TMR3 à nouveau au nombre de 20 [ms]. Nous devons prendre en considération, que 1 [ms] 20 [ms] déjà passé, donc le calcul ressemblera à ceci la deuxième mise à jour de TMR3 :
TMR3 = 5512 + 3000
Après que nous avons terminé avec ceci, nous basculer notre variable à nouveau et attendre une interruption. Cela va déclencher un front montant et le 20 [ms] période commence. Et puis nous calculons la TMR3 nouvelle, et cela va sur et ainsi de suite, dans une boucle infinie. En regardant dans la fiche technique je vous en parlais précédemment, nous pouvons trouver la longueur maximale de ce cycle d’utilisation, limites de logiciels peuvent être écrites pour empêcher le servo de frapper les extrémités et du mal à aller plus loin (et consommer 650mA...).
Rétroaction du servo n’est pas terrible du tout, donc le servo va secouer même quand il cesse de la même obligation pour toujours - cela doit être résolu en quelque sorte. J’ai mis un logiciel compteur qui augmente lorsque le 20 [ms] période commence et ajouté un code qui autorise uniquement un signal à un certain devoir à envoyer un nombre limité de fois. Après 20 cycles, je suppose que l’arbre est à la position voulue, et j’ai cesser d’envoyer des signaux = le moteur ne sera pas secouer ou buzz.
Problèmes
Plusieurs problèmes ont eu lieu jusqu'à ce que j’ai enfin réussi à déplacer le servo de façon reproductible. J’ai utilisé des servomoteurs avant sans aucun problème, savait quel genre de signaux de commande doit être fourni, mais n’a pu faire le servo chaque maintenant et puis, au hasard. À une mise sous tension, il a travaillé, dans les cinq prochaines années qu'il n’a pas. Je me doutais bien d’entrée de statisme, buck chute de tension de sortie 5 [V] et fait toutes sortes de tests pour les éliminer un par un. Enfin, après avoir essayé différents types de piles, j’ai fini par mettre un condensateur de [uF] 3300 volumineux très proche de la réglette à broches servo - et voilà, c’est finalement plus obéissant.
À ce stade il est bon de passer à un laboratoire de bloc d’alimentation, si disponible
Que pouvez-vous faire pour résoudre les problèmes dans les situations de ce genre ? Si vous pensez, qu’il y a une sorte de surtension dans votre circuit, il y a quelques trucs que vous pouvez utiliser pour traquer l’erreur. Tout d’abord, ça aide beaucoup si vous avez un laboratoire alimentation avec fonction limite actuelle, cela empêchera de sauter les choses. Simplement en utilisant les piles (j’ai essayé avec Li-ion ainsi) est un peu dangereux car ceux donnera autant qu’ils peuvent, dans le cas d’un court-circuit et brûleront probablement tout à leur façon.
Test 1.
Celui-ci a été la série de test évident : essais de continuité, essais contre shorts, trucs standard. Les LEDs ont été clignotant, alors le rail de buck 5V devait être OK, qu'encore j’ai fait ces pour être sûr. J’ai également double vérifié que le signal de commande est en effet en train du pin jaune du servo - il l’a fait. Théorie de mauvaises connexions a été démantelée.
Test 2.
Il y avait un moment où j’ai cru que mes batteries ne peut pas simplement donner assez de jus pour déplacer le servo. Pour confirmer/buste ceci, j’ai fini par regardant liste de paramètres du SG90et constaté que le décrochage actuel est de 650 [mA] ! J’ai pensé, que ce sera le problème, et les batteries ne peuvent pas garantir le même courant comme mon PSU - cela avait besoin d’un test.
J’ai pris une résistance de 1,2 ohms et mettez-le en série avec le fil d’entrée négative de robots. La mesure devait être côté bas, parce que la sonde de sol étendue et le sol de la PSU étaient connectés par le biais de la terre. Par mesure de tension à travers une résistance série de valeur connue, on peut calculer le courant qui circule à travers elle, la consommation de courant du robot dans ce cas. J’ai pris deux mesures, une avec la batterie Li-ion et l’autre avec le bloc d’alimentation, vous pouvez voir ces attachés à cette étape. Celui avec la tension / division 1 [V] est le test avec la batterie, l’autre avec 500 [mV] par division est le bloc d’alimentation. Parce que la batterie a une tension plus faible que le réglage de l’UAP, et les convertisseurs DC / DC avaient dessiner extra courant de maintenir leurs produits réglementés : vous pouvez voir un pic [A] 4 !
Cela signifie que la batterie peut fournir tout à fait suffisant pour l’ensemble du circuit de démarrage, y compris la surcharge initiale sur le servo quand il commence à tourner l’arbre. Si cette théorie a été démantelée, ainsi.
Essai 3.
Après avoir réfléchi de combien de temps le 5 [V] sont les traces et quelle hauteur l’étal actuel de ce servo est, j’ai réalisé, qu’un condensateur encombrant local serait une bonne idée. Cela aiderait avec tirages actuels spontanées locaux. Étant donné que cela impliquait des trous de forage et d’un nouveau capuchon de montage, j’ai été un peu contre elle. Cependant, quand un ami smart est venu avec cette suggestion très sans moi même mentionner cette théorie, j’ai décidé de serrer les dents et cela donner un essai. J’ai pris une grande qualité (récupérée sur une carte mère) 3300 [uF] / 6,3 [V] condensateur, percé de quelques trous pour elle très proche de l’en-tête de broche de sortie servo et soudé la chose. J’ai allumé le pouvoir et cela a fonctionné!!! Cette théorie est confirmée pour être vrai, et traverse avec lui s’est avéré fonctionne comme un charme.
Conclusion et la finition de cette série d’épreuves
Après j’ai vu ce travail avec la batterie Li-ion, et le test était répétitif, j’ai commencé à réfléchir à comment monter les piles énormes sur le robot. J’ai essayé de mettre sur le dos, mais qui a entraîné le robot s’asymétrique - alors j’ai décidé de donner un autre coup aux batteries Ni-MH et d’utiliser les robots 4 x support de cellule AA comme source d’alimentation. J’ai fait les modifications nécessaires, branché les piles et encore une fois : cela a fonctionné ! Problème résolu, et le regard du bot est sérieusement mieux !