Maison / Réseaux sociaux / Implémentation de shim à l'aide d'une interruption. Logiciel PWM (PWM). Implémentation logicielle de PWM

Implémentation de shim à l'aide d'une interruption. Logiciel PWM (PWM). Implémentation logicielle de PWM

Les appareils numériques, par exemple un microcontrôleur, ne peuvent fonctionner qu'avec deux niveaux de signal, c'est-à-dire zéro et un ou éteint et allumé. Ainsi, vous pouvez facilement l'utiliser pour surveiller l'état de la charge, comme allumer ou éteindre une LED. Vous pouvez également l'utiliser pour contrôler n'importe quel appareil électrique à l'aide des pilotes appropriés (transistor, triac, relais, etc.) Mais parfois, vous avez besoin de plus que simplement « allumer » et « éteindre » l'appareil. Ainsi, si vous souhaitez contrôler la luminosité d'une LED (ou d'une lampe) ou la vitesse d'un moteur à courant continu, les signaux numériques ne peuvent tout simplement pas le faire. Cette situation est très courante dans le numérique et est appelée Modulation de largeur d'impulsion (PWM).

Presque tous les microcontrôleurs modernes disposent d'un matériel spécialisé pour générer un signal PWM. Dans ce tutoriel, nous apprendrons les bases de la technique PWM et plus tard, nous verrons comment implémenter le PWM à l'aide de microcontrôleurs AVR.

Les appareils numériques comme un microcontrôleur ne peuvent générer que deux niveaux sur les lignes de sortie, haut = 5 V et bas = 0 V. Mais que se passe-t-il si nous voulons obtenir 2,5 ou 3,1 ou toute tension comprise entre 0 et 5 V ? Pour ce faire, au lieu de générer une tension continue constante à la sortie, nous générerons une onde carrée qui a des niveaux haut = 5 V et bas = 0 V (voir Figure 1).

Fig. 1

La figure montre que le signal reste alternativement à des niveaux bas et élevés pendant un certain temps. T0 - niveau bas, T1 - niveau haut. La période du signal sera égale à T = T0+T1. Période d'impulsion- c'est l'intervalle de temps entre deux points caractéristiques de deux impulsions adjacentes. Généralement, la période est mesurée entre deux montées ou descentes d'impulsions adjacentes et est désignée par la lettre majuscule T.

La période de répétition des impulsions est directement liée à la fréquence de la séquence d'impulsions et peut être calculée à l'aide de la formule : T = 1/F

Si la longueur d'impulsion T1 est exactement égale à la moitié de la période T, alors un tel signal est souvent appelé « onde carrée ».

Le rapport cyclique des impulsions est le rapport entre la période de répétition des impulsions et leur durée et est désigné par la lettre S : S = T/T1

Le facteur de service est une quantité sans dimension et n'a pas d'unité de mesure, mais peut être exprimé en pourcentage. Le terme se retrouve souvent dans les textes anglais Cycle de service, c'est ce qu'on appelle le cycle de service ou la valeur du cycle de service PWM. Le rapport cyclique D est l'inverse du rapport cyclique.

Facteur de remplissage généralement exprimé en pourcentage et calculé à l'aide de la formule : D=1/S ou alors D = T1/T*100 %

Dans la figure ci-dessus (Fig. 1), vous pouvez voir que T1 = T0, cela équivaut à la moitié de la période de temps. Le cycle de service PWM est donc de 50 %. Si la fréquence de ces impulsions est suffisamment élevée (disons 5 000 Hz), alors nous obtenons la moitié de 5 V, c'est-à-dire 2,5V. Ainsi, si la sortie du contrôleur est couplée au moteur (à l'aide de pilotes appropriés), il fonctionnera à 50 % de sa pleine vitesse. La technique PWM utilise ce fait pour créer n'importe quelle tension entre deux niveaux (par exemple entre 0 et 12 V). L'astuce est que lorsque la valeur du rapport cyclique change entre 0 et 100 %, nous obtenons le même pourcentage de tension d'entrée à la sortie. Vous trouverez ci-dessous quelques exemples de signaux PWM avec différents cycles de service.

Si vous installez un filtre R/C à la sortie, vous pouvez obtenir un niveau de signal DC pur plutôt que des ondes carrées. Mais cela n'est pas nécessaire pour les moteurs à balais ou pour contrôler la luminosité des LED. Pour ce faire, vous pouvez appliquer un signal PWM directement au driver (par exemple, un transistor bipolaire, MOSFET, etc.).


En mode de fonctionnement 16 bits. Par minuterie, on entend son algorithme de comptage et le comportement de la sortie du shaper d'impulsion qui lui est associé, qui est déterminé par une combinaison de bits qui spécifient le mode de fonctionnement de la minuterie (WGMn3-0) et le mode de génération du signal de sortie (COMnx1:0). . Dans ce cas, les bits permettant de définir le mode de génération du signal de sortie n'affectent pas l'algorithme de comptage, car L'algorithme de comptage dépend uniquement de l'état des bits pour régler le mode de fonctionnement du temporisateur. Dans les modes PWM, les bits COMnx1:0 permettent d'activer/désactiver l'inversion sur la sortie PWM générée (c'est-à-dire sélectionner PWM avec inversion ou PWM sans inversion). Pour les modes non PWM, les bits COMnx1:0 déterminent l'action à entreprendre lorsqu'une correspondance se produit : réinitialiser, définir ou inverser la sortie (voir également « Bloc de conditionnement du signal de sortie » et « Diagrammes de synchronisation du compteur-minuterie 16 bits ») .

Fonctionnement normal

Le mode de fonctionnement le plus simple est le mode normal (WGMn3-0 = 0b0000). Dans ce mode, le compteur fonctionne comme un compteur sommateur (incrémenté) et le compteur n'est pas réinitialisé. Le compteur déborde lors du passage par les 16 bits maximum. valeur (0xFFFF) à la limite inférieure de comptage (0x0000). Pendant le fonctionnement normal, l'indicateur de dépassement de temps-compteur TOVn sera positionné sur le même cycle d'horloge lorsque TCNTn atteint zéro.

En fait, l'indicateur de débordement TOVn est le 17ème bit du compteur, sauf qu'il est uniquement activé et non effacé. Cependant, cette propriété peut être utilisée par programme pour augmenter la résolution du temporisateur en utilisant une interruption de dépassement de temporisateur, à la suite de laquelle l'indicateur TOVn est automatiquement réinitialisé. Il n'y a pas de situations particulières pour un fonctionnement normal, un nouvel état du compteur peut donc être enregistré à tout moment.

En mode normal, vous pouvez utiliser le bloc de capture. Il faut toutefois s'assurer que l'intervalle de temps maximum entre l'apparition d'événements externes n'excède pas la période de dépassement du compteur. Si cette condition n'est pas remplie, il est nécessaire d'utiliser une interruption de dépassement de temps-compteur ou un prescaler.

Le bloc de comparaison peut être utilisé pour générer des interruptions. Il n'est pas recommandé d'utiliser la sortie OCnx pour générer des signaux en fonctionnement normal, car dans ce cas, une partie importante du temps processeur sera dépensée.

Mode de réinitialisation du minuteur de match (CTC)

En mode CTC (WGM01, WGM00 =0b10), le registre OCR0 est utilisé pour définir la résolution du compteur. Si le mode CTC est activé et que la valeur du compteur (TCNT0) correspond à la valeur du registre OCR0, le compteur est réinitialisé à zéro (TCNT0=0). Ainsi, OCR0 spécifie le nombre maximum du compteur et, par conséquent, sa résolution. Ce mode offre une plus large plage de réglage de la fréquence des impulsions rectangulaires générées. Cela simplifie également le fonctionnement du compteur d'événements externe.

En mode réinitialisation du temporisateur en mode match (WGMn3-0 = 0b0100 ou 0b1100), la résolution du temporisateur est définie par les registres OCRnA ou ICRn. En mode CTC, le compteur (TCNTn) est réinitialisé si sa valeur correspond à la valeur du registre OCRnA (WGMn3-0 = 0b0100) ou ICRn (WGMn3-0 = 0b1100). La valeur du registre OCRnA ou ICRn détermine la limite supérieure de comptage, et donc la résolution du temporisateur. Ce mode offre une plus large plage de réglage de la fréquence des impulsions rectangulaires générées. Cela simplifie également le fonctionnement du compteur d'événements externe. Le chronogramme du fonctionnement de la minuterie en mode CTC est illustré à la figure 1. Le compteur (TCNTn) incrémente son état jusqu'à ce qu'une correspondance se produise avec la valeur de OCRnA ou ICRn, puis le compteur (TCNTn) est réinitialisé.

Figure 1 – Chronogramme pour le mode STS

Lorsque la limite supérieure de comptage est atteinte, une interruption peut être générée à l'aide des indicateurs OCFnA ou ICFn correspondant aux registres utilisés pour définir la limite supérieure de comptage. Si l'interruption est activée, la routine d'interruption peut être utilisée pour mettre à jour la limite de comptage supérieure. Cependant, le réglage de la valeur maximale du comptage à proximité de la valeur limite inférieure du comptage lorsque le compteur fonctionne sans pré-échelle ou avec une petite valeur de pré-échelle doit être effectué avec une extrême prudence, car Il n'y a pas de double mise en mémoire tampon en mode CTC. Si la valeur écrite dans OCRnA ou ICRn est inférieure à la valeur actuelle de TCNTn, le compteur se réinitialise lorsque la condition de correspondance se produit lorsqu'il atteint la valeur maximale (0xFFFF), puis se réinitialise à 0x0000 et atteint la nouvelle valeur d'OCRnA ou ICRn. Dans de nombreux cas, cette situation n’est pas souhaitable. Une alternative est le mode PWM rapide, dans lequel le registre OCRnA détermine la limite supérieure de comptage (WGMn3-0 = 0b1111), car dans ce cas, OCRnA est en double tampon.

Pour générer un signal en mode CTC, la sortie OCnA peut être utilisée pour changer le niveau logique sur chaque correspondance en réglant le mode de commutation (COMnA1, COMnA0 = 0b01). La valeur OCnA sera présente sur une broche de port uniquement si la direction de sortie est spécifiée pour cette broche. La fréquence maximale du signal généré est fOC0 = fclk_I/O/2 si OCRnA = 0x0000. Pour les autres valeurs OCRn, la fréquence du signal généré peut être déterminée par la formule :

où la variable N spécifie le facteur de division du prescaler (1, 8, 32, 64, 128, 256 ou 1024).

Comme en fonctionnement normal, l'indicateur TOV0 est défini au même tick de minuterie lorsque sa valeur passe de 0xFFFF à 0x0000.

Mode PWM rapide

Le mode de modulation rapide de largeur d'impulsion (PWM) (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) est conçu pour générer des impulsions PWM de fréquence accrue. Contrairement aux autres modes de fonctionnement, celui-ci utilise un fonctionnement à compteur unidirectionnel. Le comptage est effectué dans le sens allant de la limite inférieure vers la limite supérieure de comptage.

Si un mode de sortie non inverseur est défini, lorsque TCNTn et OCRnx coïncident, le signal OCnx est défini et réinitialisé à la limite de comptage supérieure. Si le mode d'inversion est spécifié, la sortie OCnx est réinitialisée lors d'une correspondance et réglée sur la limite de comptage supérieure. En raison du comptage unidirectionnel, la fréquence de fonctionnement de ce mode est deux fois plus élevée que celle du mode PWM avec correction de phase, dans lequel le comptage bidirectionnel est utilisé. La capacité de générer des signaux PWM haute fréquence rend l'utilisation de ce mode utile dans les tâches de stabilisation de puissance, de rectification et de conversion numérique-analogique. La haute fréquence permet en même temps d'utiliser des éléments externes de petites tailles physiquement (inductances, condensateurs), réduisant ainsi le coût global du système.

La résolution PWM peut être fixe sur 8, 9 ou 10 bits ou définie par le registre ICRn ou OCRnA, mais pas moins de 2 bits (ICRn ou OCRnA = 0x0003) et pas plus de 16 bits (ICRn ou OCRnA = 0xFFFF). La résolution PWM à une valeur limite supérieure (UL) donnée est calculée comme suit :

En mode PWM rapide, le compteur est incrémenté jusqu'à ce que sa valeur corresponde à l'une des valeurs fixes 0x00FF, 0x01FF ou 0x03FF (si WGMn3:0 = 0b0101, 0b0110 ou 0b0111, respectivement), la valeur en ICRn (si WGMn3:0 = 0b1110) ou la valeur dans OCRnA (si WGMn3:0 = 0b1111), puis réinitialisée au prochain tick d'horloge de la minuterie. Le chronogramme du mode PWM rapide est présenté dans la figure 2. La figure montre le mode PWM rapide lorsque le registre OCRnA ou ICRn est utilisé pour définir la limite supérieure. La valeur TCNTn dans le chronogramme est affichée sous forme de graphique de fonction pour illustrer le comptage unidirectionnel. Le diagramme montre les sorties PWM inversées et non inversées. Une courte ligne horizontale montre les points sur le graphique TCNTn où les valeurs OCRnx et TCNTnx coïncident. L'indicateur d'interruption OCnx est défini lorsqu'une correspondance se produit.

Figure 2 – Chronogramme pour le mode PWM rapide

L'indicateur Timer-Counter Overflow (TOVn) est activé chaque fois que le compteur atteint sa limite supérieure. De plus, la même impulsion d'horloge, ainsi que l'indicateur TOVn, peuvent définir les indicateurs OCnA ou ICFn si le registre OCRnA ou ICRn est utilisé pour définir la limite supérieure, respectivement. Si l'une de ces interruptions est activée, la routine d'interruption peut mettre à jour la limite supérieure de comptage et les seuils de comparaison.

Si la valeur de la limite supérieure de comptage change, la condition doit alors être remplie selon laquelle la nouvelle valeur limite supérieure écrite est supérieure ou égale aux valeurs de tous les registres de seuil de comparaison. Sinon, une correspondance entre TCNTn et OCRnx ne se produira jamais. Notez que lors de l'utilisation de valeurs limites supérieures fixes, les bits inutilisés sont masqués à 0 lors de l'écriture dans les registres OCRnx.

Le mécanisme de modification du registre ICRn diffère de l'OCRnA lorsqu'il est utilisé pour fixer la limite supérieure. Le registre ICRn n'est pas à double tampon. Cela signifie que si une petite valeur est écrite dans ICRn alors que le compteur fonctionne avec peu ou pas de pré-échelle, il existe un risque d'écrire dans le registre ICRn une valeur inférieure à la valeur actuelle de TCNTn. En conséquence, dans cette situation, le match en tête du décompte sera manqué. Dans ce cas, le compteur atteindra sa valeur maximale (0xFFFF), redémarrera à 0x0000 et générera ensuite seulement une correspondance. Le registre OCRnA contient un système de double mise en mémoire tampon, il peut donc être modifié à tout moment.

class="eliadunit">

Si une écriture est effectuée sur l'adresse OCRnA, la valeur est en fait placée dans le registre tampon OCRnA. Si une correspondance se produit entre TCNTn et le sommet du compte, alors le cycle d'horloge suivant du temporisateur est la copie du registre tampon vers le registre de seuil de comparaison OCRnA. Le registre est mis à jour dans le même cycle d'horloge que TCNTn est réinitialisé et que l'indicateur TOVn est activé.

Il est recommandé d'utiliser le registre ICRn pour définir la limite supérieure si la limite supérieure de comptage est une constante. Dans ce cas, le registre OCRnA est également libéré pour générer un signal PWM en sortie OCnA. Cependant, si la fréquence PWM change de manière dynamique (en raison du changement de la limite supérieure), alors dans ce cas, il est plus avantageux d'utiliser le registre OCRnA pour définir la limite supérieure, car il prend en charge la double mise en mémoire tampon.

En mode PWM rapide, les unités de comparaison permettent de générer des signaux PWM sur les broches OCnx. Si COMnx1:0 = 0b10, alors PWM est défini sans inversion de sortie, et si COMnx1:0 = 0b11, alors le mode PWM avec inversion de sortie est défini (voir Tableau 59). La valeur OCnx réelle peut être observée sur la broche du port si elle est réglée sur la direction de sortie (DDR_OCnx). Le signal PWM est généré en réinitialisant (réinitialisant) le registre OCnx lorsqu'une correspondance se produit entre OCRnx et TCNTn, et en réinitialisant (réinitialisant) le registre OCnx ainsi qu'en réinitialisant le compteur (passage de la limite haute à la limite basse).

La fréquence PWM du signal de sortie pour une valeur limite supérieure (UL) donnée est déterminée par l'expression :

où N est une variable qui précise la valeur du coefficient de prédivision (1, 8, 32, 64, 128, 256 ou 1024).

L'écriture de valeurs limites dans le registre OCRnx est associée à des cas particuliers dans la génération d'impulsions PWM. Si OCRnx est réglé égal à la limite inférieure (0x0000), alors une courte impulsion apparaîtra à la sortie tous les (VP+1)ème cycle d'horloge de la minuterie. L'écriture d'une valeur égale à la limite supérieure dans OCRnx entraînera la définition d'un niveau de journalisation constant. 1 ou 0 en sortie (selon la polarité du signal de sortie sélectionnée à l'aide du bit COMnx1:0).

Si une génération d'ondes carrées haute fréquence (impulsions rectangulaires avec un rapport cyclique de 2 ou 50 % de remplissage) est requise, il est alors nécessaire d'utiliser le mode PWM rapide avec les bits COMnA1:0 = 0b01 définis, ce qui provoque le niveau logique à la sortie OCnA pour commuter (inverser) à chaque match. Ceci n'est applicable que si OCRnA est utilisé pour définir la limite supérieure (WGMn3-0 =0b1111). La fréquence d'onde carrée maximale générée dans ce cas est fOCnA = fclk_I/O/2, si OCRnA = 0x0000. Cette fonctionnalité est similaire à la commutation OCnA en mode CTC, à l'exception du double buffering, présent en mode PWM rapide.

Mode de modulation de largeur d'impulsion avec correction de phase (Phase Correct)

Le mode de modulation de largeur d'impulsion à phase corrigée (PWM FC) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 ou 0b1011) est conçu pour générer un signal PWM à phase corrigée avec une haute résolution. Le mode PWM FC est basé sur le fonctionnement bidirectionnel d'un compteur-minuterie. Le compteur passe de la limite basse (0x0000) à la limite haute, puis revient de la limite haute à la limite basse. Si le mode de sortie du shaper d'impulsion est réglé sur non inverseur, la sortie OCnx est réinitialisée/réglée lorsque les valeurs TCNTn et OCRnx correspondent pendant le comptage/décomptage. Si le mode de sortie inverseur est défini, alors, au contraire, lors du comptage direct, le réglage se produit, et lors du comptage inverse, la sortie OCnx est réinitialisée. En fonctionnement bidirectionnel, la fréquence maximale du signal PWM est inférieure à celle en fonctionnement unidirectionnel. Cependant, en raison de caractéristiques telles que la symétrie des modes PWM avec fonctionnement bidirectionnel, il est préférable d'utiliser ces modes pour résoudre les problèmes de contrôle d'entraînement.

La résolution PWM dans ce mode peut être soit fixe (8, 9 ou 10 bits), soit définie à l'aide du registre ICRn ou OCRnA. La résolution minimale est de 2 bits (ICRn ou OCRnA = 0x0003) et la résolution maximale est de 16 bits (ICRn ou OCRnA = 0xFFFF). Si une limite supérieure est spécifiée, alors la résolution PWM dans ce mode est déterminée comme suit :

En mode PWM FC, le compteur est incrémenté jusqu'à atteindre l'une des valeurs fixes 0x00FF, 0x01FF ou 0x03FF (respectivement pour WGMn3-0 = 0b0001, 0b0010 ou 0b0011), ainsi qu'une valeur égale à ICRn (si WGMn3- 0 = 0b1010) ou OCRnA (si WGMn3 :0 = 0b1011). De plus, lorsque la limite supérieure est atteinte, le compteur change le sens de comptage. La valeur TCNTn reste à la limite supérieure pendant un cycle d'horloge de minuterie. Le chronogramme du mode PC PWM est illustré à la figure 3. La figure montre le mode PC PWM utilisant le registre OCRnA ou ICRn pour définir la limite supérieure. L'état TCNTn est représenté sous forme de graphique de fonction pour illustrer le comptage bidirectionnel. La figure montre la sortie PWM non inversée et inversée. De courtes lignes horizontales indiquent les points sur le graphique TCNTn où une correspondance se produit avec la valeur OCRnx. L'indicateur d'interruption OCnx est défini lorsqu'une correspondance se produit.

Figure 3 – Chronogramme pour le mode PWM FC

L'indicateur Timer-Counter Overflow (TOVn) est activé chaque fois que le compteur atteint sa limite inférieure. Si le registre OCRnA ou ICRn est utilisé pour définir la limite supérieure, alors l'indicateur OCnA ou ICFn est défini en conséquence avec la même impulsion d'horloge à laquelle le registre OCRnx a été mis à jour à partir du registre tampon (en haut du décompte). Les indicateurs d'interruption peuvent être utilisés pour générer une interruption lorsqu'un compteur atteint une limite basse ou haute.

Lorsque vous modifiez la valeur de la limite supérieure de comptage, vous devez vous assurer qu'elle est supérieure ou égale aux valeurs de tous les registres de comparaison. Sinon, une correspondance entre TCNTn et OCRnx ne se produira jamais. Notez que lorsque vous utilisez des valeurs de comptage supérieures fixes, les bits inutilisés sont remis à zéro lors de l'écriture dans les registres OCRnx. La troisième période de la figure 53 illustre le cas dans lequel un changement dynamique de la limite supérieure de comptage conduit à la génération d'une impulsion asymétrique. Cette fonctionnalité est basée sur l'heure de mise à jour du registre OCRnx. Étant donné que la mise à jour OCRnx a lieu en haut du décompte, la période PWM commence et se termine en haut du décompte. Cela implique que la durée du compte à rebours est déterminée par la valeur limite supérieure précédente et que la durée du comptage anticipé est déterminée par la nouvelle valeur limite supérieure. Si ces deux valeurs sont différentes, alors la durée du comptage avant et arrière sera également différente. La différence de durée conduit à une asymétrie des impulsions de sortie.

Si la tâche consiste à modifier la limite supérieure pendant le fonctionnement du compteur, il est recommandé d'utiliser le mode PWM PFC (correction de phase et de fréquence) au lieu de ce mode. Si une valeur limite supérieure statique est utilisée, il n'y a pratiquement aucune différence entre ces modes.

En mode PWM FC, les unités de comparaison vous permettent de générer des signaux PWM au niveau des broches OCnx. Si vous définissez COMnx1:0 = 0b10, alors la sortie PWM sera sans inversion, et si COMnx1:0=0b11, alors avec inversion. La valeur réelle d'OCnx peut être observée sur la broche du port si le registre de direction des données pour cette broche de port est réglé sur la direction de sortie (DDR_OCnx). Le signal PWM est généré en réinitialisant (réinitialisant) le registre OCnx lorsque les valeurs d'OCRnx et TCNTn correspondent pendant le décompte, et en réinitialisant (réinitialisant) le registre OCnx lorsqu'il y a une correspondance entre OCRnx et TCNTn pendant le décompte. La fréquence résultante du signal PWM en mode PWM FC à une limite supérieure (UL) donnée peut être calculée à l'aide de l'expression suivante :

L'écriture de valeurs limites dans le registre OCRnx est associée à des cas particuliers dans la génération de signaux PWM en mode PWM FC. Si vous définissez le mode PWM sans inversion et définissez OCRnx égal à la limite inférieure, la sortie sera continuellement définie sur journal. 0, et s'il est égal à la limite supérieure, alors un log est toujours présent en sortie. 1. Pour PWM avec inversion, les niveaux indiqués doivent être remplacés par les niveaux opposés.

Si vous spécifiez d'utiliser OCnA comme limite supérieure (WGMn3:0 = 0b1011) et définissez COMnA1:0 =0b01, une onde carrée sera générée à la sortie OCnA.

Mode de modulation de largeur d'impulsion avec correction de phase et de fréquence (Phase and Frequency Correct)

Le mode de modulation de largeur d'impulsion avec correction de phase et de fréquence (PWM PFC) (WGMn3-0 = 0b1000 ou 0b1001) est conçu pour générer des impulsions PWM haute résolution avec correction de phase et de fréquence. Tout comme le mode PWM FC, le mode PWM FC est basé sur le fonctionnement bidirectionnel du compteur. Le compteur passe de la limite basse (0x0000) à la limite haute, puis revient de la limite haute à la limite basse. Si le mode PWM non inverseur est spécifié, la sortie OCnx est réinitialisée si une correspondance se produit entre TCNTn et OCRnx pendant le comptage, et est définie si une correspondance se produit pendant le décomptage. En mode inverseur, le fonctionnement est inverse. Le fonctionnement bidirectionnel, comparé au fonctionnement unidirectionnel, est associé à la génération de fréquences plus basses. Cependant, en raison de la symétrie des modes PWM avec comptage bidirectionnel, leur utilisation est préférable dans les tâches de contrôle de variateur.

La principale différence entre les modes PWM FC et PWM FC réside dans le moment où le registre OCRnx est mis à jour à partir du registre tampon OCRnx (voir Figure 3 et Figure 4).

La résolution PWM dans ce mode peut être définie à l'aide du registre ICRn ou OCRnA. La résolution minimale est de 2 bits (ICRn ou OCRnA = 0x0003) et la résolution maximale est de 16 bits (ICRn ou OCRnA = 0xFFFF). La résolution PWM en bits peut être calculée à l'aide de l'expression suivante :

En mode PWM FCC, le compteur est incrémenté jusqu'à correspondre à la valeur en ICRn (WGMn3:0 = 0b1000) ou en OCRnA (WGMn3:0 = 0b1001). Cela signifie atteindre le sommet du décompte, après quoi la direction du décompte change. La valeur de TCNTn reste en haut du décompte pendant un cycle d'horloge de minuterie. Le chronogramme du mode PWM FCC est illustré à la Figure 54. La figure montre le mode PWM FCC lorsque le plateau de comptage est défini par le registre OCRnA ou ICRn. La valeur TCNTn est affichée sous forme de graphique de fonction pour illustrer le comptage bidirectionnel. Le diagramme montre les sorties PWM non inverseuses et inverseuses. De courtes lignes horizontales indiquent les points sur le tracé TCNTn où se produit une correspondance entre OCRnx et TCNTn. L'indicateur d'interruption OCnx est défini après une correspondance.

Figure 4 – Chronogramme du mode PWM avec correction de phase et de fréquence

L'indicateur de dépassement de temps-compteur (TOVn) est défini au même cycle d'horloge lorsque les registres sont mis à jour avec la valeur du registre tampon (à la limite de comptage inférieure). Si le registre OCRnA ou ICRn est utilisé pour définir la limite supérieure, alors lorsque le compteur atteint la limite supérieure, l'indicateur OCnA ou ICFn est activé, respectivement. Les indicateurs d'interruption peuvent être utilisés pour générer une interruption lorsqu'un compteur atteint une limite haute ou basse.

Lors de la modification de la limite supérieure, vous devez vous assurer que la nouvelle valeur est supérieure ou égale aux valeurs de tous les registres de seuil de comparaison. Sinon, si la limite supérieure est définie sur une valeur inférieure à l'une des valeurs des registres de seuil de comparaison, une correspondance entre TCNTn et OCRnx ne se produira jamais.

La figure 4 montre que, contrairement au mode PWM FC, le signal de sortie généré est symétrique à toutes les périodes. Les registres OCRnx étant mis à jour à la limite inférieure de comptage, les durées des comptages aller et retour sont toujours égales. De ce fait, les impulsions de sortie ont une forme symétrique et donc une fréquence corrigée.

L'utilisation du registre ICRn pour définir la limite supérieure est recommandée si la valeur limite supérieure est une constante. Dans ce cas, le registre OCRnA est également libéré pour la modulation de largeur d'impulsion des impulsions au niveau de la broche OCnA. Cependant, si vous devez modifier dynamiquement la fréquence PWM en modifiant la limite supérieure, il est alors recommandé d'utiliser le registre OCRnA pour définir la limite supérieure en raison de sa double mise en mémoire tampon.

En mode PWM, les unités de comparaison vous permettent de générer des impulsions PWM au niveau de la broche OCnx. Si COMnx1:0 = 0b10, alors une sortie PWM non inverseuse est définie, et si COMnx1:0=0b11, alors une sortie inverseuse (voir tableau 60). La valeur OCnx ne sera présente sur la broche du port correspondante que si elle est définie sur la direction de sortie. Le signal PWM est généré en réinitialisant (réinitialisant) le registre OCnx sur une correspondance entre OCRnx et TCNTn pendant le décompte et en réinitialisant (réinitialisant) le registre OCnx sur une correspondance entre OCRnx et TCNTn pendant le décompte. La fréquence PWM dans ce mode avec une limite supérieure (UP) de comptage donnée est déterminée comme suit :

où N est le facteur de division du pré-échelonneur (1, 8, 32, 64, 128, 256 ou 1024).

L'écriture de valeurs limites dans le registre OCRnx est associée à des cas particuliers dans la génération de signaux PWM dans ce mode. Si vous définissez OCRnx égal à la limite inférieure (0x0000), alors en mode non inverseur, la sortie aura constamment un niveau logique bas, et lors de l'écriture d'une valeur égale à la limite supérieure, la sortie aura un niveau logique élevé pour un longue durée. En mode inverseur, les niveaux donnés seront opposés.

Si OCRnA est utilisé pour définir la limite supérieure (WGMn3:0 = 0b1001) et COMnA1:0 = 0b01, alors une onde carrée sera générée à la sortie OCnA.


La mise en œuvre matérielle de PWM offre des avantages incontestables par rapport au logiciel, car elle libère le processeur du code et du temps inutiles et fastidieux pour sa maintenance, et offre également plus de possibilités d'utilisation du travail avec PWM. Il suffit d'initialiser le temporisateur/compteur (entrer les valeurs nécessaires dans les registres utilisés par le temporisateur/compteur) et le temporisateur/compteur peut fonctionner indépendamment du processeur ; par conséquent, le processeur peut gérer d'autres tâches, seulement occasionnellement. contacter au moment nécessaire pour régler ou changer le mode ou obtenir les résultats du minuteur/compteur.

Description des indicateurs d'interruption

T1 peut générer une interruption lorsque :

  1. débordement du registre du compteur TCNT1 ;
  2. si le registre de comptage TCNT1 et les registres de comparaison OCR1A et OCR1B sont égaux (séparément pour chaque registre) ;
  3. tout en stockant le registre de comptage dans le registre de capture ICR1.

T2 peut générer une interruption lorsque :

  1. Débordement du registre du compteur TCNT2 ;
  2. lorsque le registre de comptage TCNT2 et le registre de comparaison OCR2 sont égaux.

Les indicateurs de toutes les interruptions se trouvent dans le registre TIFR et l'activation/désactivation des interruptions se trouve dans le registre TIMSK.

Bits du registre TIMSK
Registre7 6 5 4 3 2 1 0
TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Flag d'activation d'interruption pour l'événement « match » du temporisateur/compteur T2
  • TOIE2- Indicateur d'activation d'interruption de dépassement de minuterie/compteur T2
  • TICIE1- Flag d'activation d'interruption pour l'événement "capture" du temporisateur/compteur T1
  • OCIE1A- Flag d'activation d'interruption pour l'événement "match A" du temporisateur/compteur T1
  • OCIE1B- Flag d'activation d'interruption pour l'événement "match B" du temporisateur/compteur T1
  • TOIE1- Indicateur d'activation d'interruption de dépassement de minuterie/compteur T1
  • OCIE0*- Indicateur d'activation d'interruption pour l'événement « coïncidence » du temporisateur/compteur T0 (* - non disponible dans ATmega8)
  • TOIE0- Indicateur d'activation d'interruption de dépassement de minuterie/compteur T0
  • OCF2- Flag d'interruption pour l'événement « coïncidence » du temporisateur/compteur T2
  • TOV2- Indicateur d'interruption de dépassement de minuterie/compteur T2
  • ICF1- Flag d'interruption pour l'événement « capture » du temporisateur/compteur T1
  • OCF1A- Flag d'interruption pour l'événement "coïncidence A" du temporisateur/compteur T1
  • OCF1B- Flag d'interruption pour l'événement "coïncidence B" du temporisateur/compteur T1
  • TOV1- Indicateur d'interruption de dépassement de minuterie/compteur T1
  • OCF0- Flag d'interruption pour l'événement « coïncidence » du temporisateur/compteur T0
  • TOV0- Indicateur d'interruption de dépassement de minuterie/compteur T0

Description du fonctionnement du timer/compteur T1 dans le contrôleur ATmega8/16

Le temporisateur/compteur à seize bits T1 peut être utilisé pour générer des intervalles de temps, compter le nombre de signaux externes et générer des signaux PWM de cycles de service et de durées variables sur les broches OC1A et OC1B. De plus, par un signal externe provenant de la broche ICP1 ou d'un comparateur analogique, T1 peut sauvegarder son état actuel dans un registre de capture séparé ICR1.

Bits de registre TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Registre7 6 5 4 3 2 1 0
TCCR1A COM1A1 COM1A0 COM1B1 COM1BO FOC1A FOC1B WGM11 WGM10
TCCR1B ICNC1 CIEM1 * WGM13 WGM12 CS12 CS11 CS10
TCNT1:H R/É R/É R/É R/É R/É R/É R/É R/É
TCNT1:L R/É R/É R/É R/É R/É R/É R/É R/É
OCR1A:H R/É R/É R/É R/É R/É R/É R/É R/É
OCR1A:L R/É R/É R/É R/É R/É R/É R/É R/É
OCR1B:H R/É R/É R/É R/É R/É R/É R/É R/É
OCR1B:L R/É R/É R/É R/É R/É R/É R/É R/É
ICR1:H R/É R/É R/É R/É R/É R/É R/É R/É
ICR1:L R/É R/É R/É R/É R/É R/É R/É R/É

Chaque registre de 16 bits est physiquement situé dans deux registres de 8 bits, donc lors de la lecture d'une entrée dans ceux-ci, deux opérations doivent être effectuées. Lors de l'écriture, l'octet de poids fort est chargé en premier, puis l'octet de poids faible ; lors de la lecture, au contraire, l'octet de poids faible est lu en premier, puis l'octet de poids fort.

TCCR1A : TCCR1B- Registres de contrôle de minuterie/compteur 8 bits T1

TCNT1- Registre de minuterie/compteur 16 bits T1. Selon le mode de fonctionnement, le contenu de ce registre est effacé, incrémenté (la valeur est augmentée de 1), ou décrémenté (la valeur est diminuée de 1) à chaque impulsion du signal minuterie/compteur d'horloge.

OCR1A :OCR1B- Registres de comparaison 16 bits

ICR1- Registre de capture 16 bits, stocke la valeur de TCNT1 lorsqu'un front de signal actif est appliqué à la broche ICP1 ou par un signal du comparateur.

Affectation des bits

COM1A1:COM1A0:COM1B1:COM1B0- Ces bits déterminent le comportement de la broche OC1A:OC1B lorsque la valeur du registre de comptage TCNT1 et celle du registre de comparaison OCR1A:OCR1B correspondent

FOC1A : FOC1B- Ces bits sont utilisés pour forcer un changement d'état de la broche OC1A:OC1B

ICNC1- Bit de contrôle du circuit d'interférence, si le bit est à « 0 » la capture se fera sur le premier front actif, si à « 1 » la capture se fera après le quatrième échantillon identique du signal de capture.

CIEM1- Bit de sélection du front actif du signal, si sa valeur est « 0 », la sauvegarde du registre de comptage TCNT1 dans le registre de capture OCR1 se fera sur le front descendant du signal, si « 1 » sur le front montant.

WGM13:WGM12:WGM11:WGM10- Ces bits déterminent le mode de fonctionnement du temporisateur/compteur T1

CS22:CS21:C20- Bits qui déterminent la source du signal de minuterie/compteur T1.

Sélection du mode de fonctionnement du temporisateur/compteur T1
WGM13WGM12WGM11WGM10Mode de fonctionnementModule Compte (HAUT)
0 0 0 0 Normale $FFFF
0 0 0 1 PWM correct en phase

8 bits

00$FF
0 0 1 0 PWM correct en phase

9 bits

01$FF
0 0 1 1 PWM correct en phase

10 bits

03$FF
0 1 0 0 CTC (réinitialisation en cas de match) ROC1A
0 1 0 1 MLI rapide

8 bits

00$FF
0 1 1 0 MLI rapide

9 bits

01$FF
0 1 1 1 MLI rapide

10 bits

03$FF
1 0 0 0 ICR1
1 0 0 1 PWM correct de phase et de fréquence ROC1A
1 0 1 0 PWM correct en phase ICR1
1 0 1 1 PWM correct en phase ROC1A
1 1 0 0 CTC (réinitialisation en cas de match) ICR1
1 1 0 1 Réservé *
1 1 1 0 MLI rapide ICR1
1 1 1 1 MLI rapide ROC1A

Sélection d'une source d'horloge

Mode normal

Le mode de fonctionnement le plus simple est T1. Pour chaque impulsion du signal d'horloge, le registre de comptage TCNT1 est incrémenté (la valeur augmente de 1). Lors du passage par la valeur $FFFF du module de comptage (TOP), un débordement se produit et le cycle d'horloge suivant commence à compter à partir de la valeur $0000, au même moment l'indicateur TOV1=1 est mis dans le registre TIFR, et une interruption peut être généré si l'indicateur TOIE1=1 est défini dans le registre TIMSK. Afin de générer un signal d'une fréquence donnée dans ce mode, il est nécessaire d'écrire dans les bits COM1A1=0:COM1A0=1 pour la sortie OC1A ou COM1B1=0:COM1B0=1 pour la sortie OC1B du contrôleur.

De plus, pour chaque cycle d'horloge, une comparaison est effectuée entre le registre de comptage TCNT1 et le registre de comparaison OCR1A:OCR1B ; en cas de correspondance, le drapeau d'interruption OCF1A=1:OCF1B=1 est mis à 1 et si le bit OCIE1A=1 :OCIE1B=1 du registre TIMSK, une interruption est générée. Dans le même temps, l'état de la broche OC1A:OC1B peut être modifié en fonction des paramètres des bits COM1A1:COM1A0:COM1B1:COM1B0.

Mode CTC (réinitialisation en cas de match)

Dans ce mode, T1 fonctionne selon le même principe qu'en mode Normal. La différence est que la valeur maximale possible du registre de comptage TCNT1 est limitée par la valeur du registre de comparaison OCR1A ou ICR1 (voir le tableau de sélection du mode minuterie/compteur). Lorsque TCNT1 atteint la valeur OCR1A ou ICR1, la valeur de TCNT1 est réinitialisée à TCNT1=$0000. En même temps, l'indicateur TOV1=1 est défini. COM1A1:COM1A0:COM1B1:COM1B0 Détermine le comportement de la broche OC1A:OC1B lorsque il y a une correspondance.

Mode PWM rapide (PWM rapide)

En utilisant ce mode, vous pouvez générer un signal PWM haute fréquence. Le principe et la procédure de fonctionnement ne diffèrent pas du mode Normal, à l'exception de la présence d'un double tampon du registre OCR1A:OCR1B, qui élimine l'apparition d'impulsions de signal asymétriques, et diffère également par le comportement des broches OC1A:OC1B ( Voir le tableau).


Mode PWM de correction de phase

La différence entre ce mode et les précédents est que le registre de comptage fonctionne comme un compteur inverse. Ce mode étant recommandé par Atmel comme le plus adapté au réglage des moteurs, nous l'examinerons plus en détail. Lorsque le registre de comptage TCNT1 atteint la valeur du module de comptage (TOP) (ou la valeur du registre ICR1 ou la valeur du registre OCR1A, voir le tableau de sélection du mode minuterie/compteur), le sens de comptage change. Lorsque le registre de comptage TCNT1 atteint la valeur minimale ($0000), le sens de comptage change également et en même temps le drapeau d'interruption TOV1 du registre TIFR est activé. De plus, si les contenus du registre de comptage TCNT1 et du registre de comparaison OCR1A:OCR1B sont égaux, l'indicateur OCF1A:OCF1B du registre TIFR est activé et l'état de la sortie OC1A:OC1B change, selon le tableau.

Pour éviter les émissions asymétriques lors de l'écriture d'une valeur dans le registre OCR1A:OCR1B, une double mise en mémoire tampon d'écriture est implémentée dans ce mode. Grâce à cela, la variation réelle de la valeur du registre change au moment où le registre compteur TCNT1 atteint la valeur du module de comptage (TOP) (ou la valeur du registre ICR1 ou la valeur du registre OCR1A, voir la sélection du mode minuterie/compteur tableau). Par conséquent, au tout début, lorsque le temporisateur/compteur est initialisé, la broche OC1A:OC1B ne changera pas d'état lors de la correspondance jusqu'à ce que le registre atteigne la valeur (TOP).


Tâche: Développons un programme pour contrôler la luminosité d'une lampe à incandescence de 12 volts à l'aide de PWM. Lorsque vous appuyez sur le bouton « Plus », la luminosité de la lampe augmente, et lorsque vous cliquez sur le bouton « Moins », la luminosité diminue. Le schéma de notre futur appareil est présenté sur la figure. Comme d'habitude, nous utilisons le microcontrôleur Atmega8, qui sera cadencé à partir d'un oscillateur interne d'une fréquence de 4 MHz. En fait, nous aurons un variateur, ces appareils sont conçus pour régler la luminosité des luminaires. De nos jours, les variateurs LED sont les plus répandus.

Pour plus de simplicité, vous pouvez également connecter une LED à notre circuit, mais ce sera plus clair avec une ampoule. Les boutons sont connectés aux broches PD0, PD1. Nous connectons la charge à la sortie PB1(OC1A) via une résistance et un transistor à effet de champ MOSFET, qui nous servira de clé (en mode commutation). Un transistor à effet de champ est préférable car sa grille est isolée du circuit de puissance et est contrôlée par un champ électrique, et le courant de commande atteint des microampères. Cela permet, à l'aide d'un ou deux transistors, de contrôler une charge d'une puissance énorme (jusqu'à des dizaines d'ampères et des dizaines ou centaines de volts) sans charger le microcontrôleur. Compte tenu également du fait que les transistors à effet de champ peuvent être connectés en parallèle (contrairement aux transistors bipolaires), il est possible d'obtenir une cascade encore plus puissante de plusieurs centaines d'ampères.

Voyons maintenant comment le microcontrôleur implémente PWM et écrivons un programme. Comme mentionné précédemment, notre MK dispose de 3 minuteries, et toutes peuvent fonctionner en mode PWM. Nous travaillerons avec un temporisateur/compteur de seize bits. Morceaux WGM13-10 configurons notre minuterie pour qu'elle fonctionne FastPWM avec une limite de nombre supérieure ICR1. Le principe du programme est le suivant : notre timer compte de 0 à 65535(0xFFFF), dans le registre ICR1 Entrons le nombre 255, ce sera la limite supérieure du nombre de minuterie (TOP), la fréquence du signal PWM sera constante. De plus, notre minuterie est configurée de telle sorte que si le registre de comptage et le registre de comparaison correspondent (TCNT1 = OCR1A), la sortie du contrôleur commutera OC1A. Le cycle de service PWM peut être modifié en écrivant dans le registre de comparaison ROC1A un certain nombre de 0 à 255, plus ce nombre est grand, plus le facteur de remplissage est élevé, plus la lampe brûlera fort. En fonction du bouton enfoncé, la variable change je, puis il est écrit dans le registre ROC1A.

Le texte intégral du programme est présenté ci-dessous. Les commentaires décrivent le fonctionnement du programme plus en détail.

/***Leçon n°8. Génération de signaux PWM***/ #include #inclure int main(void) ( unsigned int i=0; //définir la variable i /***Configuration des ports d'E/S***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // Le rapport cyclique PWM passe de 255 à 0 ( i--; // diminue i de un (vous pouvez également écrire ceci) OCR1A = i; // écrit une variable dans le registre de comparaison _delay_ms(30); // délai 30 ms ) ) ) )

Attention! Tout d'abord, nous alimentons le microcontrôleur, puis nous devons nous assurer que le transistor est connecté à la broche MK, et ensuite seulement alimenter le circuit avec la lampe et le transistor à effet de champ. Sinon, vous risquez de brûler le transistor. Le fait est que lorsqu'elles sont éteintes, les "jambes" du MK "pendent dans les airs" - elles ne sont connectées à rien et des interférences se produisent sur elles. Ces faibles interférences suffisent à ouvrir partiellement un transistor à effet de champ très sensible. Ensuite, sa résistance entre drain et source chutera de plusieurs MOhms à plusieurs Ohms ou fractions d'Ohms et un courant important la traversera jusqu'à la lampe. Mais le transistor ne s'ouvrira pas complètement, car pour cela, vous devez appliquer non pas une interférence de 1 à 3 V à la grille, mais un 5 V stable, et sa résistance sera bien supérieure au minimum. Cela entraînera le dégagement d'une grande quantité de chaleur sur celui-ci, et il fumera et éventuellement brûlera.

Minuteries PWM (cours)

Évidemment, nous avons besoin d’une sorte de compteur externe qui fonctionnerait quel que soit le fonctionnement du processeur, et le processeur pourrait à tout moment voir ce qui s’y passait. Ou pour que le compteur génère des événements de débordement ou de sous-débordement, levez le drapeau ou générez une interruption. Et le processeur le verra et le traitera. Et il existe un tel compteur, pas même un seul - ce sont des minuteries périphériques. Un AVR peut en avoir plusieurs avec des profondeurs de bits différentes. ATmega16 en a trois, ATmega128 en a quatre. De plus, une minuterie peut être plus qu'un simple compteur : une minuterie est l'un des périphériques les plus multifonctionnels (en termes de fonctions alternatives).

Ce que les minuteries peuvent faire

· Fonctionne à partir d'un quartz externe à 32 768 Hz

· Générer plusieurs types de signaux PWM

· Émettre des interruptions (une demi-douzaine d'événements différents) et définir des indicateurs

Source du tick du minuteur

Le minuteur/compteur (ci-après dénommé TC) compte soit les impulsions d'horloge provenant du générateur d'horloge intégré, soit de l'entrée de comptage. Avec des réglages appropriés, le véhicule comptera soit le front montant (front de 0-1), soit le front arrière (front de 1-0) des impulsions arrivant aux entrées. L'essentiel est que la fréquence des impulsions entrantes ne dépasse pas la fréquence d'horloge du processeur, sinon il n'aura pas le temps de traiter les impulsions.

De plus, certaines minuteries sont capables de fonctionner en mode asynchrone. Autrement dit, le TS ne compte pas les impulsions d'horloge du processeur, mais les impulsions de son propre générateur, alimenté par un quartz séparé. A cet effet, le véhicule dispose d'entrées séparées sur lesquelles vous pouvez fixer un résonateur à quartz. Pourquoi est-ce nécessaire ? Au moins pour organiser une horloge en temps réel. J'y ai accroché une horloge à quartz à 32768 Hz et vous pouvez mesurer le temps - 128 débordements se produiront par seconde (si le véhicule est à huit bits). Un débordement équivaut donc à 1/128 de seconde. De plus, le temporisateur ne s'arrête pas pendant le traitement de l'interruption de débordement ; il continue également à compter.

Pré-diviseur

Si le minuteur compte les impulsions provenant d'un générateur d'horloge ou de son générateur interne, elles peuvent toujours être transmises via un pré-échelonneur. Autrement dit, avant même d'entrer dans le registre de comptage, la fréquence d'impulsion sera divisée. Vous pouvez diviser par 8, 32, 64, 128, 256, 1024. Ainsi, si vous accrochez une horloge à quartz sur le véhicule et la faites passer par le pré-échelonneur par 128, la minuterie comptera à une vitesse d'une fois par seconde. Il est également pratique d'utiliser un pré-échelonneur lorsque vous avez juste besoin d'obtenir un intervalle important et que la seule source de comptage est le générateur d'horloge du processeur, et compter ces mégahertz est difficile, mais si vous le passez par un pré-échelonneur, alors tout est plus facile . Cependant, si vous exécutez un TS avec un pré-échelonneur, le premier tick n'arrivera pas nécessairement au registre de comptage après le nombre d'impulsions requis.

Cela dépend de l'état dans lequel se trouvait le préscaler. Et si, au moment de sa mise sous tension, il avait déjà compté presque jusqu'à la valeur définie ? Cela signifie qu'il y aura une coche immédiatement. Le pré-échelonneur fonctionne tout le temps, que la minuterie soit activée ou non. Par conséquent, les préscalers peuvent et doivent être réinitialisés. Vous devez également prendre en compte que le pré-échelonneur est le même pour tous les compteurs. Par conséquent, lors de sa réinitialisation, vous devez prendre en compte le fait qu'un autre temporisateur aura un délai jusqu'au prochain tick.

Par exemple, le premier timer fonctionne sur la broche 1:64 et le second sur la broche 1:1024 du préscaler. Le second a presque atteint 1024 dans le pré-échelonneur et maintenant il devrait y avoir un tick de minuterie, mais vous êtes ensuite allé réinitialiser le pré-échelonneur pour démarrer le premier temporisateur exactement à partir de zéro. Que va-t-il se passer ? Pour le second, le diviseur sera immédiatement remis à 0 (le pré-échelonneur est le même, il a un registre), et le deuxième temporisateur devra attendre encore 1024 cycles d'horloge pour obtenir une impulsion ! Et si vous réinitialisez le pré-échelonneur dans la boucle, au profit du premier temporisateur, plus d'une fois tous les 1024 cycles d'horloge, alors le deuxième temporisateur ne fonctionnera jamais. Pour réinitialiser les prescalers, écrivez simplement le bit PSR10 dans le registre SFIOR. Le bit PSR10 sera réinitialisé automatiquement au prochain cycle d'horloge.

Registre des comptes

Le décompte complet est accumulé dans le registre de comptage TCNTx, où x est le numéro du temporisateur. Il peut être de 8 ou 16 bits, auquel cas il se compose de deux registres TCNTxH et TCNTxL - respectivement les octets haut et bas.

Et il y a un piège ici. Et le fait est que le minuteur compte indépendamment du processeur, donc on peut mettre un octet en premier, il commencera à compter, puis le second, et le recalcul commencera en tenant compte du deuxième octet. Le timer est un appareil précis, ses registres de comptage doivent donc être chargés en même temps ! Mais comment? Et les ingénieurs d'Atmel ont résolu le problème simplement : l'écriture dans le registre haut (TCNTxH) s'effectue d'abord dans le registre TEMP. Ce registre est purement officiel et ne nous est en aucun cas accessible.

Quel est le résultat? Nous écrivons l'octet de poids fort dans le registre TEMP (pour nous, c'est toujours TCNTxH), puis nous écrivons l'octet de poids faible. A ce moment, la valeur enregistrée précédemment est entrée dans le TCNTxH réel. Autrement dit, deux octets, haut et bas, sont écrits simultanément ! Vous ne pouvez pas modifier la commande ! Cela ressemble à ceci :

Pourquoi désactiver les interruptions ? Oui, pour qu'après avoir écrit le premier octet, le programme ne parte pas accidentellement sans interruption.

Tout se lit de la même manière, mais dans l'ordre inverse. D'abord l'octet de poids faible (avec l'octet de poids fort dans TEMP), puis l'octet de poids fort. Cela garantit que nous comptons exactement l'octet qui se trouvait actuellement dans le registre de comptage.

Registres de contrôle

La fonction principale de la minuterie est de compter. Le registre principal est TCCRx. Pour TC0, c'est TCCR0, pour les autres minuteries TCCR n respectivement. Les 3 premiers bits de ce registre : CSx2..CSx0 sont responsables du réglage du prescaler et de la source du signal d'horloge ; au lieu de x, le numéro du timer est remplacé. Les différents timers sont légèrement différents, nous décrirons donc les bits CS02...CS00 uniquement pour le timer0.

· 000 - minuterie arrêtée

· 001 - le préscaler est égal à 1, c'est-à-dire désactivé. La minuterie compte les impulsions d'horloge

· 010 - le préscaler est de 8, la fréquence d'horloge est divisée par 8

· 011 - le préscaler est de 64, la fréquence d'horloge est divisée par 64

· 100 - le préscaler est de 256, la fréquence d'horloge est divisée par 256

· 101 - le préscaler est 1024, la fréquence d'horloge est divisée par 1024

· 110 - les impulsions d'horloge proviennent de la broche T0 lors de la transition de 1 à 0

· 111 - les impulsions d'horloge proviennent de la broche T0 lors de la transition de 0 à 1

Interruptions

Chaque événement matériel comporte une interruption et la minuterie ne fait pas exception. Dès qu'un débordement ou un autre événement se produit, une interruption est immédiatement générée. Les registres TIMSK et TIFR sont responsables des interruptions des minuteries. Et les AVR puissants, comme ATMega128, ont également ETIFR et ETIMSK - une sorte de continuation, puisqu'il y a plus de minuteries là-bas. TIMSK est un registre de masques. Autrement dit, les bits qu'il contient activent localement les interruptions. Si le bit est activé, l'interruption spécifique est activée. Si le bit est nul, alors cette interruption n'est pas traitée. Par défaut, tous les bits sont nuls. Les bits suivants sont responsables de l'interruption de débordement :

· TOIE - autorisation d'interrompre en cas de débordement du timer 0

· TOIE1 - autorisation d'interrompre en cas de débordement du timer 1

· TOIE2 - autorisation d'interrompre en cas de débordement du timer 2

Le registre TIFR est directement un registre de drapeaux. Lorsqu'une interruption est déclenchée, l'indicateur d'interruption est défini. Cet indicateur est réinitialisé par le matériel lorsque le programme quitte le vecteur. Si les interruptions sont désactivées, l'indicateur restera là jusqu'à ce que les interruptions soient activées et que le programme passe à l'interruption. Pour éviter que cela ne se produise, le drapeau peut être réinitialisé manuellement. Pour ce faire, vous devez y écrire 1 en TIFR !

En savoir plus sur la minuterie A TMÉGA128sera discuté plus tard.

Modulation de largeur d'impulsion

Modulation de largeur d'impulsion ( MLI - Modulation de largeur d'impulsion) c'est une façon de spécifier un signal analogique méthode numérique , c'est-à-dire qu'à partir d'une sortie numérique qui ne donne que des zéros et des uns, vous pouvez obtenir des valeurs qui changent en douceur. Et le point est le suivant :

Imaginez un volant d'inertie lourd que vous pouvez faire tourner avec un moteur. De plus, vous pouvez allumer ou éteindre le moteur. Si vous l'allumez constamment, le volant tournera jusqu'à sa valeur maximale et continuera à tourner. Si vous l'éteignez, il s'arrêtera à cause des forces de friction. Mais si le moteur est allumé pendant dix secondes toutes les minutes, le volant tournera, mais pas à pleine vitesse - une inertie élevée atténuera les à-coups dus au démarrage du moteur et la résistance de frottement ne lui permettra pas de tourner indéfiniment. Le plus Durée d'activation moteur par minute, plus le volant tournera vite.

À MLI nous envoyons un signal à la sortie composé de niveaux haut et bas (applicable à notre analogie - nous allumons et éteignons le moteur), c'est-à-dire des zéros et des uns. Et puis tout cela passe par une chaîne d'intégration (par analogie - un volant d'inertie). À la suite de l'intégration, la sortie aura une valeur de tension égale à la surface sous les impulsions.En changeant cycle de service(le rapport entre la durée de la période et la durée de l'impulsion), vous pouvez modifier en douceur cette zone, et donc la tension de sortie. Ainsi, si la sortie est solide de 1 s, alors la sortie sera une tension de niveau élevé (par exemple, 12 volts), si elle est nulle, alors zéro. Et si 50 % du temps le niveau est élevé et 50 % bas, alors 6 volts. La chaîne intégratrice sera ici la masse de l'induit du moteur, qui a une inertie assez importante.

Que se passe-t-il si vous prenez et donnez MLI - le signal ne va pas de zéro au maximum, mais de moins à plus. Disons de +12 à -12. Et vous pouvez définir un signal variable ! Lorsqu'il y a zéro à l'entrée, alors la sortie est de -12V, lorsqu'il y en a un, alors +12V. Si le rapport cyclique est de 50 %, alors la sortie est de 0 V. Si le rapport cyclique est modifié selon une loi sinusoïdale du maximum au minimum, nous obtenons une tension alternative. Et si vous prenez trois de ces générateurs PWM et y faites passer des sinusoïdes décalées de 120 degrés les unes des autres, nous obtenons alors la tension triphasée la plus courante, ce qui signifie bonjour moteurs asynchrones et synchrones sans balais . Tous les variateurs de fréquence industriels modernes sont construits sur ce principe. Une chaîne RC peut être utilisée comme circuit intégrateur de lissage en PWM :

Implémentation matérielle de PWM

Quand ATMéga Le moyen le plus simple de procéder consiste à utiliser son générateur PWM, intégré aux minuteries. De plus, la première minuterie dispose de deux canaux. ATmega peut donc implémenter quatre canaux simultanément MLI.

La minuterie dispose d'un registre de comparaison spécial ROC. Lorsque la valeur du registre du compteur de minuterie atteint la valeur du registre de comparaison, les événements matériels suivants peuvent se produire :

· Interruption par hasard

· Modification de l'état de la sortie de comparaison externe O.C..

Les sorties de comparaison sont acheminées vers l'extérieur vers les broches du microcontrôleur. Supposons que PWM- le générateur est configuré comme ça que lorsque la valeur dans le registre de comptage est supérieure, que dans le registre de comparaison, alors la sortie est 1, et si elle est inférieure, alors 0. Que se passera-t-il ? Le timer comptera comme il se doit, de zéro à 256 avec une fréquence, que nous configurerons avec les bits du timer prescaler. Après débordement, il est remis à 0 et continue de compter.

Des impulsions apparaissent à la sortie. Si vous augmentez la valeur dans le registre de comparaison, la largeur d'impulsion deviendra plus étroite. C'est-à-dire changer la valeur dans le registre de comparaison, vous pouvez modifier le cycle de service PWM- signal. Et si vous faites passer ce signal PWM à travers une chaîne RC de lissage (intégrateur), alors nous obtenons un signal analogique.

Une minuterie peut avoir n'importe quel nombre de registres de comparaison. Cela dépend du modèle MK et du type de minuterie. Les nouveaux AVR disposent également de trois registres de comparaison par minuterie, ce qui permet à un MK d'organiser de nombreux canaux PWM indépendants. Il existe plusieurs modes PWM eux-mêmes :

BsLigne PWM (PWM rapide)

Dans ce mode, le compteur compte de zéro à 255 , une fois le débordement atteint, il est remis à zéro et le comptage recommence. Lorsque la valeur du compteur atteint la valeur du registre de comparaison, la sortie correspondante OSxx se remet à zéro. Lorsque le compteur est réinitialisé, cette broche est mise à 1.

La fréquence du signal PWM résultant est déterminée simplement : la fréquence du processeur est par exemple de 8 MHz, le minuteur tourne jusqu'à 256 avec une fréquence d'horloge. Cela signifie qu'une période PWM sera égale à 8 000 000/256 = 31 250 Hz. Ce ne sera pas plus rapide - c'est la vitesse maximale sur le réseau interne 8 MHz générateur d'horloge. Il est toujours possible d'augmenter la résolution en comptant 8, 9, 10 bits (si la profondeur de bits du temporisateur le permet), mais il faut tenir compte du fait que l'augmentation de la profondeur de bits, ainsi que l'augmentation de la discrétion de la sortie analogique Signal, réduit fortement la fréquence PWM.

PWM avec correction de phase (Phase Correct PWM)

PWM avec phase précise. Cela fonctionne de la même manière, mais ici le compteur compte un peu différemment. D'abord de 0 à 255, puis de 255 à 0. La broche OCxx est réinitialisée lors de la première correspondance et définie lors de la seconde. Mais la fréquence MLI en même temps, il diminue de moitié en raison de la période plus longue. Son objectif principal est de générer des signaux PWM multiphasés, par exemple une onde sinusoïdale triphasée. Ceux. les centres des impulsions dans différents canaux et à différents cycles de service coïncideront.


Riz. Modes PWM rapide et PWM à correction de phase

Pour éviter les impulsions inutiles, toute valeur entre dans le registre de comparaison via un registre tampon et n'est entrée que lorsque la valeur dans le compteur atteint son maximum. Ceux. au début d'une nouvelle période MLI impulsion.

RéinitialiserParcoïncidence(Effacer la minuterie lors de la comparaison)

Réinitialiser lors de la comparaison. Il s'agit très probablement d'un PFM - un signal simulé par fréquence d'impulsion. Cela fonctionne un peu différemment ici que dans les autres modes. Ici, le compteur ne tourne pas de 0 à la limite, mais de 0 au registre de comparaison ! Et puis il se réinitialise.

En conséquence, les impulsions de sortie ont toujours le même rapport cyclique, mais de fréquences différentes. Et le plus souvent, ce mode est utilisé lorsqu'il est nécessaire de compter les périodes avec une minuterie (et de générer une interruption) avec une précision spécifiée.


Par exemple, nous avons besoin d'une interruption toutes les millisecondes. Et bien sûr. Comment cela peut-il être fait plus facilement ? Grâce au mode STS ! Laissez la fréquence être de 8 MHz. Le pré-échelonneur sera égal à 64, donc la fréquence de comptage du temporisateur sera de 125 000 Hz. Et nous avons besoin d'une interruption avec une fréquence de 1000 Hz. Par conséquent, nous configurons une interruption pour qu'elle coïncide avec le nombre 125. Lorsque le décompte atteint 125, l'interruption est déclenchée et le compteur est remis à zéro. Atteint 125 - a donné une interruption, remis à zéro.

Minuterie-compteur 8 bits 0 avec fonctions PWM et horloge asynchrone

Le compteur de minuterie 0 est un module de compteur de minuterie multifonctionnel à canal unique de 8 bits avec une sortie matérielle pour générer un signal PWM et un générateur d'horloge optionnel asynchrone intégré, optimisé pour l'utilisation du quartz d'horloge (32 768 Hz) pour horloge asynchrone par rapport à la synchronisation du système.




Registres

Registre de minuterie-compteur (TCNT0) et registre de comparaison de seuil (OCR0) – 8 bits. enregistre. Les signaux de demande d'interruption sont représentés sous forme d'indicateurs d'interruption de minuterie dans le registre TIFR. Toutes les interruptions sont masquées individuellement à l'aide du registre de masque d'interruption des minuteries (TIMSK). Le compteur-minuterie peut être cadencé en interne via le pré-échelonneur ou de manière asynchrone via les broches TOSC1/2 externes. Le fonctionnement asynchrone est contrôlé par le registre ASSR. Le bloc d'horloge sélectionne la source d'horloge utilisée. Si la source d'horloge n'est pas spécifiée, le compteur horaire est dans un état inactif. La sortie clkT0 est la sortie de la logique de sélection de synchronisation.La valeur du registre de seuil de comparaison à double tampon (OCR0) est comparée en permanence à la valeur du compteur-minuterie. Le résultat de la comparaison peut être utilisé pour générer des signaux PWM ou à onde carrée à fréquence variable au niveau de la broche OC0. Si le seuil de comparaison correspond à la valeur du compteur de minuterie, l'indicateur de résultat de comparaison (OCF0) est défini, qui peut être utilisé pour générer une demande d'interruption basée sur le résultat de la comparaison.

NP (limite inférieure)

Le compteur atteint zéro (0x00)

MAX (valeur maximale)

Le compteur atteint une valeur maximale de 0xFF (décimal 255)

VP (limite supérieure)

Le compteur atteint la limite supérieure de comptage (count top). Le haut du décompte peut être la valeur fixe 0xFF ou le contenu du registre OCR0.

Sources d'horloge minuterie-compteur 0

TC0 peut être cadencé de manière synchrone en interne ou de manière asynchrone en externe (par rapport à l'horloge interne du système). La valeur par défaut est clkT0, ce qui équivaut à clkI/O. Si « 1 » est écrit dans le bit AS0 du registre ASSR, alors le générateur aux broches TOSC1 et TOSC2 fait office de source.

Bloc compteur

La base de TC0 est un compteur bidirectionnel programmable.


Description des signaux (signaux internes) :

Count - Incrémente ou décrémente TCNT0 de 1.

Direction - Définit le sens de comptage : (+1, comptage avant) ou (-1, comptage inverse).

Réinitialiser - Réinitialise le contenu de TCNT0 (en écrivant 0 sur tous les bits).

clkT0 - Synchronisation minuterie-compteur.

Limite supérieure - Définit la valeur maximale sur TCNT0.

Limite inférieure - Définit la valeur minimale sur TCNT0 (0) .

Selon le mode de fonctionnement sélectionné, le compteur est réinitialisé, incrémenté ou décrémenté à chaque cycle d'horloge clkT0. Le signal d'horloge clkT0 peut être interne ou externe, et sa fréquence est sélectionnée à l'aide des bits CS02-CS00. Si la source de synchronisation n'est pas spécifiée (CS02-CS00=0b000), alors le temporisateur s'arrête. L'état TCNT0 est disponible pour le processeur quelle que soit la synchronisation.La séquence de comptage est déterminée en réglant les bits WGM01 et WGM00 du registre TCCR0. Il existe une relation précise entre le comportement du compteur et la forme d'onde générée à la sortie OC0. L'indicateur de débordement TC (TOV0) est défini en fonction du mode de fonctionnement, qui est sélectionné par les bits WGM01, WGM00. Le bit TOV0 peut être utilisé pour générer une interruption CPU.

Bloc de comparaison

Le comparateur numérique 8 bits compare en permanence le contenu du registre temporisateur TCNT0 avec le registre de seuil de comparaison OCR0. Chaque fois que la valeur de TCNT0 correspond à la valeur de OCR0, le comparateur établit l'indicateur de correspondance OCF0 au prochain tick d'horloge du temporisateur. Si l'interruption est activée avec le bit OCIE0=1, la définition de l'indicateur de correspondance provoque une demande d'interruption. L'indicateur OCF0 est automatiquement effacé pendant le traitement de l'interruption. Le générateur de signal utilise le signal de résultat de comparaison pour générer des impulsions rectangulaires selon l'un des algorithmes, qui est sélectionné par les bits de réglage du mode de fonctionnement de la minuterie WGM01, WGM00 et les bits de réglage du mode de génération de signal de sortie (COM01, COM00). Les limites de comptage supérieure et inférieure sont utilisées dans certains modes de fonctionnement pour effectuer des actions spéciales.

Le registre OCR0 est implémenté à l'aide d'un schéma de double mise en mémoire tampon lors de l'utilisation des modes de modulation de largeur d'impulsion (PWM). En modes normal et CTC, le circuit à double tampon est désactivé. La double mise en mémoire tampon vous permet de synchroniser la mise à jour du registre de comparaison OCR0 lorsque la limite de comptage supérieure ou inférieure est atteinte. Cette synchronisation empêche la possibilité de générer des impulsions PWM déséquilibrées de longueurs impaires, garantissant ainsi que la génération d'ondes carrées n'échoue pas.Accéder au registre OCR0 peut sembler compliqué, mais c'est fait pour une raison. Une fois la double mise en mémoire tampon activée, la CPU accède au registre tampon OCR0 et, lorsqu'elle est désactivée, elle accède directement au registre OCR0.

Forcer le résultat de la comparaison

Dans les modes de génération d'impulsions sans PWM dans le générateur d'impulsions, le résultat de la comparaison peut être défini directement via le bit FOC0. Forcer le résultat de la comparaison du comparateur ne définit pas l'indicateur OCF0 ni ne réinitialise/redémarre la minuterie, mais affecte l'état de la broche OC0, qui sera définie, effacée ou basculée (inversée) en fonction du paramètre sélectionné du COM01, COM00 bits. Cette fonction permet de régler le registre OCR0 à la même valeur que TCNT0 sans générer de demande d'interruption si l'horloge compteur-minuterie est activée.

Utiliser un bloc de comparaison

Étant donné que l'écriture dans TCNT0 bloque toute action basée sur le résultat de la comparaison pour un cycle de synchronisation de la minuterie, quel que soit le mode de fonctionnement, lors du changement de TCNT0 lors de l'utilisation du canal de comparaison (que la synchronisation de la minuterie fonctionne ou non), les caractéristiques suivantes doivent être prises en compte. Si une valeur égale à OCR0 est écrite dans le registre TCNT0, ignorer la correspondance entraînera la génération d'une forme d'onde incorrecte. Par analogie, il faut éviter d'écrire une valeur égale à la limite inférieure (0x00) dans TCNT0 si le compteur fonctionne comme un compteur soustractif. Le réglage de OC0 doit être effectué avant de régler la ligne d'E/S pour qu'elle sorte dans le registre de direction.

Bloc de génération de signal de sortie

Les bits de réglage du mode de génération du signal de sortie (COM01:0) ont un double objectif. D'une part, les bits COM01, COM00 sont utilisés par le conditionneur de signal et déterminent quel état logique doit être à la sortie OC0 lors de la prochaine correspondance. D'autre part, les bits COM01, COM00 sont utilisés pour activer/désactiver la fonction de sortie alternative du port OC0. La figure montre un schéma logique simplifié affecté par les bits COM01, COM00. P. Seuls les registres de contrôle des ports d'E/S (DDR et PORT) affectés par les bits COM01, COM00 sont fournis.


La fonction ligne du port E/S universel est remplacée par la fonction sortie du conditionneur de signal OC0 si au moins un des bits COM01, COM00 est égal à 1. Toutefois, contrôle du sens de sortie de OC0 (entrée ou sortie) dans ce cas, il reste au bit correspondant du registre de direction des données du port B (DDRB.4). Pour que la valeur du registre OC0 soit présente au niveau de la broche OC0, il est nécessaire de configurer cette ligne en sortie (mettre le bit DDRB.4). Le contrôle d’entrée de fonction alternative est indépendant du mode de génération de signal.

Modes de fonctionnement du compteur-minuterie 0

Mode de fonctionnement minuterie, incl. Le comportement du compteur-minuterie et de la sortie du conditionneur de signal associé est défini par une combinaison de bits qui spécifient le mode de fonctionnement du temporisateur (WGM01, WGM00) et le mode de génération du signal de sortie (COM01, COM00). Dans ce cas, les bits permettant de définir le mode de génération du signal de sortie n'affectent pas l'algorithme de comptage, car L'algorithme de comptage dépend uniquement de l'état des bits de réglage du mode minuterie. Dans les modes avec PWM, les bits COM01, COM00 permettent d'activer/désactiver l'inversion sur la sortie PWM générée (c'est-à-dire sélectionner PWM avec inversion ou PWM sans inversion). Pour les modes non PWM, les bits COM01:0 déterminent quelle action doit être entreprise lorsque la condition de comparaison est remplie : réinitialiser, définir ou inverser la sortie.

Les modes de fonctionnement de la minuterie ont été décrits ci-dessus (normal (comptage), réinitialisation coïncidente, PWM rapide et PWM à correction de phase).

Fonctionnement asynchrone du compteur-minuterie 0

Si le compteur-minuterie 0 fonctionne de manière asynchrone, il est alors nécessaire de prendre en compte certaines fonctionnalités. Lors de la commutation entre des sources d'horloge de minuterie-compteur asynchrones et synchrones, le contenu des registres TCNT0, OCR0 et TCCR0 peut être corrompu. Pour éviter cela, la séquence de commutation sûre suivante doit être respectée :

1. Désactivez les interruptions du Timer-Counter 0 en effaçant les bits OCIE0 et TOIE0.

2. Sélectionnez la source d'horloge requise à l'aide du bit AS0

3. Écrivez de nouvelles valeurs dans TCNT0, OCR0 et TCCR0.

4. Lors du passage en mode d'horloge asynchrone, attendez que les indicateurs TCN0UB, OCR0UB et TCR0UB soient réinitialisés.

5. Réinitialiser les indicateurs d'interruption du compteur-minuterie 0

6. Activer les interruptions si nécessaire

Le générateur est optimisé pour l'utilisation d'un résonateur à quartz d'horloge à une fréquence de 32768 Hz. La fréquence d'horloge du processeur doit être au moins quatre fois supérieure à la fréquence du générateur. L'écriture dans TCNT0, OCR0 ou TCCR0 se produit sur deux fronts positifs de TOSC1, car Les données sont d'abord inscrites dans un registre temporaire puis transmises à leur destination. Chacun des trois registres mentionnés possède ses propres registres temporaires individuels. Cela signifie que, par exemple, l'écriture dans TCNT0 n'affecte pas le processus d'écriture dans le registre OCR0. Pour déterminer dans quel registre a été écrit, un registre d'état asynchrone, ASSR, est implémenté.

Si le fonctionnement asynchrone est sélectionné, alors le générateur à 32768 Hz est constamment allumé, à l'exception du mode arrêt et du mode veille du MK.

Minuterie-Compteur Préscaler 0


La source d'horloge TC0 est désignée clkT0. Par défaut, clkT0 est connecté à clkI/O. Si le bit AS0=1 dans le registre ASSR, alors TC0 est cadencé de manière asynchrone à partir de la broche TOSC1. De cette façon, vous pouvez utiliser TC0 comme horloge en temps réel (RTC). Si AS=1, alors les broches TOSC1 et TOSC2 ne servent pas de port C, et un résonateur à quartz peut être connecté entre elles comme source d'horloge distincte. La connexion d'une source d'horloge externe à la broche TOSC1 n'est pas recommandée.Le prescaler vous permet de sélectionner les signaux d'horloge suivants : clkT0S/8, clkT0S/32, clkT0S/64, clkT0S/128, clkT0S/256 et clkT0S/1024. Il est possible d'arrêter la synchronisation. Si PSR0=1 dans le registre SFIOR, réinitialise le prescaler.

Pour une description des registres 0 du compteur temporisateur 8 bits, voir la spécification.

Leçon 13

Partie 1

MLI LED clignotant doucement

Aujourd'hui, nous allons explorer la possibilité d'utiliser modulation de largeur d'impulsion dans un microcontrôleur AVR, ou, comme on dit, MLI.

Dans la documentation technique, nous verrons l'abréviation plus souvent MLI ou modulation de largeur d'impulsion, qui est également traduit.

Au fait, qu’est-ce que la modulation de largeur d’impulsion ?

MLI- il s'agit du contrôle de l'éclairage des LED, de la rotation des moteurs et autres appareils d'une manière inhabituelle, dans laquelle ce contrôle s'effectue non pas par la tension appliquée aux contacts, mais par des impulsions carrées. Dans ce cas, il n'y aura que deux types de tension - haute ( 1 ) et faible ( 0 ). Avec cette méthode, la tension résultante est calculée comme la moyenne temporelle entre le temps de l’état haut dans une impulsion et le temps de l’état bas. Nous calculons le rapport entre le temps (ou la latitude) de l'état haut et la période totale de l'impulsion. Nous appelons cela le rapport cyclique de l'impulsion. Autrement dit, plus la tension était élevée pendant la période, plus le rapport cyclique est élevé et, par conséquent, plus la tension moyenne résultante est élevée. Autrement dit, pour trouver la tension résultante, nous devons multiplier le rapport cyclique suffisamment calculé par la tension et le diviser par 100, car le rapport cyclique est généralement mesuré en pourcentage. Par exemple, si dans une impulsion carrée la largeur du zéro logique est égale à la largeur du un logique, alors le rapport cyclique sera de 50 pour cent, et si la tension est de 5 volts, alors la tension moyenne résultante sera égale à 2,5 volts. , etc. Nous pouvons avoir une meilleure idée de l'explication de cette situation en regardant le didacticiel vidéo dont le lien est donné à la fin de cet article.

Il s'agit bien sûr d'un concept très simplifié de PWM. Il existe des explications plus sérieuses sur cette technologie, mais pour nos expériences, cela suffira amplement.

Autrement dit, pour résumer l'explication, nous contrôlons la tension résultante, ainsi que la lueur de la LED, la vitesse angulaire du moteur électrique et d'autres valeurs en modifiant le rapport cyclique des impulsions.

Mais quand même, le plus intéressant est de savoir comment tout cela est organisé dans notre microcontrôleur ?

Dans un microcontrôleur Modulation de largeur d'impulsion AVR peut être organisé comme par programmation, donc matériel.

Logiciel organisation MLI- c'est à ce moment-là que nous activons un un logique sur la jambe du contrôleur pendant un certain temps, puis pendant un certain temps - un zéro logique, et ainsi de suite dans un cycle. Les avantages de cette méthode sont que nous pouvons organiser MLI sur absolument n'importe quelle branche de n'importe quel port de contrôleur, et l'inconvénient est que tout cela sera associé à des coûts considérables en temps processeur, et peut même être associé à certaines erreurs qui en résultent.

Par conséquent, quelle que soit la technologie, nous essayons toujours de respecter la méthode de mise en œuvre matérielle.

Matériel organisation MLI en MK AVR se produit au niveau minuterie 2.

Comme nous nous en souvenons de la leçon précédente, il y a trois minuteries dans notre microcontrôleur Atmega8 particulier. Les deux temporisateurs 0 et 2 sont à huit bits. Mais au niveau du 2ème temporisateur, une modulation de largeur d'impulsion est organisée.

Regardons cette photo

Ceci illustre les bits que nous devrions activer dans le registre TCCR deuxième minuterie pour démarrer la modulation de largeur d'impulsion.

Les bits WGM transforment la minuterie en mode PWM (PWM). Nous traiterons les bits restants plus tard si nécessaire.

Et maintenant, pour ressentir tout cela, nous avons besoin d'un projet que nous allons créer maintenant.

Nous créons le projet de la même manière que dans les cours précédents. Appelons-le Test10, créons et ajoutons les fichiers PWM.c et PWM.h, ces derniers prendront automatiquement forme lors de la création du préprocesseur avec les directives appropriées. Et dans le fichier principal Test01.c nous écrirons le code standard

#inclure"main.h"

//—————————————-

vide port_ini( vide)

PORTB=0x00;

DDRB=0x08;

//—————————————-

int principal( vide)

Port_ini();

Alors que(1)

Comme nous le voyons dans le code, dans le port B, nous avons connecté la broche 3 à la sortie. Dans le brochage du contrôleur, nous voyons que cette patte a une désignation alternative OC2, ce qui signifie que cette jambe peut fonctionner directement avec PWM

On peut même connecter le fichier main.h de la dernière leçon sur LCD et corriger un peu le code en y connectant notre nouveau module PWM

#ifndef MAIN_H_

#définir MAIN_H_

#définir F_CPU 8000000UL

#inclure

#inclure

#inclure

#inclure

#inclure

#inclure"PWM.h"

#fin si /* PRINCIPAL_H_ */

Eh bien, commençons maintenant à écrire du code dans une nouvelle bibliothèque pour travailler directement avec PWM - dans le fichier PWM.c.

Là, nous inclurons également le fichier d'en-tête et créerons un cadre de fonctions pour travailler avec PWM.

#inclure"PWM.h"

vide init_PWM_timer( vide)

{

}

Et nous ajouterons un prototype de cette fonction au fichier d'en-tête de notre bibliothèque, et connecterons également la bibliothèque pour travailler avec les interruptions

#ifndef PWM_H_

#définir PWM_H_

#inclure

vide init_PWM_timer( vide);

#fin si /* PWM_H_ */

Et appelez immédiatement cette fonction dans main()

port_ini();

init_PWM_timer();

Commençons maintenant à écrire du code directement dans la fonction. Nous écrivons d'abord tous les zéros dans le registre ASSR, qui existe dans le timer, mais nous ne l'utilisons en aucun cas

vide init_PWM_timer( vide)

ASSR=0x00;

Passons ensuite au registre de contrôle de notre minuterie. Nous avons discuté du but des bits WGM et de ceux que nous allons activer. Désormais, les bits COM20 et COM21 sont responsables du mode PWM lui-même. Nous sélectionnerons ce mode et en conséquence nous activerons ces bits

Et nous activerons un mode dans lequel, au début du comptage, la tension sur la jambe OC2 sera dans un état logique élevé, et dès que nous compterons jusqu'à un certain nombre, la jambe passera à un état bas et y restera jusqu'à la fin du décompte. Et ainsi de suite en cercle.

Et il ne nous reste plus qu'à installer le séparateur. Nous n'avons pas besoin d'une fréquence trop élevée. Mais quand il était trop petit, le scintillement était également perceptible, alors passons à la valeur suivante

Nous allons donc activer les trois bits.

En conséquence, la valeur du registre ressemblera à ceci

ASSR=0x00;

TCCR2=0b01101110; //PWM rapide, Clear OC2 lors de la comparaison, clkT2S/256 (à partir du prescaler) (la fréquence réelle sera de 8 MHz/256 = 31 250 Hz)

Essayons maintenant d'assembler le projet. Le projet s’est bien déroulé. Dans la prochaine partie, nous continuerons à travailler avec PWM.

Regardez le TUTORIEL VIDÉO (cliquez sur l'image)

Publications consultées : 9 484

Dans les appareils à microcontrôleur, il est parfois nécessaire de générer un signal analogique. En fonction de la fréquence du signal analogique, de la résolution requise et du type de microcontrôleur utilisé, cela peut se faire de plusieurs manières. À savoir : en utilisant la modulation de largeur d'impulsion, en utilisant la fonctionnalité de minuteries matérielles ou la mise en œuvre de logiciels, en utilisant un convertisseur numérique-analogique (DAC) intégré, en utilisant des circuits de conversion numérique-analogique externes sur des éléments discrets, ou en utilisant des circuits numériques externes -microcircuits convertisseurs analogiques.

1. Le principe de génération d'un signal analogique utilisant PWM (PWM)

Un signal PWM est un signal numérique dont la période de répétition est constante mais sa durée varie. Le rapport entre la durée d'un signal PWM et sa période est appelé rapport cyclique. En faisant passer un tel signal à travers un filtre passe-bas, ce qui équivaut essentiellement à une intégration, nous obtenons un niveau de tension à la sortie du filtre proportionnel au rapport cyclique.


Ainsi, grâce à ce coefficient, il est possible de générer des signaux analogiques de forme arbitraire. De plus, à la fois variable, par exemple une onde sinusoïdale, une scie ou une parole humaine, et constante (niveau de tension arbitraire).

1.1 Caractéristiques des signaux

Amplitude maximale de sortie analogique sera déterminé par l'amplitude de l'unité logique du signal numérique PWM. Si le microcontrôleur est alimenté à partir de +5 V, alors grosso modo, l'amplitude du signal analogique de sortie sera de 0 à 5 V.

Pas minimum de changement de signal analogique(résolution) sera déterminé par l’expression :


dUa = Umax/2^n,


où Umax est l'amplitude maximale du signal analogique (V) et n est la profondeur de bits du compteur implémentant PWM.

Par exemple, un signal PWM est généré à l'aide d'un compteur logiciel 8 bits. Le nombre de gradations de signal PWM pouvant être obtenues à l'aide de ce compteur est de 2 ^ 8 = 256. La résolution du signal analogique à Umax = 5 V sera alors égale à


dUa = 5/256 = 0,0195 V.


Fréquence du signal PWM sera défini ainsi :


Fpwm = Fcpu/(K*2^n),


où Fcpu est la fréquence d'horloge du microcontrôleur (Hz), K est le coefficient de pré-échelle du compteur, n est la taille des bits du compteur.

Par exemple, la fréquence d'horloge d'un microcontrôleur est de 8 MHz, le coefficient de pré-échelle est de 8 et la largeur du compteur est de 8 bits. Alors la fréquence du signal PWM de sortie sera égale à :

Fpwm = 8 000 000/(8*256) = ~3906 Hz


Fréquence de sortie analogique sera déterminé par l'expression :

Fa = Fpwm/Ns = Fcpu/(K*2^n*Ns),


où Fpwm est la fréquence du signal PCB et Ns est le nombre d'échantillons du signal analogique.

Par exemple, un signal PWM est implémenté sur un compteur 8 bits avec un coefficient de pré-échelle de 8 et une fréquence d'horloge du microcontrôleur de 8 MHz. La mémoire du microcontrôleur contient 32 échantillons d'un signal sinusoïdal, qui représentent une période. Alors la fréquence de la sinusoïde de sortie sera égale à :

Fa = 8 000 000/(8*2^8 * 32) = ~122 Hz

La capacité d'un DAC réalisé sur la base du PWM est équivalente à la capacité du compteur utilisé.

1.2 Implémentation matérielle de PWM

Tous les microcontrôleurs modernes incluent des minuteries/compteurs. Un ou plusieurs modes de ces minuteries sont conçus pour générer un signal PWM. Généralement, ce signal est généré sur des broches spéciales. Par exemple, le microcontrôleur mega16 d'Atmel dispose d'un minuteur/compteur 8 bits T0 qui dispose de deux modes pour générer un signal PWM (PWM rapide et PWM avec phase précise), et la broche du port B - OC0 (PINB3) est utilisée pour émettre le signal.

L'avantage d'une implémentation matérielle d'un signal PWM est la faible charge du microcontrôleur (l'interruption est appelée une fois pendant la période du signal PWM), la facilité d'utilisation et la précision (s'il y a peu d'interruptions dans le système). Les inconvénients incluent une résolution limitée des compteurs, une basse fréquence et un nombre limité de canaux sur lesquels des signaux PWM peuvent être générés. Bien qu'il existe des microcontrôleurs spéciaux spécialement « affûtés » pour générer un grand nombre de signaux PWM.

1.3 Implémentation logicielle de PWM

Vous pouvez également générer un signal PWM par programme. Pour ce faire, il vous suffit de créer un compteur logiciel et, sur la base d'un signal de minuterie matérielle, d'incrémenter sa valeur et de surveiller l'atteinte des valeurs extrêmes du compteur, auxquelles le signal PWM change d'état.

L'avantage de la mise en œuvre d'un logiciel est la simplicité, le nombre illimité de canaux et la résolution illimitée. Bien entendu, illimité sous condition, compte tenu de la mémoire disponible.Les inconvénients de la mise en œuvre du logiciel sont la charge élevée du microcontrôleur. Des interruptions doivent être appelées pour chaque incrément du compteur et à chaque fois il faut vérifier s'il a atteint une des valeurs extrêmes. De plus, la mise en œuvre du logiciel a une précision moindre (une plus grande gigue des fronts du signal) et une fréquence encore plus faible (en raison du premier inconvénient).

Cependant, malgré cela, la mise en œuvre logicielle du PWM a également sa place si vous devez générer un signal analogique constant ou alternatif, mais avec une basse fréquence.

Vous trouverez ci-dessous un exemple de code qui remplit la fonction de génération d'un signal analogique à l'aide d'une modulation de largeur d'impulsion matérielle et logicielle. Le code est écrit pour le microcontrôleur atmega16, fréquence d'horloge 8 MHz, compilateur IAR. Aux sorties PB2 et PB3, deux sinusoïdes (de fréquences différentes) de 32 deux échantillons sont générées.


#inclure
#inclure
#inclure

#définir SPWM_PIN 2

//table des sinus
__flash uint8_t tableSin =
{
152,176,198,218,234,245,253,255,
253,245,234,218,198,176,152,128,
103, 79, 57, 37, 21, 10, 2, 0,
2, 10, 21, 37, 57, 79,103,128
};

uint8_t softCount = 0 ;
uint8_t softComp = 0 ;

int principal (vide)
{
//paramètres des ports
PORTB = 0 ;
DDRB = 0xff ;

//activer l'interruption par coïncidence T0
TIMSK = (1<//Mode FastPWM, non-inv. Signal PWM, préscaler 8
TCCR0 = (1< (0<

//réinitialise le registre de comptage
TCNT0 = 0 ;
ROC0 = 0 ;

Enable_interrupt();
tandis que(1);
renvoie 0 ;
}

//minuterie d'interruption T0
#pragma vecteur = TIMER0_COMP_vect
__interrupt void Timer0CompVect (void)
{
statique uint8_t je = 0 ;
statique uint8_t j = 0 ;

OCR0 = tableSin[i] ;
je = (je + 1) & 31;

//logiciel PWM
softCount++;
si (softCount == 0)(
PORTB |= (1<softComp = tableSin[j];
j = (j + 1) & 31 ;
}

Si (softCount == softComp)(
PORTB &= ~(1< }
}

1.4 Filtre pour PWM

La fréquence de coupure du filtre doit être comprise entre la fréquence maximale des signaux analogiques générés et la fréquence du signal PWM. Si la fréquence de coupure du filtre est choisie près du bord de la bande passante du signal analogique, cela atténuera le signal. Et si la fréquence de coupure du filtre est proche de la fréquence du signal PWM, le signal analogique ne « ressortira » tout simplement pas. Plus la fréquence du signal PWM est élevée, plus il est facile de mettre en œuvre le filtre de sortie.

Regardons un exemple. Le signal PWM est généré par un compteur matériel de 8 bits avec un facteur de pré-échelle de 8, la fréquence d'horloge du microcontrôleur est de 8 MHz, le nombre d'échantillons de signal analogique est de 32.

La fréquence du signal PWM sera égale à :

Fpwm = Fcpu/(K*2^n) = 8000000/(8*256) = ~3906 Hz

La fréquence du signal analogique sera égale à :

Fa = Fpwm/Ns = 3906/32 = 122 Hz

Choisissons une fréquence de coupure de 200 Hz et calculons les valeurs du filtre RC passe-bas passif. La fréquence de coupure d'un tel filtre est déterminée par l'expression :

Fc = 1/(2*Pi*R*C),

où R est la valeur de la résistance (Ohm) et C est la capacité du condensateur (F).

Après avoir précisé la valeur de l'un des composants, vous pouvez calculer la valeur du second. Pour une résistance d'une valeur nominale de 1 kOhm, la capacité du condensateur sera égale à :


C = 1/(2*Pi*Fc*R) = 1/(6,28 * 1000*200) = ~0,8 µF


Nous sélectionnons la valeur la plus proche de la série E12 - 0,82 µF. Avec ces valeurs de filtre, nous obtiendrons un signal analogique similaire.

Cependant, en règle générale, un seul élément filtrant passif ne suffit pas. Car après cela, le signal analogique contiendra encore un grand nombre d’harmoniques.

Après avoir fait clignoter les LED, déterminé les sources de synchronisation et d'interruption, il était temps de maîtriser la minuterie du contrôleur MSP430G2553.
Une minuterie est un mécanisme de comptage lié aux impulsions d'un signal générateur d'horloge. Timer Timer_A est un timer 16 bits. Cela signifie qu'il compte de zéro au binaire 0b1111111111111111, ou hexadécimal 0xFFFF, ou décimal 65535. Le minuteur est un périphérique et possède également ses propres interruptions.
Timer_A a trois modes de fonctionnement.

Mode de comptage continu, dans lequel le minuteur compte simplement de 0 à 0xFFFF, puis recommence depuis le début, et ainsi de suite à l'infini.

Mode de comptage direct, dans lequel la minuterie fonctionne de la même manière, compte jusqu'à la limite supérieure et recommence à partir de 0. Ce n'est que dans ce mode que vous pouvez choisir la limite supérieure jusqu'à laquelle la minuterie comptera.

Le mode de comptage inverse est similaire au mode de comptage avant dans le sens où vous pouvez sélectionner la valeur maximale de la minuterie. Sa différence est qu'après avoir atteint le maximum, le chronomètre commence le décompte, puis, après avoir atteint 0, il recommence le décompte, etc.
Sur les graphiques, il y a la désignation TACCR0 - il s'agit du registre de capture de comparaison. Il peut y en avoir deux (TACCR0 et TACCR1), ou trois (TACCR0, TACCR1 et TACCR2) selon le modèle. Dans ce registre, vous pouvez écrire ce que l'on appelle les points clés, une fois atteints, la minuterie déclenchera une interruption.

Les registres du temporisateur A sont décrits en détail ci-dessous :
TACTILE– Registre de contrôle Timer_A, registre de contrôle Timer A. Utilisé pour connecter la minuterie aux signaux d'horloge et sélectionner les modes de fonctionnement.
GLANDx, bits 8 et 9, indiquent au temporisateur quelle horloge utiliser.
IDx, les bits 6 et 7 indiquent quel diviseur d'horloge utiliser, 2, 4 ou 8. La fréquence obtenue après application du diviseur dans le générateur d'horloge lui-même est divisée.
MCx, les bits 4 et 5, indiquent le mode de fonctionnement du temporisateur. S'ils sont égaux à 0 (valeur par défaut), le timer est complètement arrêté.
TACLR, bit 2. Si vous entrez un 1, cela réinitialisera la minuterie. Le microcontrôleur écrit automatiquement 0 sur ce bit après le redémarrage de la minuterie.
TAIE et TAIFG, bits 0 et 1, respectivement. Ils contrôlent l’interruption de la minuterie, plus d’informations ci-dessous.
LE GOUDRON– Timer_A Register, Timer A compteur registre, il contient la valeur actuelle de la minuterie.
TACCRx– Registres de capture/comparaison Timer_A, registres de capture/comparaison Timer A. Il peut y en avoir deux (TACCR0 et TACCR1), il peut y en avoir trois (TACCR0, TACCR1 et TACCR2) selon le modèle de microcontrôleur. En mode comparaison, nous y entrons des valeurs, une fois atteintes, la minuterie doit nous donner un signal. TACCR0 est souvent utilisé pour indiquer la limite supérieure du décompte. En mode capture, le processeur y écrit la valeur TAR actuelle en fonction du signal d'entrée.
TACCTLx– Registres de contrôle de capture/comparaison Timer_A, Registre de contrôle de bloc de capture/comparaison Timer A. Les modes de fonctionnement des registres de capture/comparaison dépendent de sa valeur.
CMx, les bits 14 et 15, déterminent le type de signal utilisé pour capturer. (En hausse, en baisse, sur les deux fronts. - Note per.)
CCISx,Bits 12 et 13, sélectionnent l'origine du signal de capture.
SCS et SCCI, bits 11 et 10 respectivement, synchronisent le signal de capture avec le signal d'horloge de minuterie. En règle générale, la minuterie fonctionne indépendamment, de manière asynchrone, des signaux externes. (Je n'ai moi-même pas bien compris cette fonction, j'écrirai plus en détail dans les leçons suivantes)
CASQUETTE, bit 8, sélection du mode de fonctionnement, 1 – mode capture, 0 – mode comparaison.
OUTMODx, bits 5-7, sélection du mode de fonctionnement du module de sortie, c'est-à-dire type de réponse à un événement de capture ou de comparaison.
CCIE et CCIFG, les bits 4 et 0 respectivement, capturent/comparent le traitement des interruptions.
CCI et SORTIE, les bits 3 et 2 respectivement, capturent/comparent l'entrée et la sortie.
COV, bit 1, capture le débordement. Mis à 1 si une deuxième capture a eu lieu et que la première n'a pas encore été lue. Doit être réinitialisé par logiciel.
TAIV– Registre de vecteurs d'interruption Timer_A, registre de vecteurs d'interruption Timer A. Puisqu'une interruption de minuterie peut être provoquée pour plusieurs raisons différentes, le contenu de ce registre indique la raison de l'appel de l'interruption.
TAIVx Les bits 1 à 3 contiennent le type d'interruption qui s'est produite, ce qui nous permet de prendre différentes actions pour gérer différentes causes d'interruption.

Ainsi, si vous avez simplement besoin de faire clignoter une LED, ou de commuter un relais, ou autre, à certains intervalles, la configuration d'une minuterie dans ce cas est très simple.

TACCR0 = 62499 ; // période 62 500 cycles TACCTL0 = CCIE ; // Permet d'interrompre le timer lorsque la valeur CCR0 est atteinte. TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR ; //Réglage du mode de fonctionnement Timer_A : // TASSEL_2 - source d'horloge SMCLK (SubMainCLocK), // configuré par défaut pour fonctionner depuis DCO // ID_3 - diviseur de fréquence par 8, à partir de 1MHz ce sera 125kHz // MC_1 - mode comptage direct (jusqu'à TACCR0) // TACLR - réinitialisation initiale de la minuterie

Mais compliquons un peu la tâche et faisons en sorte que la LED s'allume et s'éteigne en douceur. Pour ce faire, nous devons utiliser PWM. Le principe du PWM est de fournir une tension par impulsions avec une fréquence fixe et un rapport cyclique variable. PWM est caractérisé par un paramètre tel que le rapport cyclique - il s'agit de l'inverse du rapport cyclique et est égal au rapport de la durée de l'impulsion à sa période.

Pour que ce soit plus clair, la figure ci-dessous montre les signaux PWM pour le rapport cyclique : a – 25 % ; b – 50 % ; c – 75 % ; g – 100%.

t0 – temps d'impulsion ;
T – période ;
En modifiant t0, vous pouvez obtenir différentes valeurs de tension moyenne aux bornes de la charge, modifiant ainsi la luminosité de la LED.
La période de modulation de largeur d'impulsion doit être constante et supérieure au temps d'impulsion. Par conséquent, écrivons TACCR0 = 600 ; // période 600 cycles. J'ai sélectionné ce numéro expérimentalement afin que le fonctionnement de la minuterie soit visible à l'œil nu.
Comme la LED doit commencer à s'allumer lentement, la durée d'impulsion initiale doit être très courte, par ex. TACCR1 = 10 ; // temps d'impulsion 10 cycles. TACCR1 est le deuxième registre de capture/comparaison du Timer A. Ainsi, il s'avère que lorsque la valeur TACCR0 = 600 est atteinte, le timer générera une interruption dans laquelle nous mettrons la sortie du microcontrôleur à un, ce qui sera le début de le pouls. Dans ce cas, le timer est remis à zéro et recommence à compter à partir de zéro jusqu'à atteindre TACCR1 = 10, puis une interruption sera générée dans le deuxième registre de capture/comparaison, dans laquelle nous mettrons à zéro la sortie du microcontrôleur. Ainsi, la durée d'impulsion t0 durera 5 cycles d'horloge.
Pour que la LED augmente l'intensité de la lueur, il est nécessaire d'augmenter le temps d'impulsion. Pour ce faire, après chaque interruption de TACCR0, nous ajouterons une valeur à la valeur actuelle de TACCR1. Dans ce cas, la valeur maximale que TACCR1 peut avoir sera égale à la période, soit 600. En fonction de la valeur que nous ajoutons, la douceur et la vitesse de changement de l'intensité de la lueur dépendront.

TACCR0 = 600 ; // Période TACCR1 = 5 ; //Temps d'impulsion TACCTL0 = CCIE ; // Autorise l'interruption du timer lorsque CCR0 est atteint. TACCTL1 = CCIE ; // Autorise l'interruption du timer lorsque CCR1 est atteint. TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR ; //Réglage du mode de fonctionnement Timer_A

Vous devez maintenant écrire un gestionnaire d'interruption pour TACCR0, qui définira le début de chaque nouvelle période, ainsi qu'ajouter ou soustraire la valeur de TACCR1 afin que la LED s'allume et s'éteigne tout aussi doucement.

#pragma vector = TIMER0_A0_VECTOR __interrupt void CCR0_ISR(void) //vecteur d'interruption pour TACCR0, Timer A ( P1OUT |= BIT0; // définit le bit zéro sur un si (TACCR1><=5) // если TACCR1 меньше минимального значения, то увеличиваем TACCR1 { indeX=2; } if (indeX == 1) { --TACCR1; // уменьшаем TACCR1 на 1 } if ((indeX == 2) || (indeX == 0)) { ++TACCR1; // увеличиваем TACCR1 на 1 } }

L'interruption pour TACCR1 ressemblera à ceci.

#pragma vector=TIMER0_A1_VECTOR __interrupt void CCR1_ISR(void) //vecteur d'interruption pour TACCR1, Timer A ( P1OUT &= ~BIT0; // met le bit zéro du port P1 à zéro. TAIV &= ~TA0IV_TACCR1; // réinitialise l'interruption drapeau. )

Veuillez noter que dans le premier cas, dans le gestionnaire d'interruption de TACCR0, je n'ai pas réinitialisé l'indicateur d'interruption, mais pour TACCR1, je l'ai fait. En effet, l'indicateur d'interruption pour TACCR0 est réinitialisé automatiquement lorsqu'une telle interruption est appelée, mais pour TACCR1, il doit être réinitialisé manuellement.

Vous pouvez maintenant rédiger le texte intégral du programme.

#inclure /* Variables globales */ unsigned int index = 0; /* Déclaration de fonction */ void main(void) ( WDTCTL = WDTPW + WDTHOLD; // désactive le temporisateur de surveillance P1DIR |= 0x01; // définit le bit zéro du port P1 sur la sortie P1OUT = 0x01; // définit le zéro bit du port P1 à un BCSCTL1 = CALBC1_1MHZ; // Définir la fréquence DCO DCOCTL = CALDCO_1MHZ; TACCR0 = 600; // Période TACCR1 = 10; // Temps d'impulsion TACCTL0 = CCIE; // Autoriser l'interruption du temporisateur lorsque CCR0 est atteint TACCTL1 = CCIE; // Permet d'interrompre le timer en atteignant CCR1 TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; //Réglage du mode de fonctionnement Timer_A : // TASSEL_2 - Source d'horloge SMCLK (SubMainCLocK), // configuré par défaut pour fonctionner depuis DCO // ID_3 - diviseur de fréquence par 8, à partir de 1MHz ce sera 125kHz // MC_1 - mode de comptage direct (jusqu'à TACCR0) // TACLR - réinitialisation initiale du timer _enable_interrupt(); // activer toutes les interruptions ) #pragma vector = TIMER0_A0_VECTOR __interrupt void CCR0_ISR(void) //vecteur d'interruption pour TACCR0 , Timer A ( P1OUT |= BIT0; // définit le bit zéro sur un if (TACCR1>=(TACCR0-5)) // si TACCR1 est supérieur à TACCR0, puis diminuer TACCR1 ( indeX=1 ; ) si (TACCR1<=5) // если TACCR1 меньше минимального значения, то увеличиваем TACCR1 { indeX=2; } if (indeX == 1) { --TACCR1; // уменьшаем TACCR1 на 1 } if ((indeX == 2) || (indeX == 0)) { ++TACCR1; // увеличиваем TACCR1 на 1 } } #pragma vector=TIMER0_A1_VECTOR __interrupt void CCR1_ISR(void) //вектор прерывания для TACCR1, Таймера А { P1OUT &= ~BIT0; // устанавливаем нулевой бит порта Р1 в ноль. TAIV &= ~TA0IV_TACCR1; //сбрасываем флаг прерывания. }

Donc, nous flashons le contrôleur, lançons le programme et voyons que la LED rouge s'allume et s'éteint lentement, s'allume et s'éteint.
Ce programme est très pratique à utiliser dans la pratique. Disons que vous devez modifier la luminosité d'une lampe à diode ou la vitesse de rotation d'un moteur à courant continu, toutes ces choses peuvent être parfaitement mises en œuvre à l'aide de PWM, qui peut être contrôlé à l'aide d'une minuterie disponible dans le contrôleur MSP430G2553. Une série d'articles sur le contrôle d'un moteur à courant continu à l'aide de PWM apparaîtra certainement sur notre site Web, où nous appliquerons ces compétences dans la pratique.