# Utiliser les PIC 16F et 18F/Le mode PWM du module CCP (Capture Compare PWM)

PWM signifie « Pulse Width Modulation », ce qu’on pourrait traduire par modulation de largeur d’impulsion. Son objectif est de changer une valeur moyenne en jouant sur le rapport cyclique. Puisque ce module utilise essentiellement le timer 2, nous commençons donc à le décrire.

## Description du timer 2

Le timer 2 est identique sur le PIC® 16F877 et le 18F4550. Il s'agit d'un timer 8 bits dont la description schématique est présentée maintenant.
Sa seule entrée est l'entrée horloge du PIC® divisée par 4 suivie d'un pré-diviseur géré par deux bits. Un comparateur donne un signal qui sert de reset au timer2 et d'entrée à un post-diviseur capable de diviser par un nombre entre 1 et 16.

### Fonctionnement du timer 2

* On part du quartz car il s'agit d'un timer. Il est comme d'habitude divisé par 4, puis passe dans un nouveau diviseur programmable qui utilise les bits T2CKPS1 et T2CKPS0 du registre T2CON.
* On arrive ensuite à un ET logique qui laisse entendre que l’on peut couper cette horloge qui arrive au Timer2 (le timer 2 peut s'arrêter). Cela se fait à l'aide du bit TMR2ON du registre T2CON.
* Ce timer utilise son propre dispositif de comparaison : sa valeur est sans cesse comparée au registre PR2.
* La comparaison est ensuite "filtrée" par les bits TOUTPS3 ... TOUTPS0 du registre T2CON.
* Cette comparaison filtrée aboutit au bit TMR2IF du registre PIR1.
* Remarquez aussi que cette comparaison réalise un reset du timer 2 (avant le "filtrage").
La période T peut être calculée par :
T = (PR2 + 1) x (Timer2 input clock period) soit :

### Les bits des registres concernés avec le compilateur Hitech C

Comme d'habitude, on cherche les valeurs des bits des registres T2CON et PIR1 à l'aide des fichiers d'inclusion :

## Le PWM

Quand on s'intéresse au PWM le choix de la période est réalisé simplement comme dans l'exercice 1. Puisque le timer2 est sur 8 bits, la résolution de la période est de 256. Le choix du rapport cyclique est par contre défini par le contenu d'un registre 8 bits CCPR1L avec deux bits supplémentaires DC1B1 et DC1B0. Ceci est montré dans la documentation ci-contre. Nous allons donner quelques explications.
* On utilise le timer 2 et son RESET par comparaison. Cela permet d’avoir une période constante.
* Le timer 2 est donc l'élément central. Il est sur 8 bits mais on voit facilement sur le schéma qu'on lui a ajouté 2 bits supplémentaires pour en faire une valeur sur 10 bits.
* Ces deux bits ajoutés sont pilotés directement par le quartz et, chose exceptionnelle, sans passer par le diviseur par 4 (flèche rouge du dessin).
* On a donc maintenant une valeur du timer2 sur 10 bits. Pour simplifier les explications, on appellera cette valeur timer2_10b.
* La valeur timer2_10b est comparée (on discutera avec quoi un peu plus tard) et le résultat de cette comparaison va sur un reset. Autrement dit nos 10 bits gèrent ton.
Arrivé à ce point, on sait que la période se gère sur 8 bits (comparaison avec PIR2), tandis que ton se gère sur 10 bits. C'est tout à fait normal quand on y réfléchit car on a besoin de peu de précision pour la période (d'un hacheur par exemple) mais de beaucoup de précision pour le rapport cyclique. En effet, c’est ce rapport cyclique qui gère la vitesse et augmenter sa résolution revient à augmenter la précision de gestion de la vitesse.
Mais continuons nos explications.
* La comparaison de timer2_10b se fait avec CCPR1H (8 bits) auxquels on a ajouté 2 bits. Pour comprendre d'où viennent ces deux bits il nous faut comprendre comment on écrit dans CCPR1H ?
* L'écriture dans CCPR1H se fait à l'aide de CCPR1L (registre 8 bits) auquel on ajoute deux bits DC1B1 et DC1B0 du registre CCP1CON. Le passage des valeurs de CCPR1L vers CCPR1H ne se fait qu'après une comparaison de tmer2_10b, c'est-à-dire à la fin d'un ton (flèche verte sur le dessin).
* On peut remarquer aussi que la sortie générale de tout cela se fait dans le bit RC2 de PORTC.
Le PWM ne fonctionnera correctement que si $CCPR1L<=PR2$.
La formule permettant de calculer $t_{on}$ est :
notez la disparition du terme 4 dans cette formule : ce n'est plus 4.Tosc mais bien Tosc.

## Librairie Mikro C

Prototype :
Exemple :
Prototype :
Description :
Exemple :
Prototype :
Prototype :

### Exemple

| Le mode capture du module CCP (Capture Compare PWM) | Sommaire |