Capacités du module EPWM
- Les sorties EpwmA epwmB peuvent fonctionner comme:
- opération à un seul bord
- fonctionnement symétrique à deux bords
- Opération asymétrique à double bord
- Le temps mort peut être configuré
- L'événement TZ peut être configuré et l'état logique des sorties HI et LO peut être défini.
- Un événement d'interruption ou un événement SOC pour l'ADC peut être configuré.
Rapprochons-nous des principaux blocs: en quoi consiste le module ePWM et à quoi il est connecté.
Comme vous pouvez le voir sur la figure, il n'y a pas beaucoup de blocs dans le module ePWM. Par conséquent, il est logique de considérer ce dont chaque module est responsable et de commencer par les signaux.
- Les signaux EPWMxA et EPWMxB sont probablement le signal de sortie le plus évident. L'état logique normal est HI ou LO, selon la configuration de l'action de sortie
- TZ1 — TZ6 — . , , , . , EPWMxA EPWMxB . , , - , , . . , .
- EPWMxSYNCI EPWMxSYNCO — , , .
- Signaux EPWMxSOCA et EPWMxSOCB - ici, tout est plus que clair à partir du nom. Ces événements peuvent définir des événements SOC pour l'ADC.
- Signaux EPWMxTZINT et EPWMxINT - ici un événement d'interruption sur TZ et sur des événements liés au PWM lui-même, par exemple, générant une interruption sur la période PWM.
Passons maintenant aux
modules de base de temps (TB) - le module est responsable de l'heure d'événement de chaque module ePWM. Nous n'entrerons pas dans tous les paramètres de ce module, je pense qu'il suffit de faire attention au fait qu'il existe 3 modes de fonctionnement du compteur:
- Mode comptage décroissant
- Mode comptage
- Mode décomptage
Et il existe également un paramètre de synchronisation de la minuterie en définissant le
module de bits de comparaison de compteur TBCLKSYNC (CC) - à travers lui, nous définissons simplement notre cycle de service.
Module Action-Qualifier (AQ) - à travers lui, vous pouvez configurer l'état d'un événement. Et pour les sorties, vous pouvez configurer les actions suivantes:
- Régler sur l'état HI
- Défini sur l'état LO
- Effectuer l'inversion d'état
- Rien à faire
Module de sous - module de bande morte (DB) - ce module peut être utilisé pour définir des bandes mortes pour les canaux PWM. Ce ne sera un secret pour personne que les clés à transistor ne commutent pas instantanément, et afin d'éviter une situation où la clé du demi-pont supérieur n'a pas le temps de se fermer et que la clé inférieure est déjà ouverte, ils définissent un délai pour le passage à l'état HI et le passage plus précoce à l'état LO.
Module de sous- module de zone de déclenchement (TZ) - comme mentionné ci-dessus, ce module est associé à la gestion des situations d'urgence. Ici, nous pouvons choisir 1 des 4 actions.
- Régler sur l'état HI
- Défini sur l'état LO
- Définir l'état haute impédance
- Rien à faire
L'événement qui déclenche l'action du module TZ peut être déclenché à la fois par le logiciel et le matériel. De plus, un appel d'interruption est fourni.
Passons maintenant des mots à la pratique.
Tout d'abord, vous devez configurer GPIO pour une fonction epwm alternative
EALLOW;
// pull-up
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0x000;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0x000;
// GPIO EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0x001;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0x001;
EDIS;
Ensuite, lorsque nous avons déjà configuré le GPIO, nous pouvons procéder aux différents paramètres. Pour configurer le fonctionnement PWM, vous devez décider de ce que nous voulons obtenir. Commençons par la fréquence TBCLK. Il est déterminé par la formule:
Ici, vous devez faire attention au fait que CLKDIV est 1 par défaut, avec HSPCLKDIV tout est différent, par défaut c'est 2. Cela doit être gardé à l'esprit, car il y a des moments où les gens l'oublient. Lors du chargement d'un programme dans la RAM, souvent HSPCLKDIV = 1, respectivement, ce problème n'est pas immédiatement remarqué.
Nous avons décidé de la fréquence d'horloge de TBCLK. Mais nous devrons choisir comment le compteur fonctionnera pour nous. Par récession, en augmentant, et peut-être de cette façon et de cela, pour cela vous devez configurer le registre approprié, par exemple:
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
À l'avenir, pour que personne ne soit intimidé par les macros, nous déterminerons d'où elles viennent. Ces définitions sont définies dans un fichier appelé DSP2833x_EPwm_defines.h.
Ensuite, vous devez décider comment nos GPIO réagiront pour atteindre certaines valeurs TBCTR. Il y a plus qu'assez d'options. Ils sont présentés dans le tableau ci-dessous:
Ensuite, vous devez décider du comportement que nous voulons des ports A et B, à savoir, nous voulons qu'ils soient connectés les uns aux autres ou qu'ils puissent fonctionner indépendamment. Si nous voulons que le port A soit le maître, alors nous écrivons simplement les actions pour lui, par exemple (cas du comptage):
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
si nous voulons l'indépendance pour le deuxième port, alors ajoutez:
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
Pour plus de détails sur les paramètres, vous devez vous référer à l'image ci-dessus pour un seul ajout, il y a un peu plus de registres AQCTLA que ce qui est indiqué dans le tableau, cela ne change pas beaucoup l'image, mais seules des précisions sont introduites concernant le cas où le compteur a atteint la valeur souhaitée, par exemple, lors du comptage dans haut ou compte à rebours. Plus brièvement sur les bits peuvent être trouvés dans la coupe du fichier système .h
struct AQCTL_BITS { // bits description
Uint16 ZRO:2; // 1:0 Action Counter = Zero
Uint16 PRD:2; // 3:2 Action Counter = Period
Uint16 CAU:2; // 5:4 Action Counter = Compare A up
Uint16 CAD:2; // 7:6 Action Counter = Compare A down
Uint16 CBU:2; // 9:8 Action Counter = Compare B up
Uint16 CBD:2; // 11:10 Action Counter = Compare B down
Uint16 rsvd:4; // 15:12 reserved
};
Si nous avons 2 ports ePWM qui fonctionnent indépendamment et que nous voulons définir le temps mort, nous devons définir le registre sur l'état souhaité, par exemple:
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
Maintenant que nous avons décidé de la description de la périphérie, nous pouvons passer à des exemples spécifiques.
Configuration d'ePWM en mode de comptage
Voici un exemple sans temps mort et les ports A et B fonctionnent indépendamment. Lorsque A est actif, B est inactif.
EPwm1Regs.TBPRD = 150000 / 5; // . 150 / 5000
// 50%
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;
EPwm1Regs.TBPHS.half.TBPHS = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
Sur l'oscillogramme, vous pouvez voir le résultat obtenu:
Vous pouvez maintenant essayer d'ajouter du temps mort, pour cela, nous ajoutons:
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.all = BP_ENABLE + POLSEL_ACTIVE_HI_CMP; // db
EPwm1Regs.DBFED = 300; // = 150 * 2 = 300
EPwm1Regs.DBRED = 300;
Le temps mort est compté de la même manière que la fréquence, selon la formule:
Et maintenant nous avons le temps mort comme nous le voulions.
Et si nous devons délier les ports A et B? Cela a également lieu. Tout est simple ici. Nous revenons au premier exemple et supprimons les 4 dernières lignes, et écrivons chaque rapport cyclique dans les registres suivants.
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2; // 50%
EPwm1Regs.CMPB = EPwm1Regs.TBPRD / 3; // 33%
Maintenant, nous avons une telle image. Vous pouvez définir le cycle de service pour chaque canal séparément.
Pour le mode de désintégration, tout est à peu près identique. Il y a une différence avec le compte à rebours en mode haut-bas. Ici, la fréquence de cale est calculée à l'aide de la formule:
La même chose est vraie pour le temps mort.
La seule chose importante qui n'a pas été prise en compte est probablement le paramètre TZ, eh bien, revenons maintenant un peu plus en détail sur ce module.
Pour déclencher par programmation un événement d'alarme, il suffit de configurer les registres suivants:
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
L'alarme PWM peut être appelée et réinitialisée à l'aide des commandes suivantes:
//
EALLOW;
EPwm1Regs.TZFRC.bit.OST = 0x001;
EDIS;
//
EALLOW;
EPwm1Regs.TZCLR.bit.OST = 0x0001;
EDIS;
Si nous voulons appeler le signal TZ dans le matériel, alors tout est encore plus facile, via le registre TZSEL, nous définissons le TZ dont nous avons besoin, mais en plus de cela, nous devons configurer le GPIO sur TZ.
Conclusion
Si quelqu'un trouve cet article intéressant, alors je peux écrire quelques articles de plus d'une manière plus ou moins accélérée. Je prévois de considérer le module can, je voudrais dma, et peut-être que j'écrirai aussi un petit article sur IQMath de ti avec leurs bibliothèques.