ACCUEIL  ACTUALITES  FORUMS  WIKI  TELECHARGEMENTS  LIENS
Menu principal
ATMEL AVR
PCB - CAO
ELECTRONIQUE
Qui est en ligne
8 utilisateur(s) en ligne

Membre(s): 0
Invité(s): 8

plus...
Infos du site
JELECTRONIQUE - Atmel (ATMEGA,AT90S8535), AVR, Microcontroleurs, CodeVision, dongle ISP, programmateurs

PWM a fréquence fixe

(en cours de rédaction)


Le but de la manip est de réaliser une PWM avec une période de 20ms et avec un état haut d'une durée de 0.5ms.

On va déjà voir si le Timer0 (8bits) peut convenir.
On va dire qu'on a un quartz de 4Mhz sous la main et qu'il faut se débrouiller avec celui-ci.
Dans le datasheet on remarque déjà qu'il y a différents modes possibles :

  • Le match (CTC) Mode: Ce n'est pas ce qu'on veut vu que la période est variable.
  • Le Phase Correct PWM Mode: Idem la période est variable.
  • Le Fast PWM Mode : On voit bien que chaque début de période est déclanché quand TCNT0 arrive à sa valeur max, ce qui est parfaitement périodique. (parfait c'est ce qu'on souhaite)

 

La 1ere étape consiste à fixer notre période de 20ms. On a vu que c'est le temps que prend TCNT0 pour arriver à sa valeur max.
Le datasheet donne une formule pour déterminer cette fréquence.


FPWM=Fquartz/(N.256)
avec N={1,8,64,256,1024}

N=Fquartz/(FPWM.256)

Explication:

La fréquence qui cadence le timer est issue du quartz qui passe préalablement par un diviseur par 1,8,64,256 ou 1024.
A chaque front de cette hologe Timer0, le registre TCNT0 est incrémenté, la taille du registre est 0xFF (cf datasheet) et on sait que le front montant (début de chaque période) du PWM est déclanché quand TCNT0 arrive à FF.

FPWM=1/20ms=50Hz. Il nous reste plus qu'à résoudre pour trouver la valeur de N qu'il nous faut.

Solution: N= 312.5 ce qui nous arrange pas parce que ca ne correspond à aucune valeur de N possible (1,8,64,256 et 1024)

A la limite on pourrait prendre 256, ce qui se rapproche le plus de 312.5, mais ca nous donnerait une fréquence de 61Hz.

Pour avoir exactement 50Hz :

On a :

  • La valeur du quartz qui est fixe (4Mhz)
  • Le diviseur qui l'est aussi plus ou moins. (1,8,64,256 et 1024)
  • Le nombre de pas pour déclancher une période (0xFF)

On n'a plus aucune variable sur laquelle jouer donc à va se tourner vers le mode Fast PWM du Timer1 (16bits) voir s'il propose plus d'option.

Dans le datasheet on voit, avec joie, qu'avec le Timer1 on peut fixer la valeur max du TCNT1 !
Plus exactement le front montant du PWM peut être déclenché quand TCNT1=ICR1 avec ICR1 paramétrable entre 0x0000 et 0xFFFFF :-D

Ce qui fait que le nombre de pas qui avant était fixe (0xFF) est maintenant variable.

FPWM=Fquartz/((N.(1+TOP))

TOP=Fquartz/(FPWM.N)-1

Fquartz = 4 Mhz
FPWM = 50Hz
N = {1,8,64,256,1024} (on va prendre 64, en déduire la valeur de TOP et vérifier si elle est bien comprise dans la plage 0x0000 et 0xFFFF
TOP étant la valeur de ICR1.

Solution :

TOP = 1250 soit 0x04E2 0x0000 < 0x04E2 < 0xFFFF <= Super c'est bon.
Vu que ICR1 est un registre de 16bits il se divise en 2 registres de 8Bits.
ICR1H=0x04
ICR1L=0xE2

A ce stade on peut déjà tester la période en fixant une valeur arbitraire à OCR1A comme ICR1/2 =0x0271.
OCR1AH = 0x02
OCR1AL = 0x71

Vérification du 50Hz OK et on a bien un rapport cyclique de 1/2

Maintenant il faut modifier le temps ou le signal est à l'état haut.

On a ICR1=0x04E2 = TOP = 1250

Donc on a 1250 incréments de TCNT1 pour chaque période. Le diviseur de fréquence est de 64 donc le Timer1 est cadencé à 4Mz/64 soit 62.5Khz.

Le temps entre chaque incrément de TCNT1 est de 1/62.5Khz = 16.129µs.

Combien nous faut-il d'incrément pour avoir nos 0.5ms ?

x.16.129µs=0.5ms x=31

OCR1A=31=0x001F
OCR1AH=0x00
OCR1AL=0x1F

Télécharger le fichier source pour ATmega32

Période de 20ms

Etat haut 0.5ms