Probleme prog Servomoteurs
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Probleme prog Servomoteurs



  1. #1
    inviteecadf7bc

    Exclamation Probleme prog Servomoteurs


    ------

    Bonjour,
    Je suis un élève de Term SSI et pour nos PPE nous devons fabriquer deux robots bipèdes.Le deuxième robot est du type "TROLL BOT" (http://www.lextronic.fr/P1930-chassi...l-bot.html).Il fonctionne avec deux servomoteurs et nous devons faire la programmation sur un PIC 16F627.
    J'ai commencé sur flowcode à créer un algorigramme composé de sous-programme pour chaque mouvement des servos (-45°;0°;+45°), associant ces sous-programmes pour faire faire une marche rectiligne du robot.
    J'ai également testé les servos pour trouver les temps à envoyé pour les différents mouvements des servos.
    Flowcode a converti l'algorigramme en C, j'ai ensuite enlevé ce qui me semblais inutile ( Flowcode est assez lourd quand on le passe en C ).Ensuite j'ai transféré le programme sur le 16F627 et c'est là qu'il y a un problème, rien ne fonctionne.
    Aidez-moi s'il vous plait car je suis sur mon 6eme programme depuis 1 mois et demi et aucun ne fonctionnent.. Si vous ne trouvez pas l'erreur ( ou ce qui ne vas pas ), vous pouvez quand même me donner vos conseils, ils seront les bienvenus.
    Merci beaucoup.

    Voici le programme :


    //****************************** ****************************** ************************
    //**
    //** File name: F:\Lycée\PPE\ELEC\Prog Marcheur\MARCHEUR1\prog marcheur avec valeur.c
    //** Generated by: Flowcode v3.4.7.48
    //** Date: Thursday, March 17, 2011 17:11:28
    //**
    //****************************** ****************************** ************************


    #define MX_PIC

    //Définir pour microcontrôleur
    #define P16F628A
    #define MX_EE
    #define MX_EE_TYPE1
    #define MX_EE_SIZE 128
    #define MX_UART
    #define MX_UART_B
    #define MX_UART_TX 2
    #define MX_UART_RX 1
    #define MX_PWM
    #define MX_PWM_CNT 1
    #define MX_PWM_TRIS1 trisb
    #define MX_PWM_1 3

    //Fonctions
    //#include <system.h>
    #pragma CLOCK_FREQ 19660800

    //Configuration de données

    //Fonctions internes
    #include "C:\Program Files\Matrix Multimedia\Flowcode V3\FCD\internals.h"

    //Déclarations de fonction Macro
    void FCM_Servo_1_centre();
    void FCM_Servo_1_plus45();
    void FCM_Servo_1_moins45();
    void FCM_Servo_2_centre();
    void FCM_Servo_2_plus45();
    void FCM_Servo_2_moins45();
    void FCM_initialisation();


    //Déclarations de Variable
    char FCV_COMPT;
    char FCV_DEBUT;

    //Définitions supplémentaires


    //Implémentations Macro

    void FCM_Servo_1_centre()
    {

    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Pause: 1 ms
    delay_ms(1);


    //Sortie: 1 -> B5
    trisb = trisb & 0xdf;
    if (1)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Pause: 1618 us
    delay_us(1618);


    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Pause: 20 ms
    delay_ms(20);


    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    }

    void FCM_Servo_1_plus45()
    {

    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Pause: 1 ms
    delay_ms(1);


    //Sortie: 1 -> B5
    trisb = trisb & 0xdf;
    if (1)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Pause: 1144 us
    delay_us(1144);


    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Pause: 20 ms
    delay_ms(20);


    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    }

    void FCM_Servo_1_moins45()
    {

    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Pause: 1 ms
    delay_ms(1);


    //Sortie: 1 -> B5
    trisb = trisb & 0xdf;
    if (1)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Pause: 2094 us
    delay_us(2094);


    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    //Pause: 20 ms
    delay_ms(20);


    //Sortie: 0 -> B5
    trisb = trisb & 0xdf;
    if (0)
    portb = (portb & 0xdf) | 0x20;
    else
    portb = portb & 0xdf;


    }

    void FCM_Servo_2_centre()
    {

    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Pause: 1 ms
    delay_ms(1);


    //Sortie: 1 -> B6
    trisb = trisb & 0xbf;
    if (1)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Pause: 1540 us
    delay_us(1540);


    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Pause: 20 ms
    delay_ms(20);


    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    }

    void FCM_Servo_2_plus45()
    {

    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Pause: 1 ms
    delay_ms(1);


    //Sortie: 1 -> B6
    trisb = trisb & 0xbf;
    if (1)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Pause: 1075 us
    delay_us(1075);


    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Pause: 20 ms
    delay_ms(20);


    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    }

    void FCM_Servo_2_moins45()
    {

    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Pause: 1 ms
    delay_ms(1);


    //Sortie: 1 -> B6
    trisb = trisb & 0xbf;
    if (1)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Pause: 2032 us
    delay_us(2032);


    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    //Pause: 20 ms
    delay_ms(20);


    //Sortie: 0 -> B6
    trisb = trisb & 0xbf;
    if (0)
    portb = (portb & 0xbf) | 0x40;
    else
    portb = portb & 0xbf;


    }


    void FCM_initialisation()
    {

    //Calcul
    FCV_COMPT = 0; // compt = 0
    FCV_DEBUT = 0; // debut = 0

    }

    //Installation supplémentaire


    void main()
    {

    //Initialisation
    cmcon = 0x07;


    //Code d'initialisation d'Interruption
    option_reg = 0xC0;


    //Boucle: Tant quedebut=0
    while (1)
    {
    //Entrée: A0 -> debut
    trisa = trisa | 0x01;
    FCV_DEBUT = ((porta & 0x01) == 0x01);


    if ((FCV_DEBUT == 0) == 0) break;
    }


    //Boucle: Tant quecompt<>5
    while (1)
    {
    //Appel d'une Macro: Servo_1_centre
    FCM_Servo_1_centre();


    //Appel d'une Macro: Servo_2_centre
    FCM_Servo_2_centre();


    //Appel d'une Macro: Servo_1_moins45
    FCM_Servo_1_moins45();


    //Appel d'une Macro: Servo_2_moins45
    FCM_Servo_2_moins45();


    //Appel d'une Macro: Servo_1_centre
    FCM_Servo_1_centre();


    //Appel d'une Macro: Servo_1_plus45
    FCM_Servo_1_plus45();


    //Appel d'une Macro: Servo_2_plus45
    FCM_Servo_2_plus45();


    //Appel d'une Macro: Servo_1_centre
    FCM_Servo_1_centre();


    //Calcul:
    // compt = compt + 1
    FCV_COMPT = FCV_COMPT + 1;


    if ((FCV_COMPT != 5) == 0) break;
    }


    //Appel d'une Macro: Servo_1_centre
    FCM_Servo_1_centre();


    //Appel d'une Macro: Servo_2_centre
    FCM_Servo_2_centre();


    mainendloop: goto mainendloop;
    }

    void interrupt(void)
    {
    }

    -----

  2. #2
    Jack
    Modérateur

    Re : Probleme prog Servomoteurs

    Les règles participatives de la section langage et programmation ne sont pas là pour faire beau:
    Par contre pour un maximum d'efficacité et pour respecter une longue tradition tout ce qui concerne la programmation de la partie hardware des PIC ou autres micro-contrôleurs ainsi que celle des automates industriels devra être posté dans le forum Électronique. Pour les mêmes raisons les questions sur VDHL devront être également posées dans ce forum.
    En conséquence, je déplace dans le forum électronique

  3. #3
    invite29971eb1

    Re : Probleme prog Servomoteurs

    Avec des "if(0)" dans ton programme, tu ne pas souvent exécuter la suite.

    Un servo de modélisme se pilote avec une impulsion entre 1 et 2 ms, répétée toutes les 20ms.

    1,5ms correspond au servo en position centrale.

    Ca se fait assez facilement avec des timers, et éventuellement avec des sorties Output Compare, si jamais le PIC en dispose.

    Sinon un timer suffit:
    - à t=0, tu actives l'impulsion du servo 1. Le timer est réglé pour redéclencher après la durée d'impulsion du servo 1
    - après la durée d'impulsion du servo 1, tu désactives la sortie servo 1, tu actives la sortie servo 2 et tu règles le timer sur la durée du pulse 2
    - après le pulse 2, tu règles ton timer sur une quinzaine de millisecondes, et tu reviens au début.

    Dans ton programme principal, tu n'auras plus qu'à régler les valeurs de pulse pour que tes servos se mettent en place en "tâche de fond".

    Soit-dit en passant, Flowcode t'a fait un beau programme illisible...et inutilisable....

  4. #4
    inviteecadf7bc

    Re : Probleme prog Servomoteurs

    Merci pour ton aide.
    Mais peux tu m'expliquer plus précisément le fonctionnement d'un timer car avec mes connaissance un peu maigre en programmation j'ai du mal a comprendre.
    Lorsque tu dis "Le timer est réglé pour redéclencher après la durée d'impulsion du servo 1", comment fait on cela?

    Sinon, pour les longueurs d'impulsion, elles sont différentes entre mes deux servos. Pour le 1er a la position centrale, il faut une impulsion de 1618 ms.

    Autre question, est il possible d'envoyé toutes les valurs a la suite, c'est a dire d'envoyé l'impulsion sur le servo 1 puis attendre et ensuite envoyé l'impulsion sur le servo 2.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. probleme avec ce prog
    Par invite2d201af9 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 16/09/2009, 13h25
  2. Problème avec IC-PROG
    Par invitea4531517 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 24/07/2009, 14h01
  3. Problème de cout de servomoteurs
    Par invite5d1bc976 dans le forum Électronique
    Réponses: 3
    Dernier message: 14/08/2007, 12h15
  4. Problème avec IC prog
    Par invite8c9108c7 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 11/07/2007, 09h50
  5. Problème prog. PIC
    Par invite9013ee57 dans le forum Électronique
    Réponses: 2
    Dernier message: 22/01/2007, 13h29
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...