Dans le second tutoriel, nous avons introduit les timer et montrer comment utiliser leurs interruptions. Ce tutoriel va faire exactement la même fonctionnalité sans avoir recours aux delais ni aux interruptions, par PWM.

 About PWM

PWM signifie Pulse Width Modulation ou en français modulation de largeur d'impulsion. Nous allonse configurer un timer qui n'aura pas besoin d'interruption. Le timer va compter indépendemment du processeur, sans limite.

Explication de la fonctionnalité PWM du Timer

TimerA

 

Les timers du MSP430 ont une caractéristique intéressante: ils ont plusieurs registres de comparaison qui peuvent être configurés de différentes façons. Les timers peuvent aussi avoir une sortie directe sur les pattes du processeur. Nous allons utiliser ces fonctionnalités.

Prenons un exemple. Supposons que nous configurons le timer pour qu'il compte jusqu'à TA0CCR0. Ceci a déjà été fait au tutoriel 2. Par exemple TA0CCR0 = 32767. Maintenant, ajoutons un registre de comparaison. Par exemple TA0CCR1 = 16383. Ensuite, configurons le timer de sorte que le résultat (binaire) de la comparaison aille sur une patte externe.
La figure de gauche montre ce que serait cette sortie en fonction des différents modes. Par exemple si nous choisissons le mode 7 (reset set), tant que le compteur sera inférieur à 16383, la sortie sera à 1, et à partir de 16384 elle sera
 à 0. Dans ce cas, le pourcentage de signal haut variera proportionnellement au registre de comparaison.

Les autres modes permettent différentes fonctions pour configurer par exemple des timers en coup unique, ou en rapport cyclique à 50%.

 

Le programme

 Comme précédemment, nous incluons les utilitaires (F5659Utils.h).

--------------------

#include <msp430F5659.h>
#include "F5659Utils.h"

int main(void) {
    WDTCTL = WDTPW + WDTHOLD;            //    Stop WDT
    SetCoreVoltage(VCORE19);             //    Set the core to 1.9V
    SetFLL(24);                          //    Set SMCLK to 24 MHz
    P1DIR |= 0x04;                       //    P1.2 output
    P1SEL |= 0x04;                       //    P1.2 as timer output
    TA0CCR0 = 32768-1;                   //    PWM Period
    TA0CCTL1 = OUTMOD_7;                 //    CCR1 reset/set
    TA0CCR1 = 16384;                     //    CCR1 PWM duty cycle
    TA0CTL = TASSEL_1 + MC_1 + TACLR;    //    SMCLK, up mode, clear TAR
    __bis_SR_register(LPM0_bits);        //    Enter LPM0(sleep)
}

--------------------

The result is the same as follows:

AccurateClock

 

 

 

 

 

 

 

 

 

Comme nous pouvons le voir, il y a de nombreux avantages à cette méthode.

  • Le program est devenu très simple, quelques lignes de configuration et rien d'autre
  • Plus besoin d'interruption, le timer est complètement indépendent
  • Le processeur n'est pas du tout sollicité et peut par conséquent servir à d'autres tâches
  • On peut changer les paramètres du timer au vol.

Ce dernier avantage sera utilisé pour moduler la luminosité d'une LED.

Téllécharger le programme

Un sommaire de ces prmiers programmes est téléchargeable en fichier zip ici.