Partage
  • Partager sur Facebook
  • Partager sur Twitter

Période maximale PWM insuffisante

PIC18 et langage C

Sujet résolu
    13 août 2012 à 23:03:35

    Bonjour,

    Je suis en train d'expérimenter quelques fonctionnalités d'un micro-contrôleur PIC18F2520 de Microchip afin de me familiariser avec ce type de composants.

    Je programme en C et j'ai dernièrement mis en oeuvre le module de PWM du PIC, auparavant j'ai configuré le composant pour qu'il fonctionne avec son oscillateur interne de 8MHz.

    Malheureusement, je me suis rendu compte que la période maximale du signal généré est relativement petite. En effet, d'après les formules de la documentation et l'oscilloscope, la période maximale du signal PWM, que je peux obtenir dans ma configuration, est de l'ordre de 2 millisecondes. Or, je souhaitais utiliser ce signal pour commander un servomoteur; une opération qui nécessite une période de 20ms et des impulsions de l'ordre de la milliseconde.

    J'aimerais donc savoir si parmi les membres de ce forum certains connaissaient un moyen d'augmenter la période la PWM. L'idéal serait que j'ai loupé une option de configuration du PIC qui me permette de diviser davantage la fréquence de la PWM, le cas échéant je me tournerai vers des boucles dans le programme mais mon but est d'en apprendre plus donc si je pouvais éviter les trucs & astuce...

    Cordialement,
    Morgus.

    P.S : Ci-dessous, les parties de mon code susceptibles d'intéresser les intéressés.
    #include <p18cxxx.h>
    
    /* bits de configuration */
    #pragma config OSC = INTIO7		// Oscillateur interne, Fosc/4 -> RA6, RA7 port normal
    #pragma config MCLRE = ON		// Pin reset activée
    #pragma config LVP = OFF		// Low Voltage Programming désactivé => RB5 I/O normale
    #pragma config PBADEN = OFF		// PORTB<4> and PORTB<1:0> Configured as Digital I/O Pins on Reset
    #pragma config DEBUG = OFF		// Débug désactivé => RB6 et RB7 normal I/O
    
    TRISCbits.RC2 = 0;                      // Sortie de la PWM
    OSCCON = 0x72;				// Horloge à 8MHz depuis le block d'horloge interne
    
    /* Configuration de la PWM (et donc du Timer2) */
    PR2 = 0xFF;                             // 8 bits de la période, ici période maximale
    CCP1CON=0x0C;                           // 2 bits (bit 4 et bit 5) de poids faibles du rapport cyclique
    CCPR1L=0x99;                            // 8 bits de poids forts du rapport cyclique
    T2CON=0x7F;                             // Pré-diviseur(max), post-diviseur(max), ON/off du Timer2
    
    • Partager sur Facebook
    • Partager sur Twitter
      14 août 2012 à 2:59:59

      Tu as un oscilateur 8MHz, donc une clock à 2MHz (sauf si tu as activé la PLL).
      Avec le prescaler (le postscaler ne sert pas) et le timer, tu divises par 4096, ça fait du 500Hz environs, donc ça passe pas.

      Une seule solution : baisser la fréquence d'horloge avec le postscaler de l'oscillateur interne (OSCCONbits.IRCF). Il faut la diviser par 10, mais tu ne peux faire que 8 ou 16. Tente 8, ça te fera un signal à 60Hz au lieu de 50, mais ton servo l'acceptera surement. En plus ca te fera plus de précision dans la plage de rapport cyclique utile. Si ça ne marche pas, passe à 16, je te confie le reste des calculs.
      • Partager sur Facebook
      • Partager sur Twitter
      64kB de mémoire, c'est tout ce dont j'ai besoin
        16 août 2012 à 14:14:28

        Ou sinon à l'ancienne, tu émules tes signaux en les créant toi-même avec un timer du µc. Perso je faisai ca sur les 18F252 et 18F452, un gros avantage est que ca te permet d'utiliser plusieurs servo avec un seul timer (sur 20ms tu peux caler jusqu'à 10 fois 2ms, donc 10 servo ;) ). Ca demande par contre de programmer une belle machine à état ;)
        • Partager sur Facebook
        • Partager sur Twitter

        Retrouvez moi sur mon blog et ma chaine Youtube !

          24 août 2012 à 3:30:44

          J'ai opté pour la diminution de l'horloge interne du PIC. Mais je tâcherai de faire un code comme tu le suggère Eskimon.

          Merci à vous deux.
          • Partager sur Facebook
          • Partager sur Twitter
            25 août 2012 à 0:54:28

            Sinon il y a une autre solution, qui consiste à utiliser autre chose qu'une merde de PIC18 ; tous les uC décents et pas chers de nos jours pour l'amateur (PIC32, STM32, Cortex, etc le choix ne manque pas) avec des kits de dév à 20€ embarquent une floppée de timers 32 bits et sont autrement plus puissants et pratiques à utiliser que cette chose...
            • Partager sur Facebook
            • Partager sur Twitter

            Période maximale PWM insuffisante

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown