Go Down

Topic: Précision sur le nombre de PWM d'un arduino (Read 906 times) previous topic - next topic

ledieuaeris

Hello,

Je n'ai pas encore utilisé d'arduino et en regardant la documentation je me suis posé une question sur les PWM.
Il est souvent dit (entre autre sur l'ATmega328) qu'il possède 6 channel PWM, cela signifie qu'il est possible d'avoir 6 PWM différents avec chacun un duty cycle différent ou bien qu'il y a 6 sorties mais qu'on retrouvera exactement le même pwm avec le même duty cycle sur les 6 sortie?

Si c'est la deuxième solution y a t'il un arduino qui possède 6 PWM totalement indépendant les uns des autres?

Merci pour les futurs reponses^^ :)

Super_Cinci

#1
Feb 12, 2012, 09:37 am Last Edit: Feb 12, 2012, 09:40 am by Super_Cinci Reason: 1
La description des PWM matérielles (j'entends par là qu'une fois initialisé, il suffit d'inscrire une valeur dans un registre pour que la PWM tourne toute seule à la valeur choisie, déchargeant totalement le CPU) est très bien expliquée dans le datasheet de 400 pages de l'arduino. "Très bien expliquée" si on parle aussi bien anglais qu'un ingé R&D anglais...

Pour faire simple : dans un µP ATMEL, il y a N timers possédant chacun X(n) sorties matérielles de comparaison. Chaque sortie de comparaison (OCnX) peut être une voie PWM tournant à la fréquence du timer (Tn) qui lui est associé. n = numéro du timer, X : numéro de la sortie de comparaison (Output Compare)

Pour l'ATMEGA328 (6 PWM):
N = 3.
Timer0 (8 bits) : OC0A (pin 6), OC0B (pin 5). Mais ce timer est utilisé par le bootloader. Le détourner rendrait certaines fonctions inopérantes ou foireuses (millis(), delay()...).
Timer1 (16 bits) : OC1A (pin 9), OC1B (pin 10).
Timer2 (8 bits) : OC2A (pin 11), OC2B (pin 3).

Pour l'ATMEGA2560 (15 PWM) :
N = 6.
Timer0 (8 bits) : OC0A* (pin 13), OC0B (pin 4). Mais ce timer est utilisé par le bootloader. Le détourner rendrait certaines fonctions inopérantes ou foireuses (millis(), delay()...).
Timer1 (16 bits) : OC1A (pin 11), OC1B (pin 12), OC1C* (pin 13).
Timer2 (8 bits) : OC2A (pin 10), OC2B (pin 9).
Timer3 (16 bits) : OC3A (pin 5), OC3B (pin 2), OC3C (pin 3).
Timer4 (16 bits) : OC4A (pin 6), OC4B (pin 7), OC4C (pin 8).
Timer5 (16 bits) : OC5A (pin 46), OC5B (pin 45), OC5C (pin 44).
* Attention, OC1C et OC0A se partagent la même broche, utiliser de préférence OC1C.


Les sorties PWM dépendantes d'un même timer auront forcément la même fréquence, mais les angles restent indépendants.
Après, tu peux configurer indépendamment chaque timer à une fréquence "de ton choix", selon la résolution que tu souhaites. Je déconseille l'utilisation de analogWrite(), car on obtient des résultats peu précis (et un fréquence PWM un peu dans les choux). Pour la config, et une PWM au top, je conseille de programmer les registres du timer concerné (Tn) en mode "Fast PWM" avec TOP=ICRn. De cette manière, on garde un contrôle total de la fréquence PWM en jouant entre les registres prescaler (CSn) et ICRn (voir datasheet pour les codes à utiliser), et en une seule instruction [OCRnX = valeur PWM;], on change l'angle (ou le alpha) de la sortie PWM. Mais c'est mon avis que je ne saurais imposer même si je suis convaincu que c'est la seule façon de savoir exactement ce que l'on fait...

fdufnews

Quote
cela signifie qu'il est possible d'avoir 6 PWM différents avec chacun un duty cycle différent

Oui

Go Up