Ordinateurs

Comment générer PWM sur dspic30f et dspic33f

L’auteur a terminé son projet d’ingénierie de dernière année avec les microcontrôleurs dsPic, acquérant ainsi une connaissance approfondie de ces dispositifs.

Le dspic30f4011 étant programmé avec PicKit 2.

Le dspic30f4011 étant programmé avec PicKit 2.

Que sont dspic30f et dspic33f ?

Les microcontrôleurs des séries dspic30f et dspic33f sont des processeurs 16 bits avancés de microchip qui peuvent être utilisés pour une variété d’applications PWM. Ce guide pas à pas vous apprendra comment configurer les modules PWM dans le dspic pour obtenir la sortie PWM souhaitée.

Cet exemple de code peut être utilisé pour initialiser tous les registres et bits de configuration requis pour obtenir la sortie PWM souhaitée.

Exemple de code PWM pour dspic30f et dspic33f

void PWM_Init( void )
{
    TRISE = 0x00; // make sure PWM pins are set to be outputs
    PORTE = 0x00; // clear the outputs 

    PTCONbits.PTOPS = 1; // PWM timer post-scale
    PTCONbits.PTCKPS = 0; // PWM timer pre-scale
    PTCONbits.PTMOD = 2; // PWM operates in Up-down Mode continuously

    PTMR = 0; // PWM counter value, start at 0

    PTPER = 19999; // PWM Timebase period

    PWMCON1bits.PMOD3 = 0; // PWM in complimentary mode
    PWMCON1bits.PMOD2 = 0; // PWM in complimentary mode
    PWMCON1bits.PMOD1 = 0; // PWM in complimentary mode
    PWMCON1bits.PEN3H = 1; // PWM High pin is enabled
    PWMCON1bits.PEN2H = 1; // PWM High pin is enabled
    PWMCON1bits.PEN1H = 1; // PWM High pin is enabled
    PWMCON1bits.PEN3L = 1; // PWM Low pin enabled (direction control later?)
    PWMCON1bits.PEN2L = 1; // PWM Low pin enabled (direction control later?)
    PWMCON1bits.PEN1L = 1; // PWM Low pin enabled (direction control later?)

    //PWMCON2 = 0x0000; // PWM update info

    DTCON1bits.DTAPS = 0;  //DeadTime pre-scaler
    DTCON1bits.DTA = 59;   //DeadTime value for 4 us. 

    //FLTACON = 0x0000; // Fault A Control

    //OVDCON = 0x0000; // Override control info

    // Duty Cycle has a max value of 2xPeriod since output  
    // can change on rising or falling edge of Tcy
    PDC1 = 19999; // PWM#1 Duty Cycle register (11-bit)
    PDC2 = 19999; // PWM#2 Duty Cycle register (11-bit)
    PDC3 = 19999; // PWM#3 Duty Cycle register (11-bit)

    PTCONbits.PTEN = 1; // Enable PWM Timerbase!
}

Registres importants utilisés pour l’initialisation PWM dans dspic

RegisterFonction

PTPER

Le registre de période de temps PWM contient la valeur de base de temps.

PDC

Le registre de rapport cyclique PWM contient la valeur du rapport cyclique.

PTCON

Les registres de configuration PWM ont des bits de configuration.

PTCON1

Les registres de configuration PWM ont des bits de configuration.

DTCON1

Registre de configuration des temps morts.

PTMR

Celui-ci est généralement mis à zéro.

1 : Sélectionnez le mode de fonctionnement PWM

Cela se fait à l’aide des bits de configuration PTMOD dans le registre PTCON, comme indiqué à la ligne 8 de notre code.

Mode PTMOD

11

Mode Up/Down continu avec interruptions pour double mise à jour PWM

dix

Mode de comptage/décomptage continu

01

Mode événement unique

00

Mode de fonctionnement libre

2 : Calculer la période de base de temps PWM

La période de base de temps PWM peut être calculée à l’aide de la formule ci-dessous :

Formule de calcul de la période de base de temps PWM.

A lire aussi :  Comment utiliser la fonction RAND dans Excel

Formule de calcul de la période de base de temps PWM.

Où:

1 / Tcy = 4 / ( Fréquence de l’oscillateur * PLLx )

Calculons cela pour une période de base de temps de 1 ms. La fréquence de l’oscillateur est de 10 MHz et la PLL est réglée sur x8.

Calcul pour une période de base de temps de 1 ms.

Calcul pour une période de base de temps de 1 ms.

La résolution de PTPER donne une valeur de 19 999 qui est ensuite chargée dans le registre PTPER à la ligne 12.

  • PTPER peut être chargé avec une valeur maximale de 32 768.
  • Si la valeur calculée est supérieure à cela, le pré-échelleur doit être ajusté.

3 : Calculer la valeur du cycle de service

La valeur du rapport cyclique est calculée à l’aide de la même formule que celle utilisée pour le calcul de la valeur de base de temps (PTPER), sauf qu’à la place de la période de base de temps, le temps élevé requis de l’impulsion est conservé. Après avoir résolu pour PTPER, la réponse est :

Faites défiler pour continuer

  1. Multiplié par 2 et
  2. Chargé dans le registre PDC, comme indiqué à la ligne 35.

Dans cet exemple, pour un rapport cyclique de 50 %, 0,5 ms est conservé à la place de 1 ms dans la formule donnée ci-dessus. La résolution de PTPER donne 9 999. La valeur chargée dans le registre PDC est 19 999.

La sortie PWM obtenue avec cette configuration est illustrée ci-dessous :

PWM aligné sur les bords en mode de fonctionnement libre.  Période = 1 ms, rapport cyclique = 50 %.

PWM aligné sur les bords en mode de fonctionnement libre. Période = 1 ms, rapport cyclique = 50 %.

PWM en mode comptage-décomptage

Le mode comptage-décomptage donne un PWM qui est aligné au centre. Ceci est particulièrement utile dans les applications de contrôle vectoriel.

  • Dans ce mode, la base de temps PWM est le double de celle calculée pour le mode d’exécution libre. Par exemple PTPER = 19 999 donnera une période de 2 ms au lieu de 1 ms.
  • Il en va de même pour les valeurs de rapport cyclique dans les registres PDC.
PWM centré avec période = 2 ms et rapport cyclique = 50 %.

PWM centré avec période = 2 ms et rapport cyclique = 50 %.

PWM en mode gratuit

Le mode gratuit est une caractéristique unique des séries dspic30f et dspic33f. Il nous permet de configurer deux canaux PWM en mode complémentaire de sorte que la sortie d’un canal soit exactement opposée à l’autre canal.

Pour le configurer,

  • Le bit PMOD dans le registre PTCON1 doit être écrit avec un zéro, comme mentionné à la ligne 14–16.
PMODMode

0

Mode gratuite

1

Mode indépendant

  • Le bit d’activation haut PWM ou PENxH et le bit d’activation bas PWM correspondant PENxL doivent être écrits avec un, comme indiqué aux lignes 17 à 22.
PWM aligné au centre en mode complémentaire.

PWM aligné au centre en mode complémentaire.

Insertion de temps mort dans dspic

Lorsque le PWM est configuré en mode complémentaire, un temps mort peut être facilement inséré entre les deux canaux complémentaires en configurant le registre DTCON1.

  • Le bit DTAPS est utilisé pour sélectionner le prédiviseur de temps mort.
  • DTA est chargé avec une valeur entière de 6 bits pour déterminer la durée du temps mort à insérer. Il peut être calculé à partir de la même formule de calcul de la valeur PTPER, donnée ci-dessus.
  • Puisqu’il ne s’agit que d’une valeur de 6 bits, elle ne peut pas être supérieure à 64. Si une valeur supérieure survient après le calcul, le prédiviseur doit être ajusté.
  • La ligne 27 montre une valeur de 59 calculée pendant 4 microsecondes, en maintenant le prédiviseur à zéro.
4 us de temps mort inséré entre deux canaux complémentaires.  (La sonde du canal bleu affiche une réponse un peu lente car elle était bon marché !)

A lire aussi :  Revue et points de repère du refroidisseur de processeur Noctua NH-L9a-AM4

4 us de temps mort inséré entre deux canaux complémentaires. (La sonde du canal bleu affiche une réponse un peu lente car elle était bon marché !)

L’interruption PWM dans dspic30f et dspic33f

Une interruption PWM est disponible dans les dspic30f et dspic33f qui peuvent être déclenchées à divers endroits pendant le cycle PWM.

ModePoint où l’interruption est déclenchée

Mode de comptage-décomptage continu avec interruptions pour double mise à jour

Au début et à la fin de chaque cycle PWM. Postscaler n’a aucun effet dans ce mode.

Mode de comptage continu

Au début de chaque cycle PWM.

Mode événement unique

A la fin de chaque cycle PWM. (Lorsqu’une correspondance de comparaison se produit entre PTPER et PTMR.) Le détartreur n’a aucun effet dans ce mode.

Mode de fonctionnement libre

A la fin de chaque cycle PWM. (Lorsqu’une correspondance de comparaison se produit entre PTPER et PTMR)

Pour activer une interruption PWM, le bit PWMIE du registre IEC2 doit être défini sur 1.

void Interrupt_Init( void )
{
    IEC2bits.PWMIE = 1;  
}

Voici le code standard de la fonction d’interruption PWM qui sera appelée lorsque l’interruption est déclenchée.

void __attribute__((interrupt, auto_psv)) _PWMInterrupt( void )               
{
    //your code here
    IFS2bits.PWMIF = 0;
}
    

Plus d’informations sur les interruptions peuvent être trouvées dans ce tutoriel détaillé : Comment utiliser les interruptions dans les microcontrôleurs Pic.

Postscaler d’interruption PWM

Un postscaler peut être utilisé pour réduire la fréquence de déclenchement d’interruption. Par exemple, il peut être configuré pour se déclencher tous les 1, 2, 4 ou 8 cycles PWM, selon les bits PTOPS dans le registre PTCON, comme indiqué à la ligne 6 de notre code de référence.

Cet article est exact et fidèle au meilleur de la connaissance de l’auteur. Le contenu est uniquement à des fins d’information ou de divertissement et ne remplace pas un conseil personnel ou un conseil professionnel en matière commerciale, financière, juridique ou technique.

questions et réponses

Question: J’essaie d’obtenir un mode complémentaire pour une sortie PWM en utilisant le programme de référence, dspic30f4011 et Pickit 3. La seule chose que j’ai incluse est les bits de configuration pour la sélection de fréquence interne et le compilateur c, mais je ne peux obtenir aucune sortie au PWM1 broche?

Réponse: Parfois, lorsque vous changez les bits de configuration, le microcontrôleur cesse de fonctionner, et je veux dire par là, lorsque l’oscillateur ne fonctionne pas correctement, votre code ne commencera pas à s’exécuter.

Ainsi, afin de confirmer que votre contrôleur a choisi la bonne configuration d’oscillateur, vous devez inclure un code de clignotement de LED dans tous vos codes afin de confirmer que le contrôleur est sous tension et fonctionne.

© 2017 StormsHalted

StormsHalted (auteur) de Pullman, Washington, États-Unis le 02 août 2019 :

Chaque fois que vous essayez de télécharger un nouveau programme après avoir changé les bits de configuration, gardez un code clignotant LED dans la boucle de sorte que si la LED clignote, vous saurez que le code s’exécute correctement et que le problème vient de la partie pwm du code. Alors essayez d’abord, peut-être que votre code ne s’est pas exécuté du tout.

A lire aussi :  Comment utiliser la fonction AVEDEV dans Excel pour Mac

Nicolas Maina le 02 août 2019 :

J’ai essayé de générer une sortie pwm1 en mode complémentaire en utilisant dspic30f4011 et Pickit3 (compilateur c) avec le programme de référence. J’ai seulement ajouté les bits de configuration. Le programme téléchargé dans le pickit mais n’a pu obtenir aucune sortie. Existe-t-il une autre ligne de code qui devrait être ajouté au programme de référence ?

gaston le 22 octobre 2018 :

Merci beaucoup!

StormsHalted (auteur) de Pullman, Washington, États-Unis le 29 septembre 2018 :

Pour cela, vous devrez utiliser l’interruption PWM. Assez de détails sont donnés dans l’article.

rakesh le 26 septembre 2018 :

Bonjour

J’essaie de générer un rapport cyclique pwm (50%) mais la fréquence doit varier en fonction de la fréquence d’entrée (l’onde carrée est entrée). Comment mettre à jour le registre ptper, en fonction de la fréquence d’entrée.

StormsHalted (auteur) de Pullman, Washington, États-Unis le 06 juillet 2018 :

Deux façons de le faire :

1) Modifiez la valeur du registre pdc après un intervalle de temps défini.

2) Utilisez l’interruption pwm pour écrire une nouvelle valeur dans le registre pdc après chaque cycle ou deux cycles ou peut-être plus.

hossein le 24 avril 2018 :

J’ai essayé de comprendre à partir de la fiche technique mais je n’ai pas pu. merci pour ce post utile.

électronique le 05 novembre 2017 :

Salut! J ai exactement le même problème. quelqu’un pourrait-il nous aider ???

quelqu’un le 25 octobre 2017 :

Bonjour, j’essaie de compiler ce programme pour mon dspic30f2020. J’ai déjà déclaré les fusibles et tout, mais une fois que j’essaie de le compiler, il me montre une erreur indiquant que PTCONbits et PWMCONbits ne sont pas définis. Comment puis-je le résoudre? Merci pour votre temps

StormsHalted (auteur) de Pullman, Washington, États-Unis le 10 septembre 2017 :

Le PWM complémentaire peut être généré sur deux broches agissant comme des paires complémentaires. Plus d’informations sont données dans l’article.

en ligne79 le 10 septembre 2017 :

Merci StormsHalted, votre message est très utile. Monsieur, s’il vous plaît aidez-moi à générer 2 pwm à n’importe quelle broche dans dsPIC33 avec un angle de phase de 180 avec un rapport cyclique réglable.

VENKATESWARAN le 24 avril 2017 :

Bonjour StormsHalted,

Merci d’avoir posté ce code, je veux apprendre dspic. pouvez-vous me dire le nom de l’ebook.

StormsHalted (auteur) de Pullman, Washington, États-Unis le 19 avril 2017 :

La fréquence de l’oscillateur est la fréquence de l’entrée d’horloge du contrôleur. Il peut être dérivé d’un oscillateur externe ou interne. PLL est le multiplicateur de fréquence d’horloge. Si par exemple c’est x4, la fréquence de l’oscillateur est multipliée par 4 pour donner la fréquence d’horloge réelle qui est utilisée pour piloter le contrôleur.

Hafez Idris le 18 avril 2017 :

Bonjour StormsHalted,

Merci d’avoir posté ça, ça m’aide beaucoup. pouvez-vous s’il vous plaît m’expliquer ce qu’est réellement la fréquence de l’oscillateur et la PLL et comment devrais-je savoir combien sont ma PLL et la fréquence de l’oscillateur? et je vous serais reconnaissant si vous pouviez télécharger une photo et des explications sur le matériel (pickit et dspic) et sur la manière de le connecter. Désolé pour la mauvaise question, je suis gentiment un débutant dans cette partie.

Dans l’attente de votre réponse monsieur et merci.

Bouton retour en haut de la page