control de servo avec un pic
Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

control de servo avec un pic



  1. #1
    mortaurat

    control de servo avec un pic


    ------

    Bonjour,
    je suis entrain de me construire un petit robot bipede fonctionnant à l'aide de 4 servo.
    Il ne me reste plus que la carte electronique à developper et je compté utiliser un pic (16f876 ou 18f2550).
    J'ai pu lire que pour controller un servo il fallait utiliser un signal PWM de periode 20ms, avec un temps à l'etat haut variant de 0.5ms à 2.5ms.

    Mon probléme est que si je fais fonctionner mon micro avec une horloge de 4MHz, les pic ne pouvant que utiliser un prescaller de 16 et les timers etant de 8bits, je me trouve limité à une frequence de 200 et quelques hertz.
    Deplus, sur le 16f876 et 18f2550 il n'y a pas une sortie PWM par servo...
    Donc je me demandé comment faire pour controller efficacement ces servos sans prendre 100% de la capacité de calcul du CPU ?

    J'ai pensé à une solution un peu barbare. En utilisant un timer je genere une interruption à chaque overflow et incremente une variable.
    L'idée serait de faire 5 tableaux (-90, -45, 0, 45, 90) qui contiendraient la bonne largeur d'impulsion pour la position voulue. La variable incrementée lors de l'overflow permettrait de lire le tableau.
    Mais bon, ca prendrais enormement de memoire...

    Avez vous des idées ?

    Merci

    -----

  2. #2
    invite3a1051d7

    Re : control de servo avec un pic

    bonjour,
    ce site peux surement t'aider
    http://fribotte.free.fr/bdtech/pic/pic_et_servo.html
    cordialement
    Alain

  3. #3
    mortaurat

    Re : control de servo avec un pic

    Merci, j'etais dejà allé sur ce site durant mes recherches, mais je ne l'avais pas lu jusqu'au bout =)
    C'est en effet ce que je craigné, on utilise un timer qui genere des interruptions. Aprés c'est du petit bricollage...
    il faut soit avoir un timer 16 bits, soit en avoir un 8bits qui a un prescaller 8bits. Je vais donc utiliser le TIMER3 de mon 18f2550.

    mais pense tu que l'on contrôle les servo sequentiellement, c'est à dire l'un aprés l'autre ?
    Je me demande bien comment peut t'on faire autrement. A pars peut être utiliser un autre timer et diviser les servos en deux parties, deux gerés par TIMER3 et deux autres gerés par TIMERX.

  4. #4
    invite3a1051d7

    Re : control de servo avec un pic

    bonjour,
    je bricole un peu les pic mais je ne suis pas un specialiste pour resoudre ton probleme alors personnellement je mettrai un petit pic 12F675 par servo (a 2 euro le pic et gros comme un 555 ça complique pas le circuit) .je programme en basic (pic simulator ) et il ne faut que quelques lignes pour programmer le pwm .mais il y a des specialistes qui te proposeront surement d'autres solution
    cordialement
    Alain

  5. A voir en vidéo sur Futura
  6. #5
    mortaurat

    Re : control de servo avec un pic

    Oui pas bête du tout, je vais utiliser des 12f683, j'ai eu un arrivage de microchip dernierement.
    Cependant, je ne peut pas utiliser le pwm à moins de le faire fonctionner avec une horloge de 750 kHz (l'horloge est integrée de precision 1%), à cause du timer 2...
    C'est donc le même fonctionnement que tout à l'heure, à moins que je decide d'occuper 100% de la vitesse de calcul de ce petit pic, en mettant des delay et, ne generer qu'une interruption pour lui envoyer l'information (emanant d'un autre pic) contenant la position des servo. La transmission serait de maniére serie et synchrone.
    Ca me ferait coder une librairie ressemblant un peut à l'I2C.

  7. #6
    remy01

    Re : control de servo avec un pic

    Bonjour,
    va voir sur mon site, puis AAE, puis Commande d'un servo.
    Cela pourra peut-être d'aider.
    A+ ....Rémy.

  8. #7
    mortaurat

    Re : control de servo avec un pic

    Bonjour,
    je suis allez voir ton site, mais il ne traite que du control d'un seul servo.
    Pour en controller 4 sequentiellement en ne fesant appel qu'a un seul pic il faut créer une variable SERVO qui peut aller de 0 à 3 et permettant de selectionner le servo correspondant, ainsi qu'une variable ETAT permettant de decomposer le signal en deux phases, la phase etat_haut et la phase etat_bas.
    voici un extrait de l'interruption:
    Code:
    void  TIMER3_isr(void) //timer 3 overflow
    {  
                                  //-----ETAT==0 -----------
       if(etat==0 && servo==0) //mise etat=1, calibrage timer 
       {
       etat = 1;
       output_high(PIN_B0);
          if(angle==90)
             {
                set_timer3(63536);
             }
          if(angle==0)
             {
                set_timer3(64036);
             }
          if(angle==-90)
             {
                set_timer3(64536);
             }   
       }
       
       if(etat==0 && servo==1) //mise etat=1, calibrage timer 
       {
       etat =1;
       output_high(PIN_B1);
       if(angle==90)
             {
                set_timer3(63536);
             }
          if(angle==0)
             {
                set_timer3(64036);
             }
          if(angle==-90)
             {
                set_timer3(64536);
             } 
       }
       
       if(etat==0 && servo==2) //mise etat=1, calibrage timer 
       {
       etat = 1;
       output_high(PIN_B2);
       if(angle==90)
             {
                set_timer3(63536);
             }
          if(angle==0)
             {
                set_timer3(64036);
             }
          if(angle==-90)
             {
                set_timer3(64536);
             } 
       }
       
       if(etat==0 && servo==3) //mise etat=1, calibrage timer 
       {
       etat = 1;
       output_high(PIN_B3);
       if(angle==90)
             {
                set_timer3(63536);//2ms
             }
          if(angle==0)
             {
                set_timer3(64036);//1.5ms
             }
          if(angle==-90)
             {
                set_timer3(64536);//1ms
             }
       }
       
                                    //-----ETAT==1 -----------
       if(etat==1 && servo==0) //mise etat=0, calibrage timer a
       {
       etat =0;
       output_low(PIN_B0);
       if(angle==90)
             {
                set_timer3(47536);//18ms
             }
          if(angle==0)
             {
                set_timer3(47036);//18.5ms
             }
          if(angle==-90)
             {
                set_timer3(46536);//19ms
             } 
       
       }
       
       if(etat==1 && servo==1) //mise etat=0, calibrage timer
       {
       etat =0;
       output_low(PIN_B1);
       if(angle==90)
             {
                set_timer3(47536);//18ms
             }
          if(angle==0)
             {
                set_timer3(47036);//18.5ms
             }
          if(angle==-90)
             {
                set_timer3(46536);//19ms
             } 
       
       }
       
       if(etat==1 && servo==2) //mise etat=0, calibrage timer 
       {
       etat =0;
       output_low(PIN_B2);
       if(angle==90)
             {
                set_timer3(47536);//18ms
             }
          if(angle==0)
             {
                set_timer3(47036);//18.5ms
             }
          if(angle==-90)
             {
                set_timer3(46536);//19ms
             } 
       
       }
       
       if(etat==1 && servo==3) //mise etat=0, calibrage timer 
       {
       output_low(PIN_B3);
       if(angle==90)
             {
                set_timer3(47536);//18ms
             }
          if(angle==0)
             {
                set_timer3(47036);//18.5ms
             }
          if(angle==-90)
             {
                set_timer3(46536);//19ms
             } 
       
       }
    J'ai utilisé le timer3 du 18f2550 cadencé à 4MHz, donc T3 s'incremente toute les µs.
    donc par exemple si je veut un etat haut de 1ms, j'enleve 1000 à la valeur max de Timer3.

  9. #8
    mortaurat

    Re : control de servo avec un pic

    Je crois que je vais changer de methode et m'inspirer de ce que m'a dit alainav1.
    Je vais prendre un pic 16f628A avec une liaison serie asynchrone qui controllera tout les servos sequentiellement de maniere plus simple, c'est à dire:
    signal = 1 ;
    pause 1ms;
    signal = 0;
    pause = 19ms;

    Ca l'occupera à 100% mais ca sera plus simple.
    Pendant ce temps un autre pic18f2550 traitera les informations issues des divers capteurs et transmettra les ordres au 16f628A via la transmission serie.

  10. #9
    mortaurat

    Re : control de servo avec un pic

    Bonjour,
    je reviens vers vous car j'ai un petit probléme pour mon code. Il m'est impossible de faire l'asservissement de position.
    Lorsque je fais un programme aussi simple que:
    Code:
    output_a(255); //signal = 1 
    delay_ms(1) ;// pause 1ms
    output_a(255); // signal = 0
    delay_ms(19); //pause = 19ms
    Le servo tourne dans le sens horraire jusqu'a sa butée et essaye d'aller encore plus loin, ce qui donne des petit sursaut.
    Idem si je change le temps à l'etat haut à 2ms. Peut importe la tempo il tourne toujours dans le sens horraire jusqu'a la butée.

    Le servo est alimenté par 4 piles LR6.

    Avez vous des idées sur les causes de mon probléme ?

    Merci

  11. #10
    invite2de7076a

    Re : control de servo avec un pic

    En relisant le post;

    RISC à parler il y peu de la nouvelle série des PIC: les PIC16F1xxx si je me rappelle bien (à verifier).
    Ils sont dotés de plus de PWM, c'est peut être vers quoi tu peut te diriger.

  12. #11
    invite3a1051d7

    Re : control de servo avec un pic

    bonjour,
    je ne connais pas la syntaxe de ce que tu ecris mais

    output_a(255); //signal = 1

    output_a(255); //signal = 0

    la même fonction (output_a(255)) pour 2 actions differentes (mise a 1 et à 0
    il doit y avoir une erreur ?

    je suppose qu'il y a une boucle pour repeter la fonction
    cordialement
    Alain

  13. #12
    mortaurat

    Re : control de servo avec un pic

    Citation Envoyé par alainav1 Voir le message
    bonjour,
    je ne connais pas la syntaxe de ce que tu ecris mais

    output_a(255); //signal = 1

    output_a(255); //signal = 0

    la même fonction (output_a(255)) pour 2 actions differentes (mise a 1 et à 0
    il doit y avoir une erreur ?

    je suppose qu'il y a une boucle pour repeter la fonction
    cordialement
    Alain
    Oups pardon c'est bien dans mon code:
    while(1)
    {
    output_a(255); //signal = 1
    delay_ms(1) ;// pause 1ms
    output_a(0); // signal = 0
    delay_ms(19); //pause = 19ms
    }

    En fait output_a affiche juste la valeur 255 les bits du PORTA. j'aurais pu mettre juste un seul bit à 1, mais bon =)
    Dans mon programme il n'y avais pas cet erreur, j'avais posté un peut vite.
    Avec une Led j'observe bien un clignotement rapide, mais je ne comprend pas pourquoi mon servo ne fait que tourner dans le sens horraire et tente de continuer à tourner aprés la butée, ce qui donne des sursaut...
    En fait ca reagit un peu comme un pas à pas, à chaque pulse il bouge un peu...

  14. #13
    invite3a1051d7

    Re : control de servo avec un pic

    bonjour,
    fait differentes boucle en modifiant les valeurs
    par exemple modifie la valeur 1ms par 1500µS )
    attention le servo consomme beaucoup de courant verifie que la tension ne s'ecrase pas en fonctionnement (si les piles sont vieilles par exemple)j'ai eu ce probleme le programme reseter par baisse de tension.
    j'utilise ce type de programme sans soucis .si tu veux je peux ecrire un bout de programme testé en vrai grandeur pour que tu testes .
    dis moi quel sortie tu utilises et quel pic
    cordialement
    Alain

  15. #14
    mortaurat

    Re : control de servo avec un pic

    bonjour,
    j'utilise un 18f2550 alimenté par ICD2.
    Le servo est alimenté par 4piles LR6.

    J'ai placé un oscilloscope pour voir si j'avais la bonne periode, et en fait toutes mes tempo etaient multipliés par 4 à cause d'une ligne rajoutée par mon compilo:
    #FUSES CPUDIV4 //System Clock by 4

    J'ai donc reglé ca, et je trouve maintenant des tempo correctes.
    malgré tout, impossible d'avoir l'asservissement de position, le palonier reste dans la position 180° et tourne toujours dans cette direction. Bon certe j'ai plus les sursaut =)

    J'ai fais ce code qui en gros pendant 20 secondes donne un certain rapport cyclique, puis un autre etc...
    Je devrais voir mon servo être à la position 0°, 90° puis 180°...
    Mais rien n'y fait, il reste à 180°.
    Code:
    int16 x,i;
    while(1)
    {
    x=1000;
    for(i=0; i<1000;i++)
    {
    	output_a(255);
    	delay_us(x);
    	output_a(0);
    	delay_us(20000-x);
    }
    x=1500;
    for(i=0; i<1000;i++)
    {
    	output_a(255);
    	delay_us(x);
    	output_a(0);
    	delay_us(20000-x);
    }
    x=2000;
    for(i=0; i<1000;i++)
    {
    	output_a(255);
    	delay_us(x);
    	output_a(0);
    	delay_us(20000-x);
    }
    }
    En regardant à l'oscillo, rien de particulier. Les piles sont neuves, j'ai bien 5volts sur ma sortie, le rapport cyclique bouge, et la periode reste de 20ms.
    J'ai aussi essayé de changer de servo, mais ca fait la même chose...

  16. #15
    invite3a1051d7

    Re : control de servo avec un pic

    bonjour ,
    si tu as ce que tu demandes vers le servo (les bon creneaux 1mS haut 19 ms bas )es tu sur du cablage vers le servo?
    cordialement
    Alain

  17. #16
    mortaurat

    Re : control de servo avec un pic

    normalement oui.
    Sur le servo il y a 3 fils, un blanc, un rouge et un noir.
    J'ai branché VCC au rouge, GND au noir et mon signal sur le blanc.
    c'est ce qui est fait ici:
    http://www.bricotronique.com/montage...rces/servo.php

    Ca me fait penser un peut à ce probléme:
    http://forums.futura-sciences.com/el...rvomoteur.html
    Sauf que le mien n'est pas modifié, et que mon alim delivre sufisament de courant, puisqu'il tourne

  18. #17
    mortaurat

    Re : control de servo avec un pic

    Personne à d'idées sur ce dysfonctionement ?

    Merci

  19. #18
    mortaurat

    Re : control de servo avec un pic

    Bonjour,
    je viens de trouver la faille.
    Il sagissait de l'alimentation qui même si je relié les masses fesait que mon montage ne marchait pas correctement.

    Il ne me reste plus qu'a le faire marcher.

    Merci

  20. #19
    invitecb49b6c0

    Re : control de servo avec un pic

    Salut,

    Avec un simple 16F8xx tu peux contrôler au moins 8 servos simultanément avec une trés bonne précision.

    En faite faut pas oublier que 20ms de période pour le signal PWM c'est le temps max, rien n'empèche de faire une période de 10ms.

    Pour faire simple si tu as 4 servos à commander, tu utilise le timer1 d'un 16F8xx, qui est un timer sur 16 bits. Et tu utilise le "mode compar" du µC.

    Et tu passe évidement par les intérruptions. Et tu peux avoir une précision théorique de 0,02° avec un quartz de 20Mhz.

    Et tu peux donc contrôler chacun de tes servos avec un angle variant entre 0 et 200° le tout avec une précision de 0,02°.


    Bonne continuation.
    Laurent

  21. #20
    mortaurat

    Re : control de servo avec un pic

    Citation Envoyé par laurentdu38 Voir le message

    En faite faut pas oublier que 20ms de période pour le signal PWM c'est le temps max, rien n'empèche de faire une période de 10ms.
    Merci, c'est bon à savoir ca
    Cependant on est vite limité par le temps que met le servo à faire un demi-tour (180°), il faut donc maintenir le signal un certain temps (j'ai mis 1s pour être tranquille).

    Je pense que je vais controller les 4 servos avec un pic18f2550 et le relier à un autre pic avec une liaison I2C ou serie avec un pic18f4550 qui se chargera des calculs et des capteurs.

    Je vous tiens au jus

  22. #21
    invitecb49b6c0

    Re : control de servo avec un pic

    Citation Envoyé par mortaurat Voir le message
    Cependant on est vite limité par le temps que met le servo à faire un demi-tour (180°), il faut donc maintenir le signal un certain temps (j'ai mis 1s pour être tranquille).

    Justement l'avantage avec les intérruptions, c'est que tu peux maintenir le signal tout en fesant pleins d'autre choses dans ton programme comme des calculs..etc
    Tu peux maintenir ton premier servo à 47° le second a 147° le 3ème à 100° et le 4ème à 200°. Et tout ca avec un seul µC et tout ca en fesant pleins d'autre calculs dans le reste de ton code.

  23. #22
    mortaurat

    Re : control de servo avec un pic

    Oui mais là il faut plusieurs timer !
    1 timer par servo.

    d'autant plus que tu ne vas pas gerrer l'interruption de la même maniére pour chaque servo. Je veux dire par là que par exemple sur le 18f2550 qui possede 4 timer on peut generer une interruption de deux maniéres, soit en cas d'overflow, soit lorsque le timer atteint une certaine valeur du registre de comparaison.
    Seulement tout les timers ne possedent pas ce registre de comparaison.
    On realise donc une usine à gaz

    Enfin si tu as une autre idée ca m'interesse

  24. #23
    invitecb49b6c0

    Re : control de servo avec un pic

    Citation Envoyé par mortaurat Voir le message
    Oui mais là il faut plusieurs timer !
    1 timer par servo.

    d'autant plus que tu ne vas pas gerrer l'interruption de la même maniére pour chaque servo. Je veux dire par là que par exemple sur le 18f2550 qui possede 4 timer on peut generer une interruption de deux maniéres, soit en cas d'overflow, soit lorsque le timer atteint une certaine valeur du registre de comparaison.
    Seulement tout les timers ne possedent pas ce registre de comparaison.
    On realise donc une usine à gaz

    Enfin si tu as une autre idée ca m'interesse

    Non tu utilise que UN seul timer, le timer 1.

Discussions similaires

  1. Commande PIC arret automatique Servo
    Par invitef489e732 dans le forum Électronique
    Réponses: 4
    Dernier message: 31/12/2009, 12h02
  2. servo et pic 16f877
    Par invitecb40bc0e dans le forum Électronique
    Réponses: 7
    Dernier message: 11/10/2009, 09h42
  3. Commande simple d'un servo avec un pic
    Par invite18fbccbd dans le forum Électronique
    Réponses: 2
    Dernier message: 18/03/2008, 18h58
  4. Fonctionnement d'un PIC avec plusieurs servo
    Par invite5d1bc976 dans le forum Électronique
    Réponses: 4
    Dernier message: 09/12/2007, 15h37
  5. Contrôler 12 servo depuis un microprocesseur PIC
    Par invite6afd98bf dans le forum Électronique
    Réponses: 6
    Dernier message: 16/05/2006, 18h53
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...