piloter un moteur DC depuis un pic 18F4455
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

piloter un moteur DC depuis un pic 18F4455



  1. #1
    inviteddef3cf5

    piloter un moteur DC depuis un pic 18F4455


    ------

    Hello,

    J'ai un soucis avec mon code car je ne parviens pas à rentrer dans l'interruption qui permet de générer la rotation de mon moteur à plein régime
    En résumé un codeur incrémentale envoie 4000 pulses PWM par tour complet (360°) sur le pic 18F4455 je dois donc compter ces pulses afin de faire déplacer une butée sur un rail à l'aide de ce moteur.

    pour ce faire j'utilise le timer 2 pour le PWM sur un quartz externe 4MGHz ensuite j'utilise le timer 0 en mode compteur 16 bits pour compter une valeur max de 65535 pulses ce qui me permet de faire un peu plus de 16 tours de périmètre 9.42cm soit une distance de 1m50.

    Pour les rampes d'accélérations et de décélérations, j'utilise une variable 8 bit qui s'incrémente ou se décrémente de 1 à 254 valeurs.
    Puis pour le compteur de pulses une variable 16 bits.
    le code:
    void Interrupt()
    {
    TMR0L = 0xFF;
    TMR0H = 0xFF; // Pré-charge le registre timer 0 sur 16 bits
    if (edge==1) // si le pic détecte un front positif sur le signal du codeur
    {
    moteur = 1; // mise en route moteur
    accélère = 1; // while (compte!=254) {compte++;}
    if (compte_pulses==20000) // si le compteur de pulses a permis au moteur de faire 5 tours
    {
    flag de débordement = 1; // comme son nom l'indique le flag de débordement passe à 1 et ainsi arrête le compteur de pulses
    }
    else
    {
    flag = 0; // le flag reste à 0
    compte_pulses++; // le compteur s'incrémente jusqu'à atteindre cette valeur
    }
    }
    }
    Voilà si quelqu'un a une petite idée de ce qui ne va pas ce serait sympa merci

    -----

  2. #2
    RISC

    Re : piloter un moteur DC depuis un pic 18F4455

    Salut,

    A quelle vitesse tourne ton PIC (Fcycle= ou Fosc=) ?
    Peux-tu faire voir tes bits de configuration dans ton programme ?

    a+

  3. #3
    inviteddef3cf5

    Re : piloter un moteur DC depuis un pic 18F4455

    salut

    Alors j'attaques le pic avec un quartz de 4MGHz que je pré-divise par 2 ce qui me permet de pouvoir compter jusqu'à 65535 * 2 fronts montants.
    le moteur tourne à 32KHz mais je ne me soucie pas de devoir compter les cycles je dois compter les fronts montants dans une fonction d'interruption. Fonction dans laquelle je précharge les 2 registres 8 bits du timer 1.

    Mon problème et que je ne parviens pas à entrer dans la fonction voici mon code
    void Pic_Init()
    {
    PORTB = 0; // Init. comme sortie
    PORTC = 0;
    PORTC.RC0 = 1; // compteur d'évènements du signal codeur
    TRISC:TRISC1 = 1; // capture le signal car je suis en mode synchronisé
    ADCON1 |= 0x0F; // Inhibe le convertisseur AD
    CMCON |= 0x07; // Désactive le comparateur
    TMR1H = 0xFF; // je précharge le delta 65535 - 65525 pour voir sur l'oscillo si il déborde après dix fronts montants
    TMR1L = oxF5;
    PIE1 = 0B00000001; // active interruption
    PIR1.TMR1IF = 0; // init. le flag d'overflow
    T1CON = 0B00011011; // démarre TMR1 et sychronise le signal
    INTCON = 0B11000000; // Autorise interruption
    }

    void Interrupt()
    {
    if(PIR1.TMR1IF == 1) // teste si le flag déborde ou non
    {
    TMR1H = 0xFF; // je précharge le delta 65535 - 65525 pour voir sur l'oscillo si il déborde après dix fronts montants
    TMR1L = oxF5;
    compte = 0; // réinitialise le compteur de fronts positifs
    }
    PIR1.TMR1IF = 0; // réinitialise le flag de débordement
    }

    void main()
    {
    while(1)
    {

    }
    }
    voilà il est possible qu'il y aie des incohérences dans la fonction pic-init mais si c'est le cas je ne vois pas ou
    je n'arrive pas à joindre le pdf du pic 18F4455 pour que tu puisses regarder l'init du timer1 en mode compteur synchrone désolé
    Merci de ta disponibilité

  4. #4
    RISC

    Re : piloter un moteur DC depuis un pic 18F4455

    Salut,

    Tu n'as pas répondu à ma question concernant les bits de configuration.
    Il est très important de configurer ces bits au début du programme pour définir comment ton PIC va fonctionner ...
    Par exemple, si tu ne touches à rien, il se peux que tu fonctionnes sur l'oscillateur interne au lieu de ton quartz...

    Pour connaitre les paramètres de la commande #pragma config, tu regardes ce fichier :
    c:\Program Files (x86)\Microchip\mplabc18\v3.40 \doc\hlpPIC18ConfigSet.chm

    Par exemple pour le PIC18F4550 on peut avoir ce genre de configuration :
    Code:
            #pragma config PLLDIV   = 1         // (4 MHz crystal)
            #pragma config CPUDIV   = OSC1_PLL2   
            #pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
            #pragma config FOSC     = HSPLL_HS
            #pragma config FCMEN    = OFF
            #pragma config IESO     = OFF
            #pragma config PWRT     = OFF
            #pragma config VREGEN   = ON      //USB Voltage Regulator
            #pragma config WDT      = OFF
            #pragma config WDTPS    = 32768
            #pragma config MCLRE    = ON
            #pragma config LPT1OSC  = OFF
            #pragma config PBADEN   = OFF
            #pragma config STVREN   = ON
            #pragma config LVP      = OFF
    Il faut bien sur adapter ces bits à TON PIC et ton harware en regardant la datasheet (chapitre special features)

    a+

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

    Re : piloter un moteur DC depuis un pic 18F4455

    Salut

    navré effectivement je n'ai pas répondu à ta question alors ce pic est muni d'un quartz interne de 8 MHz qui va ensuite sur un postscaler(pré-diviseur 8MHz à 31KHz ensuite sur un multiplexeur pour enfin finir sur un périphérique.

    avant d'attaquer le périphérique il y à les quartz secondaire et primaire qui viennent se multipléxer avec le quartz interne

    voilà
    A+

  7. #6
    RISC

    Re : piloter un moteur DC depuis un pic 18F4455

    Salut,

    Si tu utilises l'oscillateur interne, il ne s'agit pas d'un quartz...mais d'un oscillateur RC beaucoup moins précis (+/- 5 % su la fréquence).
    En conséquence, il faut déclarer l'oscillateur interne dans les bits de configuration du PIC18F4455 mais....

    Utilises-tu l'USB ?

    Le problème est que ce PIC est prévu pour l'USB et on doit obligatoirement choisir une horloge précise pour l'USB (horloge externe ou quartz)

    Si tu n'as AUCUN quartz externe c'est que tu n'utilises pas l'USB....mais alors pourquoi as-tu chosi ce modèle de PIC18 ??

    Peux-tu faire voir ton schéma électronique . Il faut être sur de ton schéma avant de regarder la programmation.

    a+

  8. #7
    inviteddef3cf5

    Re : piloter un moteur DC depuis un pic 18F4455

    Salut

    Concernant la déclaration des bits de registres effectivement je m'y suis attelé aujourd'hui car je ne suis pas censé l'utiliser vu que Le quartz externe me permet de fabriquer un PWM pour mesurer les signaux que m'envoie le codeur et cela afin de pouvoir compter les pulses pour générer une interruption.

    Par rapport au pic je n'utilise pas l'USB et le pic m'a été imposé

    Pour le moment je n'ai pas encore fait mon schéma

    A+

  9. #8
    invitedf66cb3b

    Re : piloter un moteur DC depuis un pic 18F4455

    Pourquoi tu utilise une interruption pour compter les pulse? Il te suffirait de:



    #define A_ENCODEUR PORTB.F0 // Définition du port

    unsigned short du_cy = 50; // Déclaration d'une variable qui sera ton rapport cyclique (dans notre exemple un rcyclyque de 50/256)
    unsigned int Codeur = 0; // Déclaration d'une variable Codeur intialisée à 0

    void PWM1_Set_Duty(unsigned short du_cy) // Déclaration de la fonction; param. entrée = la variable du rapport cyclique


    void main();

    ADCON1 =0x0F;
    TRISB = 1;

    //Lancer le PWM
    PWM1_Init(30000); // Initialisation de la fonction PWM1 à 30kHz
    PWM1_Set_Duty(du_cy); // Init la fonction qui gèrera le rapportcyclique avec la variable du_cy
    PWM1_Start(); // PWM = ON

    while(1)
    {
    while(Codeur!=4000)
    {
    while(A_ENCODEUR!=0);
    while(A_ENCODEUR!=1)
    {
    Codeur++;
    }

    }
    PWM1_Stop();

    }

  10. #9
    invitedf66cb3b

    Re : piloter un moteur DC depuis un pic 18F4455

    Après, comme dis RISC, tu dois correctement paramètrer tes registre dans l'édition de ton projet...

    Voila! A++

  11. #10
    invitedf66cb3b

    Re : piloter un moteur DC depuis un pic 18F4455

    DSL je met les commentaires



    #define A_ENCODEUR PORTB.F0 // Définition du port

    unsigned short du_cy = 50; // Déclaration d'une variable qui sera ton rapport cyclique (dans notre exemple un rcyclyque de 50/256)
    unsigned int Codeur = 0; // Déclaration d'une variable Codeur intialisée à 0

    void PWM1_Set_Duty(unsigned short du_cy) // Déclaration de la fonction; param. entrée = la variable du rapport cyclique


    void main(); // Programme principal

    ADCON1 =0x0F; //ADC = disable
    TRISB = 1; // Déclaration du PORTB en sortie

    //Lancer le PWM
    PWM1_Init(30000); // Initialisation de la fonction PWM1 à 30kHz
    PWM1_Set_Duty(du_cy); // Init la fonction qui gèrera le rapportcyclique avec la variable du_cy
    PWM1_Start(); // PWM = ON

    while(1) // Boucle infinie
    {
    while(Codeur!=4000) // Est-ce que le moteur a fait un tour ?
    {
    while(A_ENCODEUR!=0); // Si non, attendre que le PIC détecte un flanc montant
    while(A_ENCODEUR!=1)
    {
    Codeur++; // Incrémenter le nombre du codeur dès qu'une pulse est détéctée
    }

    }
    PWM1_Stop(); // Une fois le moteur a fait son tour, il s'arrête

    }

  12. #11
    inviteddef3cf5

    Re : piloter un moteur DC depuis un pic 18F4455

    Salut,

    Alors ce que vous venez de dire est absolument juste car j'utilise déjà le timer 2 pour générer directement un PWM afin de piloter une rampe d'accélération est une rampe de décélération.

    Quant à mon problème je l'ai résolu en passant outre le timer 1 et en utilisant le registre INT0 qui permet de gérer l'interruption je mets une priorité sur certains des bits puis je configure les registres INTCON et RCON.

    Donc pour résumer timer 2 rampe d'accélération
    Interruption moteur plein régime pdt. un certain nbre. de fronts + pour gérer le déplacement
    puis de nouveau timer 2 rampe de décélération

    Maintenant je dois faire pour chaque rampe une fonction et ainsi j'injecte Acceleration(); dans l'interruption avant de commencer le test sur mon flag d'overflow qui s'enclenche au moment ou j'atteints le compte de pulses désiré puis enfin j'injecte Deceleration();

    Merci
    A+

Discussions similaires

  1. piloter un moteur avec un pic
    Par invite210e4233 dans le forum Électronique
    Réponses: 12
    Dernier message: 10/07/2012, 11h07
  2. Comment piloter 2 moteur pas à pas depuis un PC
    Par invite24f28be4 dans le forum Électronique
    Réponses: 1
    Dernier message: 01/10/2009, 17h18
  3. Piloter word depuis excel
    Par inviteb6da8a8e dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 19/06/2009, 15h16
  4. piloter un moteur avec le portRS232 + PIC
    Par coeur noire dans le forum Électronique
    Réponses: 0
    Dernier message: 24/05/2009, 09h05
  5. piloter moteur pas a pas depuis port parallele
    Par Bouteille51 dans le forum Électronique
    Réponses: 14
    Dernier message: 24/10/2007, 11h07
Découvrez nos comparatifs produits sur l'informatique et les technologies.