Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Controller un servomoteur



  1. #1
    snyfir

    Controller un servomoteur


    ------

    Bonjour,

    A l'aide d'un pic 18f4550 je souhaite controller un servomoteur. Pour indiqué la position que doit prendre mon servomoteur, je doit lui envoyé un signal. Par exemple un signal de 20ms place mon servomoteur à 90°, 40ms à 180° etc..

    Je doit donc être capable d'activer une sortie de microcontrolleur pendant par exemple 20ms sans bloqué le reste de mon programme. Je pensais pour cela utiliser les interruptions. Est-ce judicieux ? Si oui pouvez vous m'explique comment programmer un pic 18f4550 avec les interruption car je ne trouve rien sur ne net.

    Merci d'avance pour vos réponses.

    -----

  2. Publicité
  3. #2
    eSb`

    Re : Controller un servomoteur

    Je suis également en train de réfléchir à une mise en place d'une gestion de servomoteur sur un PIC18F4620.
    Voilà où j'en suis et mes différentes alternatives, je ne dis pas que tout est correct et très subtil mais c'est toujours ça de pris ; ).
    Il faudra du courage pour tout lire ! ;d

    Premièrement, ce que tu exposes est théoriquement impossible au niveau valeurs. Normalement un servomoteur se contrôle en largeurs d'impulsions (PWM) de 1ms pour la butée basse et de 2ms pour la butée haute; le tout toutes les 20ms. (donc pour la butée basse ça donne 1ms de temps haut puis 19ms de temps bas)
    Il faut donc générer les valeurs intermédiaires pour avoir un contrôle précis de la position.

    Secondement, au niveau gestion.
    1. Utiliser les interruptions par timer (il me semble qu'il y a un exemple dans les cours de Bigonoff Part2 et beaucoup sont trouvables sur le net, sur Fribotte par ex.). En ayant bien réglé le prescaler et bien initialisé le timer (TM0), on peut le faire déborder et donc générer une interruption toutes les Xms (ou X est la valeur de temps haut ou bas).
      Je trouve que l'inconvénient est qu'on interrompt en permanence le PIC. (mais bon, c'est sûrement négligeable ; ))

    2. Utiliser les modules PWM (CCPx) du PIC, mais il ne saura atteindre une fréquence si basse que 50Hz avec un quartz un minimum rapide.
      Si l'application est lente, on peut changer le quartz pour un très lent (qques kHz), mais je doute que ce soit le but ; ).

    3. Une autre idée, mais cela dépend de l'application, est de placer le servomoteur dans sa position (par timer ou par génération "à la main" (on met un état haut, une tempo du temps voulu, un état bas, tempo du temps voulu, ...)) et ensuite on arrête d'envoyer les impulsions.
      Le servomoteur se trouve donc en "roue libre" (tu peux le tourner en lui appliquant une force et il ne résistera pas); j'aimerais une confirmation pour ce point. ; )
      Inconvénient : on perd du temps (beaucoup!) lors du placement du servomoteur dans sa position.
      Avantage : une fois que c'est fait, on n'interrompt plus le programme. (mais ça dépend de l'application évidemment, si tu dois souvent le déplacer, ce n'est pas envisageable; dans mon cas le déplacement est rare)

    4. Troisième idée, on déporte le PWM.
      On peut utiliser pour ce faire 2 NE555 (ou un NE556) montés comme ceci : Lien. (en recalculant les bonnes valeurs pour avoir du 50Hz)
      On modifie la largeur de l'impulsion à partir d'une tension analogique envoyée sur le condensateur C4. (qui modifie la tension de seuil des comparateurs du NE555)
      Problème, les PICs n'ont pas (à ma connaissance), de sortie analogique (juste des entrées).
      Solutions :
      • - Utiliser les modules PWM du PIC à une "haute-fréquence" et filtrer le signal de façon à ne garder que la composante continue. (v. note Microchip : Lien)
        Avantage : tu modifies le rapport cyclique du signal par le registre adéquat du PIC et voilà, ton programme n'est plus dérangé.
        Inconvénient : dans mon cas, j'utilise déjà mes modules PWM pour piloter des moteurs donc je dois trouver une autre solution.
      • - Utiliser 2 pins du PIC avec un réseau RC (Lien). On charge/décharge un condensateur par la résistance et on mesure la tension sur une des entrées du PIC (A/N). Dès qu'on a atteint la tension voulue, on met le port qui chargeait le condensateur en entrée (haute-impédance).
        Avantage : relativement simple à mettre en oeuvre.
        Inconvénient : la mise en place prend un certain temps et pendant ce temps là, la sortie PWM change.
      • - Solution tordue : utiliser un registre à décalage et un convertisseur N/A.
        On envoie les différents bits en série dans le registre à décalage, quand la donnée est bonne on la valide et elle est convertie par le convertisseur N/A.
        Avantage : ne devrait pas être trop long et une bonne précision.
        Inconvénient : ça me parait plus lourd à mettre en oeuvre mais plus intéressant dans un but didactique ; ).

    Voilà, en espérant que ça t'aide un minimum.
    Si quelqu'un a d'autres idées, je suis preneur (je ne sais toujours pas concrètement ce que je vais faire dans mon cas).

  4. #3
    alainav1

    Re : Controller un servomoteur

    bonjour,
    juste une idée !
    si tu uililises un pic specifique pour controler le servo moteur (un 12f629 à 2euros)il suffit d'envoyer un ordre à ce pic (que tu auras programmé pour le servo moteur ) pour le declencher puis une autre impulsion sur une autre entée pour l'arreter .
    tu auras inssi des taches en paralleles
    cordialement
    alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

  5. #4
    snyfir

    Re : Controller un servomoteur

    Merci pour vos réponses.

    eSb, le paragraphe 3 de la gestion que tu propose correspond à ce que je souhaite faire, mais en utilisant les interruptions.
    alainav1, merci pour ton idée, mais je ne souhaite pas rajouté de composant.

    Je recherche donc quelqu'un qui à déjà utilisé les interruption sur un pic16F4550 et qui serait en mesure de m'expliquer comment mettre en place une interruption. Merci d'avance

  6. #5
    alainav1

    Re : Controller un servomoteur

    bonjour,
    je confirme que le servo moteur à un couple important pendant qu'il est commandé mais ce couple "moteur" disparait quand il ne l'est plus (le couple residuel est celui des engrenages ).
    Quand aux interruptions il s'agit de configurer une ou des entrée qui lorsqu'elle sont sollicitées executent un sous programme puis le programme reprend là où il s'est arreté.
    Ce n'est pas du multitache .
    l
    Cordialement
    Alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

  7. A voir en vidéo sur Futura
  8. #6
    eSb`

    Re : Controller un servomoteur

    Citation Envoyé par alainav1 Voir le message
    bonjour,
    juste une idée !
    si tu uililises un pic specifique pour controler le servo moteur (un 12f629 à 2euros)il suffit d'envoyer un ordre à ce pic (que tu auras programmé pour le servo moteur ) pour le declencher puis une autre impulsion sur une autre entée pour l'arreter .
    tu auras inssi des taches en paralleles
    cordialement
    alain
    Bonjour, j'avais effectivement aussi pensé à relier 2 PICs ensemble mais ça ne résoud qu'à moitié le problème.

    Comment générer le PWM avec le deuxième PIC ? (génération des états-hauts et bas avec temporisation ou timer, ou alors prendre un PIC avec module PWM (PIC12F683 par ex.) et donc son quartz personnel ?)
    Ensuite, comment transmettre l'information au deuxième PIC ? Par I²C ? (je suis relativement débutant dans la programmation PIC, donc je ne sais pas si c'est la meilleure méthode ; ))

    Citation Envoyé par snyfir Voir le message
    Merci pour vos réponses.

    eSb, le paragraphe 3 de la gestion que tu propose correspond à ce que je souhaite faire, mais en utilisant les interruptions.
    alainav1, merci pour ton idée, mais je ne souhaite pas rajouté de composant.

    Je recherche donc quelqu'un qui à déjà utilisé les interruption sur un pic16F4550 et qui serait en mesure de m'expliquer comment mettre en place une interruption. Merci d'avance
    Quel est le but de l'application exactement ?
    Tu veux que sur une interruption de l'extérieur le PIC réagisse et fasse bouger le servomoteur ou le servomoteur doit agir avec interruption (avec les timers par ex.) ?

  9. Publicité
  10. #7
    eSb`

    Re : Controller un servomoteur

    Re-bonsoir,

    Je voudrais une confirmation. N'existe-t-il aucun PIC 8 pins pouvant communiquer en I²C ?

    La solution d'un PIC s'occupant uniquement du PWM me parait sympathique et intéressante à mettre en oeuvre, mais je n'en trouve pas gérant l'I²C. (je cherche peut-être mal ; ))

  11. #8
    alainav1

    Re : Controller un servomoteur

    bonjour,
    pourquoi veux tu communiquer en i2C avec le deuxieme pic ?
    tu ecris un sous programe de commande de servo dans le pic 2
    tu declenches ce sous programme quand tu envoies un ordre du pic 1 vers le pic 2 (sur la broche qui gère les interruption ^par exemple )
    cordialement
    Alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

  12. #9
    eSb`

    Re : Controller un servomoteur

    Je voulais le faire pour deux raisons :
    - Je ne savais pas si on pouvait relier "simplement" les broches d'un PIC à l'autre (bien que je suppose que les niveaux sont totalement compatibles).
    - Pour pouvoir envoyer une information précise au deuxième PIC.

    Maintenant, il est évidemment possible de compter les interruptions et donc de savoir quelle valeur de PWM je dois appliquer en sortie du 2ème PIC. (je pourrais faire une sorte de "table" avec : Si interruption = 1 -> PWM 1, ...)

    Ca me donne effectivement une possibilité en plus, mais moins "puissante". (dans le sens où les valeurs doivent être stockées dans le PIC2 et je ne peux pas les mettre à jour online)

    Dans mon cas, ce n'est pas trop dérangeant; je dois avoir 3 valeurs de rapports cycliques et ce, de façon séquentielle (donc la 1, la 2 puis la 3, la 1, la 2, ...) mais c'est moins pratique ; ).

  13. #10
    remy01

    Re : Controller un servomoteur

    Salut,
    sur mon site, puis AAE, puis Commande de servo ( pic16F628 ),
    il y a un exemple de programme en C, utilisant les interruptions.
    A+ ....Rémy.

Sur le même thème :

Discussions similaires

  1. controller memoire
    Par jamelmne dans le forum Électronique
    Réponses: 30
    Dernier message: 28/07/2008, 13h32
  2. Controller à distance
    Par Mazh dans le forum Électronique
    Réponses: 6
    Dernier message: 09/07/2008, 06h19
  3. Controller un pont en H avec un ULN2803
    Par zapoutix dans le forum Électronique
    Réponses: 4
    Dernier message: 13/05/2008, 00h22
  4. NDAS SCSI controller 10
    Par odyssee5 dans le forum Matériel - Hardware
    Réponses: 0
    Dernier message: 08/02/2007, 22h15
Découvrez nos comparatifs produits sur l'informatique et les technologies.