Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Capture PIC18f



  1. #1
    DEGK

    Capture PIC18f


    ------

    Bonsoir,

    Je cherche à développer un régulateur de vitesse pour un moteur 24 DC.

    La variation de la vitesse est faite par une PWM et je reçois en sortie d'un capteur hall une impulsion tous les tours. Mon hardware fonctionne, mais je n'arrive pas à utiliser le capture (CCP2) de mon pic 18f4520.

    J'ai fouillé le datasheet, mais je ne trouve nulle par la solution pour déclencher une interruption à chaque tour ...

    En espérant que vous arriverez à m'aider, je vous souhaite une bonne soirée

    -----

  2. Publicité
  3. #2
    nornand

    Re : Capture PIC18f

    selon la vitesse de rotation ( il faudrait l'indiquer ) tu generes des interrruptions en permnence et celles si non pas la temps d'etre traitées .
    tu as bien sur verifier que ton capteur transmet bien l'interuption au pic ?

  4. #3
    Lytharan

    Re : Capture PIC18f

    Je ne me souvient pas en détails mais pour les PIC tu as 4 choses :

    1) Configuré activer l'interrupt en question (dans le registre du module en question).
    2) Activer les interrupt de façon générale.
    3) Traiter les flags quand les interupt arrivent (à savoir le uC saute à l'adresse 0x4 mais tu dois définir quel interrupt a été déclenché).
    4) Gérer le bon interrupt et reset les flags.

    Ca fait trop longtemps que je n'y a pas toucher, d'autre t'aiderons plus en détails

  5. #4
    RISC

    Re : Capture PIC18f

    Salut,

    Le mode capture permet de :
    1/ mesurer une période ou un pulse
    2/ d'avoir une interruption à chaque front montant ou descendant

    Pour le PIC18F4520 c'est l'unité CCP en mode Capture. Il faut activer l'interruption du mode capture.

    Je pense qu'il existe un exemple de code du mode capture pour les PIC18 ici : http://www.microchip.com/codeexamples

    Tu peux aussi chercher dans les tutoriels en français sur ce site : http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm


    a+
    Ma marotte ? les microcontrôleurs ;=)

  6. #5
    CEDES

    Re : Capture PIC18f

    Bonsoir,

    une idée

    L'idéal serait d'utilisé un timer compteur pour compté les impulsions de la sonde hall genre TMR0, utilisé un autre timer pour générer des interruptions périodique toute les secondes ou toutes les 100 millisecondes pour calculé la vitesse de rotation et réinitialisé tmr0, genre tmr3, puis ajusté le PWM en fonction de la consigne souhaité.

  7. A voir en vidéo sur Futura
  8. #6
    RISC

    Re : Capture PIC18f

    Bonsoir Cedes
    Citation Envoyé par CEDES Voir le message
    L'idéal serait d'utilisé un timer compteur pour compté les impulsions de la sonde hall genre TMR0, utilisé un autre timer pour générer des interruptions périodique toute les secondes ou toutes les 100 millisecondes pour calculé la vitesse de rotation et réinitialisé tmr0, genre tmr3, puis ajusté le PWM en fonction de la consigne souhaité.
    Il ne faut surtout PAS faire cela. Le moyen le plus précis de mesurer une période ou un pulse est sans aucun doute l'unité CCP car c'est le signal externe lui-même qui génére la capture donc l'erreur est minimum. De plus il existe un mode pour mesurer 4 périodes ou 16 périodes de façon à "moyenner" le signal externe s'il y a un peu de jitter.
    De plus l'unité CCP est une unité hardware qui libère le processeur pour faire d'autre taches ;=)

    a+
    Ma marotte ? les microcontrôleurs ;=)

  9. Publicité
  10. #7
    DEGK

    Re : Capture PIC18f

    Bonjour,

    Merci beaucoup pour vos réponse =).

    J'avais aussi pensé utiliser un timer que j'active à la fréquence désirée ( 1728 t/min ou 28.8Hz ), mais un de mes professeurs m'a dit qu'il fallait utiliser le capture du PIC.

    Donc j'ai été regarder le datasheet, j'ai connecté la sortie de mon capteur hall ( qui fonctionne très bien et sans perturbation ) sur la pin CCP2 du pic ( RC1 ).

    Mais mon gros problème est que je ne sais vraiment pas comment programmer ce capture ... je connais les interruptions timer et externe, la PWM, mais pas le capture...

    Est-ce possible d'avoir le code de base ? parce que j'ai regardé sur http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm et je trouve le code :

    // mesure de période sur CCP1 (RC2) (TIMER1 et fonction capture) (fichier itcapt.c)
    // initxlcd.c doit être compilée dans le projet pour la gestion de l’afficheur LCD
    #include <p18f452.h>
    #include <xlcd.h>
    #include <stdio.h>
    unsigned int duree=5555; // représente le comptage entre 2 fronts
    char maj=1; // indique qu'une nouvelle mesure est prête
    // sous programme d'interruption
    #pragma interrupt itcomp
    void itcomp(void)
    {
    unsigned static int ancien;
    if(PIR1bits.CCP1IF) // l'IT provient d'une capture
    {
    duree=CCPR1;
    maj=1; // nouvelle mesure pr^te
    }
    PIR1bits.CCP1IF=0; //efface le drapeau d'IT
    }
    #pragma code interruption=0x8
    void ma_fontion (void)
    {
    _asm goto itcomp _endasm
    }
    #pragma code
    void main(void)
    {
    // configure PORTC CCP1
    DDRCbits.RC2=1; // RC2/CCP1 en entree
    // configure le TIMER1
    T1CONbits.RD16=0; // TMR1 mode simple (pas de RW)
    T1CONbits.TMR1CS=0; // compte les impulsions sur internal clock
    T1CONbits.T1CKPS1=1; // prédiviseur =1/8 periode sortie = 8uS
    T1CONbits.T1CKPS0=1;
    T1CONbits.T1SYNC=1; // pas de synchronisation sur sleep/Reset
    T1CONbits.TMR1ON=1; // TMR1 Activé
    // configure le mode capture sur le TIMER1 avec IT sur CCP1
    T3CONbits.T3CCP2=0; // mode comparaison entre TMR1 et CCPR1
    CCP1CON=0x05; // capture mode sur fronts montants
    PIE1bits.CCP1IE=1; // active IT sur mode capture/comparaison CCP1
    RCONbits.IPEN=1; // Interruption prioritaires activées
    INTCONbits.GIE=1; // Toutes les IT démasquées autorisées
    OpenXLCD(FOUR_BIT & LINES_5X7 );
    gotoxy(0,0);
    fprintf(_H_USER,"ccp1= ");
    while(1)
    {
    if (maj) {
    gotoxy(8,0);
    fprintf(_H_USER,"%u " ,duree);
    maj=0;
    }
    }
    }
    Je ne comprends pas le #pragma, et si le 0x8 dans "#pragma code interruption=0x8" est l'adresse ou ce produit l'interruption, alors dans quelle adresse ce produit celle de CCP2 ?

    En espérant avoir été assez précis, je vous souhaite une bonne journée

  11. #8
    CEDES

    Re : Capture PIC18f

    Bonsoir,

    la méthode de capture fait plus propres c'est vrais...

    #pragma interrupt itcomp signifie que itcomp est une routine d'interruption et non une classique.

    #pragma code interruption=0x8
    void ma_fontion (void)
    {
    _asm goto itcomp _endasm
    }

    positionne l'instruction "goto itcomp" à l'adresse 0x08 dans la mémoire programme, donc au vecteur d'interruption
    voire manuel du compilateur C18

    un événement de capture va généré une interruption en mettant PIR1bits.CCP1IF à 1 qu'il faut remettre à 0 dans la routine d'interruption, sinon on n'en sort plus.

    dans la routine principale c'est de la config des registres du PORTC, du timer 1 et 3, des interruptions, du module de capture ccp, indispensable au fonctionnement, voire datasheet pour le fonctionnement du pic.

  12. #9
    RISC

    Re : Capture PIC18f

    Salut DEGK,

    Les PIC18 ont 2 vecteurs (dans le mode PRIORITY).
    Il faut donc tester quand tu entres dans l'interruption les différents flags pour savoir celui qui est l'auteur de l'interruption ;=)
    Si tu utilises CCP1 ET CCP2, l'ordre de test déterminera la priorité.

    Si tu utilises CCP2 le flag à tester est CCP2IF (et pas CCP1IF)

    a+
    Ma marotte ? les microcontrôleurs ;=)

  13. #10
    DEGK

    Re : Capture PIC18f

    Re bonjour !

    Merci RISC, mais en recherchant un peu sur le web, je suis parvenu à trouver ce code :

    Interruption :
    #INT_CCP2
    void ccp2_isr(void)
    {
    disable_interrupts(INT_CCP2);

    current_ccp = (CCP_2_HIGH*256) + CCP_2_LOW;
    isr_ccp_delta = (current_ccp - old_ccp);
    old_ccp = current_ccp;
    TMR1L = 0;
    TMR1H = 0;


    enable_interrupts(INT_CCP2);

    }

  14. #11
    DEGK

    Re : Capture PIC18f

    et l'initialisation :
    setup_ccp2(CCP_CAPTURE_RE);
    CCP_2 = get_timer1();
    enable_interrupts(INT_CCP2);

    enable_interrupts(GLOBAL);
    J'ai testé et le principe fonctionne. Après il reste à déterminer le temps en fonction des valeurs de CCP2L et CCP2H, mais cela ne doit pas me poser beaucoup de problème ...

    Tu pense que ce code est fonctionnel ? Je l'ai un peu modifier de sa version d'origine ...

    Merci et Bonne journée RISC

  15. #12
    RISC

    Re : Capture PIC18f

    Salut,

    Deux points à voir dans ton programme :

    a/ en C il vaut mieux toujours décaler à gauche ou à droite plutôt que de multiplier ou diviser lorsque l'on utilises des puissances de 2 car c'est beaucoup plus rapide (les bons compilateurs reconnaissent cela tout seul) ;=)
    Donc préferres current_ccp = (CCP_2_HIGH<<8) + CCP_2_LOW à current_ccp = (CCP_2_HIGH*256) + CCP_2_LOW;

    b/ Il faut faire TRES attention à l'écriture et à la lecture des TIMERS 16 bits :
    il faut TOUJOURS en mode lecture, lire d'abord le poids faible (exemple : TMR1L) avant le poids fort
    En écriture c'est l'INVERSE, il faut toujours écrire le poids fort AVANT le poids faible

    Sans quoi tu auras des problèmes.

    Dans ton interruption il faut donc écrire :
    Code:
          TMR1H = 0;
          TMR1L = 0;
    et surtout toujours configurer les TIMERS 16 bits ( registre T1CON) en mode 16bits (pas 8 bits!).

    Tu as apparemment changé de compilateur ????

    Ton code est incorrect.
    a/ ne jamais toucher aux autorisations d'interruptions dans la routine d'interruption :
    retire les lignes :
    disable_interrupts(INT_CCP2);
    et
    enable_interrupts(INT_CCP2);
    dans la routine d'interruption (si j'ai bien compris ton compilateur)

    b/ toujours remettre à 0 le flag qui a provoqué l'interruption dans l'interruption
    (j'ai déjà évoqué cela plus haut)

    Si tu utilises le compilo CCS (j'aime personnellement pas du tout) utilises leurs librairies pour faire ce que j'ai expliqué

    a+
    Ma marotte ? les microcontrôleurs ;=)

  16. Publicité
  17. #13
    DEGK

    Re : Capture PIC18f

    Salut,

    J'ai bien modifié les choses que tu m'as dites.

    Et oui, j'utilise bien le CCS C Compiler. Mon école l'utilise et j'y suis habitué ...

    Merci pour tes précieuses informations !!!

    A+

Sur le même thème :

Discussions similaires

  1. pic18f
    Par guillaume25 dans le forum Électronique
    Réponses: 1
    Dernier message: 31/05/2011, 22h27
  2. pic18f
    Par nirvo dans le forum Électronique
    Réponses: 10
    Dernier message: 01/07/2010, 10h15
  3. Timer pic18f
    Par nirvo dans le forum Électronique
    Réponses: 13
    Dernier message: 12/05/2010, 06h03
  4. PIC18F et ADC
    Par boutboutnico dans le forum Électronique
    Réponses: 5
    Dernier message: 04/02/2009, 12h43
  5. Pic18f Adc
    Par twistwind dans le forum Électronique
    Réponses: 1
    Dernier message: 28/07/2006, 15h43
Découvrez nos comparatifs produits sur l'informatique et les technologies.