petit programme de base pour commander un servomoteur..ou est l'erreur !?
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

petit programme de base pour commander un servomoteur..ou est l'erreur !?



  1. #1
    invitee3b1bf3c

    petit programme de base pour commander un servomoteur..ou est l'erreur !?


    ------

    bonjour tout le monde.
    Je cherche a commander un servomoteur a partir d'un pic18f4620.
    Je n'ai pas de quartz donc la frequence d'oscillation est de 1Mhz.donc une incrementation tous les 4µs

    Le lien entre le servo et le pic s'effectue par le pin RC2/CCP1 : je n'utilise pas le mode pwm car il semble qu'il est difficile d'obtenir une periode de 20ms

    J'utilise donc le mode compare du pin ccp1 ainsi que le timer1 :
    a chaque interruption du timer1 je genere un creneau de 20ms en sortie.
    a chaque fois que timer1 prend la valeur de ccp1 que j'ai reglé (1ms ; 1,5ms ou 2ms en fonction de la position voulue) la sortie passe a 0.

    Voici le code en C (le plus detaille possible...) malheureusement ca ne marche pas et je ne comprends pas pourquoi. est ce que quelqu'un pourrait me sauver la vie et trouver ce qu'il manque ou ce qui ne va pas?




    /****************************** ****************************** ****************/
    /* I N C L U D Es */
    /****************************** ****************************** ****************/
    #include <p18f4620.h>

    /****************************** ****************************** ****************/
    /* C O N F I G U R A T I O N */
    /****************************** ****************************** ****************/
    #pragma config OSC = INTIO67
    #pragma config PWRT = OFF
    #pragma config WDT = OFF
    #pragma config BOREN = ON
    #pragma config PBADEN = OFF
    #pragma config LVP = OFF
    #pragma config XINST = OFF


    /****************************** ****************************** ****************/
    /* P R O T O T Y P E S D E F O N C T I O N S */
    /****************************** ****************************** ****************/
    void Traiter_ItHaute (void);
    void Init_compare(void);
    void Config_Rapport_cyclique(unsign ed int iRap_Cyc);


    /****************************** ****************************** ****************/
    /* T R A I T E M E N T S D' I N T E R R U P T I O N */
    /****************************** ****************************** ****************/
    #pragma code high_vector_section=0x8
    void high_vector (void)
    {
    _asm
    GOTO Traiter_ItHaute
    _endasm
    }

    #pragma code
    #pragma interrupt Traiter_ItHaute
    void Traiter_ItHaute (void)
    {
    if(PIR1bits.TMR1IF) // traite l'interruption due à TMR1
    {
    PORTCbits.RC2=1; // Sortie passe à 5V
    TMR1H=0xEC; TMR1L=0x78; // Reinitialise le compteur pour 20mS
    PIR1bits.TMR1IF=0;
    }

    if(PIR1bits.CCP1IF) // traite l'interruption du au CCP
    {
    PORTCbits.RC2=0; // Sortie passe à 0V
    PIR1bits.CCP1IF=0;
    }

    } // Fin de la fonction de traitement d'interruption



    /****************************** ****************************** ****************/
    /* F O N C T I O N P R I N C I P A L E */
    /****************************** ****************************** ****************/
    void main(void)
    {
    TRISCbits.TRISC2=0; //Configure le pin 2 du port C en sortie
    PORTCbits.RC2=0;

    T3CONbits.T3CCP1=0; //configure ccp1 avec timer1 et non timer3



    INTCONbits.GIE=1; //autorisation globale
    PIE1bits.CCP1IE=1; //autorisation de l interruption ccp
    PIE1bits.TMR1IE=1; //Autorise interruption du au débordement de TMR1


    Init_compare(); // Initialise les registres en mode comparaison

    T1CONbits.TMR1ON=1; // Active le Timer 1

    Config_Rapport_cyclique(0xED72 ); // Servo à gauche
    //Config_Rapport_cyclique(0xEDEF ); // Servo au centre
    //Config_Rapport_cyclique(0xEE6C ); // Servo à droite

    while(1);
    }

    void Init_compare(void)
    {
    TMR1H=0xEC; TMR1L=0x78; // Initialisation de TMR1
    // 0xEC78=65536-20000µS/4µS
    CCPR1H=0xED; CCPR1L=0xEF; // Initalisation du servo au centre
    CCP1CON=0b00001010; // Si comparaison réussie CCP1IF passe à 1
    T1CON=0b00000000; // choix de la prédivision
    }

    void Config_Rapport_cyclique(unsign ed int iRap_Cyc)
    {
    CCPR1L=iRap_Cyc & 0xFF; // Copie l'octet bas de iRap_Cyc dans CCPR1L
    CCPR1H=iRap_Cyc>>8; // Décale l'octet haut de iRap_Cyc dans son octet bas,
    } // et copie dans CCPR1H.



    MERRRCCI

    -----

  2. #2
    cherwam07

    Re : petit programme de base pour commander un servomoteur..ou est l'erreur !?

    T1CON=0b00000000;
    Le bit 0 de T1CON correspond à l'activation du timer 1.
    S'il est à zero, le timer ne compte pas.

  3. #3
    invitee3b1bf3c

    Re : petit programme de base pour commander un servomoteur..ou est l'erreur !?

    merci cherwam07
    Tu as raison pour le T1CON. Malheureusement cela ne marche toujours pas..
    J'ai testé a l'oscilloscope, aucun signal ne sort du port RC2.
    je vais perseverer..

Discussions similaires

  1. Comment commander mon servomoteur ?
    Par arizona07 dans le forum Électronique
    Réponses: 6
    Dernier message: 14/04/2008, 21h51
  2. Trouver l'erreur dans mon programme en BASIC:s
    Par alex934mas dans le forum Électronique
    Réponses: 4
    Dernier message: 12/04/2008, 11h03
  3. Commander un servomoteur avec une tension variable 0-5V
    Par Nikko485 dans le forum Électronique
    Réponses: 4
    Dernier message: 18/12/2007, 16h40
  4. Programme de base pour PIC16F876A
    Par invitef1f90160 dans le forum Électronique
    Réponses: 4
    Dernier message: 10/04/2006, 05h46
  5. Commander un servomoteur
    Par invite7fa37b4a dans le forum Électronique
    Réponses: 2
    Dernier message: 09/08/2005, 00h22
Découvrez nos comparatifs produits sur l'informatique et les technologies.