question a propos du servomoteur et pic
Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

question a propos du servomoteur et pic



  1. #1
    invite41ed1682

    question a propos du servomoteur et pic


    ------

    bonjour je suis nouveau dans le monde de la robotique j'ai besoin de votre aide svp

    grace a des recherche j'ai pu générer une Modulation de largeur d'impulsion et j'ai pu aussi controller le rapport cyclique voilaa mon code testé sur ISIS et ça marche

    Code:
    void main() 
    {
    PWM1_Init(500);// Pour avoir des impultions chaque 2ms 
    
    
    while(1)
    {
      delay_ms(50);
      PWM1_Start();
      PWM1_Set_Duty(12);
      
     }
    
    
    }
    Maintenant pour mon servomoteur je veux avoir une période de 20ms et contrôler le R.cyclique mais ça marche pas qu'on je mets PWM1_Init(50)
    est ce que quelqu'un peux m'aider et merci d'avance

    -----
    Dernière modification par gienas ; 10/03/2013 à 15h20. Motif: Ajouté les balises code, obligatoires pour les programmes

  2. #2
    invitef86a6203

    Re : question a propos du servomoteur et pic

    Quel pic déjà !!!!

    Sur le 877 on ne peut pas faire du 50hz en PWM...
    Et de toute façon le pas serait trop grand
    Tu lance le PWM en 2ms donc 500hz et donc pas en 50hz
    ton start est mal placé , il ne sert qu'une fois au départ
    Et le PWM n'envoie pas 1 seul pulse , il tourne indépendemment une fois démarré

    Tu dois génerer le signal sans passer par le PWM du compilo

    Code:
    while(1) {
      sortie bas
      delay 18ms
      sortie haut
      delay 1ms
      delay variable de 0 à 1ms (reste à définir le pas 4 µs pour 256 pas)
     }
    Dernière modification par gienas ; 10/03/2013 à 15h21. Motif: Ajouté les balises code, obligatoires pour les programmes

  3. #3
    invite41ed1682

    Re : question a propos du servomoteur et pic

    Sortie bas et sortie haut tu veux site les Ton et Toff .../?

  4. #4
    invitef86a6203

    Re : question a propos du servomoteur et pic

    mettre la pin à 1 ou à 0

    ça dépend du compilateur ...
    en asm;
    exemple
    bsf PORTB,0
    bcf PORTB,0

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

    Re : question a propos du servomoteur et pic

    Bonjour,
    pou d'aider un exemple en C :
    http://remy-p.pagesperso-orange.fr/aae/aaeserv.htm
    A+ ....Rémy.

  7. #6
    invitef86a6203

    Re : question a propos du servomoteur et pic

    un pas de 0.1ms ça fait 10 pas, soit 10 positions possible , pour la précision c'est rapé

  8. #7
    invite41ed1682

    Re : question a propos du servomoteur et pic

    Merci les amis pour vos réponse

    je travail sous MiKroC Mr freepicbasic

    et je comprends pas ce que tu veux dire avec 10 pas ou je sais pas

    Mr Remy c'est vous qui a fait le prgrame sur le tuto que tu m'a donner?
    Merci

  9. #8
    invite5c0d525e

    Re : question a propos du servomoteur et pic

    Citation Envoyé par sniper1500 Voir le message

    et je comprends pas ce que tu veux dire avec 10 pas ou je sais pas
    Avec un pas de 0.1ms la pulsation ne peut avoir que 11 valeurs (1.0, 1.1, 1.2,1.3.... jusqu'à 2.0) donc 11 positions possibles entre -90° et +90°. la résolution de ton sevvo sera donc de 18° (180°/10*)

    *11 positions ça fait 10 intervalles

  10. #9
    remy01

    Re : question a propos du servomoteur et pic

    "Mr Remy c'est vous qui a fait le prgrame sur le tuto que tu m'a donner?
    Merci "

    Oui, c'est moi, il y a quelques temps, c'était une démo sur les servomoteurs.
    Ce n'est qu'un exemple de programme.
    A+ ....Rémy.

  11. #10
    invitef86a6203

    Re : question a propos du servomoteur et pic

    effectivement 11 positions !
    L'exemple est bien construit tout de même.
    Possible que certaines applications aient assez de 11 positions.

    Quant a la compatibilité Mikro C et CCS , j ai peur que ce ne soit pas full compatible quoi qu'en disent certains sur la portabilité qui reste un but à atteindre mais ne l'est jamais...
    "setup_timer_2(T2_DIV_BY_4,24, 1); "

    Personnellement je préfère 64 pas qui donnent un bon compromis entre l'analogique et le digital.
    Au dessus, soit c est impossible si le quartz est de 4Mhz, soit le pic ne fait plus que ça...
    Autrement dit si l'on veut commander une batterie de servos il faut des pics dédiés à ce travaille.
    La méthode fribotte est pas mal à mon avis, quoique la vitesse de réaction est limitée par le port série.
    http://fribotte.free.fr/bdtech/8serv...vomoteurs.html

  12. #11
    invite41ed1682

    Re : question a propos du servomoteur et pic

    Merci beaucoup pour vos efforts

    j'ai pu générer un signal avec la méthode que vous m'avez donnez mais le problème c'est que mon servomoteur tourne dans un seul sens

    PortC=0X04;
    delay_ms(1);
    PortC=0X00;
    delay_ms(19) ;
    }

    mais quand je donne a mon servomoteur 2ms Ton il change pas de sens

    1ms -90
    2ms +90

    z

  13. #12
    invite5c0d525e

    Re : question a propos du servomoteur et pic

    Avec le code complet c'est mieux.

  14. #13
    invite41ed1682

    Re : question a propos du servomoteur et pic

    Code:
    void main()
     {
     TRISC=0X00;
     TRISA=0X01;
    
    
     while(1)
     {
     if (PORTB==0x01)
     {
     PortC=0X04;
     delay_ms(1);
     PortC=0X00;
     delay_ms(19) ;
     }
     else PORTC=0;
      }
    
    }
    Dernière modification par gienas ; 10/03/2013 à 15h22. Motif: Ajouté les balises code, obligatoires pour les programmes

  15. #14
    invite5c0d525e

    Re : question a propos du servomoteur et pic

    Je ne connais pas le C mais il me semble que :

    Si la condition est vraie tu envoies bien une impulsion d'une ms (PortC=0X04;delay_ms(1)) par contre si elle est fausse tu n'envoies aucune impulsion (else PORTC=0) Ca ne risque pas de marcher.

    Un else PortC=0X04;delay_ms(2); fonctionnerait sans doute mieux.

  16. #15
    invite41ed1682

    Re : question a propos du servomoteur et pic

    mais non lorsque j'envoie

    {
    PortC=0X04;
    delay_ms(2);
    PortC=0X00;
    delay_ms(18) ;
    }
    normalement c'est automatiquement le servomoteur va tourner dans l'autre sens

  17. #16
    invite41ed1682

    Re : question a propos du servomoteur et pic

    mais non lorsque j'envoie
    Code:
    {
    PortC=0X04;
    delay_ms(2);
    PortC=0X00;
    delay_ms(18) ;
    }
    normalement c'est automatiquement le servomoteur va tourner dans l'autre sens

  18. #17
    invite5c0d525e

    Re : question a propos du servomoteur et pic

    Citation Envoyé par sniper1500 Voir le message
    Code:
    void main()
     {
     TRISC=0X00;
     TRISA=0X01;
    
    
     while(1)
     {
     if (PORTB==0x01)
     {
     PortC=0X04;
     delay_ms(1);
     PortC=0X00;
     delay_ms(19) ;
     }
     else PORTC=0;
      }
    
    }
    Et là il est où ton bout de code pour tourner dans l'autre sens ?

  19. #18
    invite5637435c

    Re : question a propos du servomoteur et pic

    Bonjour,

    c'est une méthode shadock de faire une commande de servo ainsi.
    Une méthode plus élégante consiste à utiliser le module CCP du PIC, seule (vraie) manière de faire un PWM de très basse fréquence.

    Seul un mode interruptif te garanti de gérer au plus précis tes servos.

    Je peux te retrouver, si ça t'intéresse, une appli que j'avais fait il y a quelques années selon cette technique.

  20. #19
    invite41ed1682

    Re : question a propos du servomoteur et pic

    oui oui Mr Hulk28 ça m intéresse vraiment une petite application sur la commande d'un servomoteur sous MiKroC j'ai déjà vu la méthode que vous avez indiqué (utiliser le module CCP du PIC) mais je l'ai pas bien compris

    Merci

  21. #20
    invite41ed1682

    Re : question a propos du servomoteur et pic

    voila Mr Gabuzu
    Code:
    void main()
     {
     TRISC=0X00;
     TRISA=0X01;
    
    
     while(1)
     {
     if (PORTB==0x01)
     {
     PortC=0X04;
     delay_ms(2);
     PortC=0X00;
     delay_ms(18) ;
     }
     else PORTC=0;
      }
    
    }

  22. #21
    invite5637435c

    Re : question a propos du servomoteur et pic

    Voilà la partie du code qui te sera utile, j'utilise un timer (le timer1) pour contrôler les deux servos.
    Certaines fonctionnalités ne sont pas dans le code, tu y trouveras tout ce qui concerne la gestion du CCP, du timer1 et de l'interruption.
    Le code est sous HitechC, à l'époque j'utilisais ça, il est facilement portable sous MikroC (5mn en buvant le café), c'est tout l'avantage des compilo ANSI, comme nous le verrons plus tard dans le C PARTY.
    @+


    Code:
    // MPLAB 7.40 Compilateur Hitech C v8.02 PL1
    // commande de deux servos moteurs (H et V) pour asservissement caméra vidéo
    // les 2 servos sont commandés par un joystick 2 axes 4 positions
    // l'action simultanée des deux servos permet des mouvements rotatifs, circulaire et en diagonale.
    
    #include <pic.h>
    #include "joystick.h"
    #include "ad16f87x.h"
    __CONFIG(XT & WDTEN & BORDIS & LVPDIS & UNPROTECT);
    unsigned int val ;
    unsigned char Vpos ;
    unsigned char Hpos ;
    #define Time 5
    #define Clign 10
    #define time_led 10
    #define time2 40
    void init_pic (void);
    void Delais_Milli (int val) ;
    void PosLed (void) ;
    void Test_Leds (void) ;
    void Reset (void) ;
    static void interrupt inter(void) ;
    void Init_compare(void) ;
    void Config_rapport_cycliqueV(unsigned char) ;
    void Config_rapport_cycliqueH(unsigned char) ;
    
    void init_pic (void)
    {
    RBPU = 1; // Pull up désactivés 
    // Timer 0 est utilisé pour le wachtdog à 2,3 s.
    Timer0ClockSource = 0; // Clock interne
    PrescalerAssignement = 1; // timer0 = Wachtdog
    Timer0PrescalerRate2 = 1; // \
    Timer0PrescalerRate1 = 1; // => 111 + WDT => 18 ms x 128 = 2,304 s 
    Timer0PrescalerRate0 = 1; // /
    // CLRWDT() ;
    ADCON1= 6 ; // Passe le port A en mode digital
    TRISA = ConfigIOPortA ; // Configuration du port A
    TRISB = ConfigIOPortB ; // Configuration du port B 
    TRISC = 0 ; // Configuration du port C 
    
    PORTA = 0x3F ; // Toutes les sorties à 5V
    PORTB = 0xFF ; // Toutes les entrées à 5V
    PORTC = 0 ; // Toutes les sorties à 0V
    GIE = 1; // Valide toutes les interruptions
    PEIE = 1 ; 
    CCP1IE = 1 ; // Interruption en mode comparaison autorisée comparateur 1
    CCP2IE = 1 ; // Interruption en mode comparaison autorisée comparateur 2
    
    TMR1IE = 1 ; // Interruption du Timer1 autorisée 
    }
    
    main()
    {
    CLRWDT() ;
    init_pic() ;
    
    Init_compare() ;
    
    Vpos = 90 ; // position centrale servo Vertical
    Hpos = 90 ; // position centrale servo Horizontal
    Config_rapport_cycliqueV (Vpos) ;
    Config_rapport_cycliqueH (Hpos) ;
    
    Test_Leds() ; // Test des leds au démarrage
    while(1) // Le programme tourne dans cette boucle principale 
    {
    
    CLRWDT() ;
    if (CENTRAGE_JOY == 0)
    {
    Reset() ; // Réinitialise les servos en position centrale
    }
    ......... // tu mets ici tes commandes à envoyer au servos
    }
    
    static void interrupt inter(void) // Gestion du timer1 en mode compare
    {
    // CLRWDT() ;
    if (TMR1IF)
    {
    RC6 = 1 ;
    RC7 = 1 ;
    TMR1H = 0xEC ;
    TMR1L = 0x77 ;
    TMR1IF = 0 ;
    }
    if (CCP1IF)
    {
    if ((Vpos > 0) && (Vpos < 180)) 
    {
    CCP1IF = 0 ;
    RC6 = 0 ;
    }
    else
    {
    CCP1IF = 0 ;
    RC6 = 1 ;
    }
    }
    if (CCP2IF)
    {
    if ((Hpos > 0) && (Hpos < 180)) 
    {
    CCP2IF = 0 ;
    RC7 = 0 ;
    }
    else
    {
    CCP2IF = 0 ;
    RC7 = 1 ;
    }
    }
    
    }
    
    void Reset (void) // Fonction de remise en position centrale des servos
    {
    Vpos = 90 ;
    Hpos = 90 ;
    Config_rapport_cycliqueV(Vpos) ;
    Config_rapport_cycliqueH(Hpos) ;
    }
    
    void Init_compare (void)
    {
    CLRWDT() ; 
    {
    TMR1H = 0xEC ; //on fixe la fréquence 65535-20000µs/4µs = 0xEC77
    TMR1L = 0x77 ;
    CCP1CON = 0b00001010 ;
    CCP2CON = 0b00001010 ;
    T1CON = 0b00100001 ; //Prescaler=1:4 Timer1=on
    }
    }
    
    //***********************************************************//
    //Val_tmp = 60285+((139/100)*Hpos) ;
    //Valeurs théoriques
    // min (1ms)= (65535 - 20000µs/4µs) + 1000µs/4µs =60785
    // moyen (1,5ms)=65535 - ((20000µs/4µs) + (1500µs/4µs))=60910
    // define max (2ms)=65535 - ((20000µs/4µs) + (2000µs/4µs))=61035
    void Config_rapport_cycliqueV(unsigned char)
    {
    
    unsigned int Val1_tmp ;
    Val1_tmp = (139*Vpos)/100 ;
    Val1_tmp += 60772 ; //Valeurs adaptées à la maquette et au servo
    
    CCPR1L = Val1_tmp ;
    CCPR1H = Val1_tmp >> 8 ; 
    
    }
    
    void Config_rapport_cycliqueH(unsigned char)
    {
    unsigned int Val2_tmp ;
    Val2_tmp = (139*Hpos)/100 ;
    Val2_tmp += 60772 ; //Valeurs adaptées à la maquette et au servo
    
    CCPR2L = Val2_tmp ;
    CCPR2H = Val2_tmp >> 8 ; 
    
    }
    Amuse toi bien.
    @+

  23. #22
    invitef86a6203

    Re : question a propos du servomoteur et pic

    Merci !
    Excellent code !

  24. #23
    invite41ed1682

    Re : question a propos du servomoteur et pic

    Merci beaucoup Mr HULK pour votre effort restant en contact

Discussions similaires

  1. Question à propos d'un module Ethernet sur µC PIC
    Par invite1c508c4e dans le forum Électronique
    Réponses: 5
    Dernier message: 11/01/2012, 11h07
  2. question peut être un peu à propos de moteur et pic
    Par invite3a95e38f dans le forum Électronique
    Réponses: 13
    Dernier message: 19/10/2010, 11h32
  3. question peut être un peu bête à propos de moteur et pic
    Par invite3a95e38f dans le forum Électronique
    Réponses: 1
    Dernier message: 17/10/2010, 20h30
  4. A propos d'un servomoteur
    Par invite4e51e52c dans le forum Électronique
    Réponses: 2
    Dernier message: 07/04/2010, 20h13
  5. Qui connais logi pic & et question à propos des pic
    Par invitec913303f dans le forum Électronique
    Réponses: 10
    Dernier message: 29/05/2006, 23h40
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...