changer la fréquence PWM

bonjour :) j'aimerai bien utiliser les pin PWM de l'arduino uno mais avec une fréquence plus élevée. la question a été déjà posé mais je ne trouve toujours pas comment faire changer la fréquence. et es que je peux utiliser un autre composant qui génère des PWM avec une fréquence réglable et que le rapport cyclique soit donné par une carte arduino. cela est pour commander un convertisseur buck boost merci d'avance

Deux ou trois registres du timer concerné à modifier. Mais il faut avoir le courage de lire la datsheet et être capable de la comprendre.

Sinon vu tu as déjà posé la question sur la zone anglaise tu peux les relancer. Il y a une bibliothèque en train d'être développée, peut-être elle est terminée.

bonjour oui j'ai déjà posé la question :( mais mais j'ai pas pu comprendre comment je peux modifier les registres timer. et comment le faire et ou je dois l'écrir dans mon programme. j'ai pas arrêté de lire à droite et à gauche mais rien pour l'instant

Pour mettre le bit de rang N d’un registre à 1 sans toucher aux autres bits :
NOM_DU_REGISTRE |= (1<< N) ;

Pour mettre le bit de rang N d’un registre à 0 sans toucher aux autres bits :
NOM_DU_REGISTRE &= ~(1<< N) ;

Pour plus de documentation chercher “manipulation des registres” ou “bitwise”

La fréquence se modifie en modifiant le pre-scaler du timer.
Exemple avec le timer 2 c’est dans le registre TCCR2B qu’il faut modifier les bits CS22, CS21, CS20

Il faut aussi connaître quelles sorties sont connectées à quel timer (elles sont globalement repérées par un tilde sur les cartes UNO et Mega sans indication de numéro de timer)

Avec une carte UNO et un atmega328p chaque timer ne peut commander que 2 sorties.

Timer 0 sorties :

  • OC0A → ref arduino D6
  • OC0B → ref arduino D5

Timer 1 sorties :

  • OC1A → ref arduino D9
  • OC1B → ref arduino D10

Timer 2 sorties :

  • OC2A → ref arduino D11
  • OC2B → ref arduino D3

Bon j’ai assez débrousaillé le terrain à toi de lire la datasheet pour la suite.

PS : le timer 0 sert aussi aux fonctions de gestion du temps : delay() et millis() donc toute modification du préscaler de T0 cassera ces fonctions, tu es prévenu il est préférable d’utiliser T2 (8 bits-> plus simple) ou T1 (16 bits).

Bonjour,

Ici tu as un tuto en français

merci beaucoup :) un grand merci, vous avez prit le temps de m'expliquer :)

dans le tutoriel (http://www.pobot.org/Modifier-la-frequence-d-un-PWM.html) j'ai trouvé écrit: L’horloge I/O est déjà 256 fois moins que l’horloge CPU, soit 62500 Hz. C’est cette valeur qu’on va pouvoir diviser, elle constitue donc notre fréquence maximum (sans avoir à modifier le prescaler de l’horloge I/O ou à utiliser une horloge externe). et donc la fréquence et de 62kHz, si je veux utiliser cette fréquence j'écris: void setup () { TCCR2B = TCCR2B & 1b00111000; //pour pin 3 TCCR2A = TCCR2A & 2a00111000;// poue pin 11 } et cela pour diviser la fréquence 62500 hz par un (1) et que la fréquence du PWM sur pin 3 et pin 11 soit 62500

Plus exactement:

TCCR2B = TCCR2B & 0b00111000 | 1; // pour pin 3 et 11 -> 31.3 KHz TCCR0B = TCCR0B & 0b11111000 | 1; // pour pin 5 et 6 -> 62.5 kHz

Bonsoir :) merci beaucoup pour votre réponse pin 5 et 6 utilise le timer0? je pense! je veux utiliser 3 et 11 pour ne pas nuire au instructions delay() et les pin 3 et 11 je ne peux pas monter à 31.3KHz? et si je veux dépasser 62.5Khz comment je ferais?

La fréquence des pwm des pins 3 et 11 est moitié de la fréquence des autres. Il est sans doute possible de dépasser 62 kHz en modifiant le diviseur par 256, mais je ne l'ai jamais fait

lorsque je lis sur le tableau que 001 c'est divisé par 1 et 010 c'est divisé par 2: c'est à dire 62500Hz /2 =31250 Hz? et lorsque vous disiez en modifiant le diviseur par 256 (101-->TCCR1B = TCCR1B & 0b10111000; // pour pin 9 et 10 -> sa donne combien la fréquence)

Les différentes valeurs de pré-diviseur : Timer 0 : N = 1, 8, 64, 256, 1024 Timer 1 : N = 1, 8, 64, 256, 1024 Timer 2 : N = 1, 8, 32, 64, 128, 256, 1024

Les différents modes de PWM Timer 0 - Fast PWM formule de calcul page 101 - Phase corect PWM formule de calcul page 102 --> fréquence moitié --> normal voir le graphique explicatif du fonctionnement

Timer 1 - Fast PWM : formule de calcul page 126 - Phase corect PWM : formule de calcul page 127 - Phase and Frequency correct formule de calcul page 129

Timer 2 - Fast PWM formule de calcul page 149 - Phase correct PWM : formule de calcul page : 150

Nota : 1) Choisi le mode Fast PWM c'est le plus simple et tu pourra obtenir la même fréquence quelque soit le timer. 2) Comme a 99,99 % cela me parait être un sujet pour le bac qui n'avance pas à visage découvert tu peux utiliser les oscilloscopes ou analyseurs logiques de ton lycée pour vérifier les fréquences produites. 3) Si tu es dans les 0,01% tu peut acquérir sur Ebay un clone d'analyseur logique Saleae à 6€ : c'est une petite merveille qui peut aussi afficher les fréquences.

bonjour :) j'ai pas pu trouvé la datasheet dont vous parlez! j'ai pas arrêter de chercher mais pas moyen! c'est pas un projet de BAC, je fais mes débuts sur l'arduino uno... je veux comprendre que voulais vous dire par les valeurs de prédiviseur? en prenant l'exemple du timer 0: lorsque j'utilise la valeur 8 par exemple, que cela veut dire par rapport à la valeur de fréquence sur pin 5 ou 6.

Bonjour,

Cest la datasheet de l'atemega328 trouvable ici

Ce ne doit pas être tout à fait la même version que celle de 68tjs car il y a une ou deux pages de décalage.

merci beaucoup Kamill

pouvez vous m'expliquer que veux dire le nombre 8 ou 256 du prédiviseur? cela veux dire que la fréquence 62500 Hz est diviser par 8 ou par 256?

Effectivement je n’avais pas la dernière version de la datasheet:

Prédiviseur ou prescaler en anglais.
Le micro-contrôleur a une horloge c’est obligatoire. Il en a même plusieurs :une principale et plusieurs secondaires.
L’horloge principale est obtenu avec le quartz ou le résonnateur.
Les horloges secondaires sont obtenues en divisant l’horloge principale. Seul des puissances entières de 2 sont acceptées dans un avr.

Les différents diviseurs sont appelés en anglais des préscalers. On leur affecte le préfixe “pre” parce qu’il sont situés avant l’utilisation, soit ici avant le timer.

Exemple pour construire l’horloge destinée au timer x on peut utiliser différents diviseurs de l’horloge principale.
Si le quartz ou le résonateur battent à 16 MHz on aura comme horloge du timer :
N= 1 → 16 MHz
N= 8 → 2 MHz
N= 1024 = 15,625 kHz.

Çà c’est l’horloge du timer maintenant si on regarde le cas particulier de la PWM.
La PWM comporte 256 incréments de temps entre tout à 0 et tout à 1
L’incrément de temps de base est égal à une période de l’horloge timer
Donc si N= 1, les 256 incréments prendront 256 fois la période de l’horloge timer soit exprimé en fréquence : 16MHz/256 = 62,50 kHz qui est la fréquence de répétition max de la PWM que peut fournir un micro 8 bits avr avec un quartz de 16 MHz
et si N était égal à 1024 la fréquence de PWM serait : 16 MHz/(1024*256) = 61,035 Hz

Rappel : Période = 1/Fréquence

En conclusion pour avoir la fréquence de répétition de la PWM la plus élevée :
Il faut prendre un timer 8 bits, ou avec le 16 bit mettre la valeur TOP à 255.
Il faut donner la valeur 1 au prescaler du timer.
La période de répétition (c’est à dire temps du 1 + temps du 0) sera égale à Tpwm = 256/16106 = 16 µs soit 62,50 kHz
L’incrément de temps sera égal à 1/16
106 = 62,5 ns

Nota : J’ai un doute entre prendre 255 ou 256 : c’est toujours la même question casse-pied entre le nombre de poteaux et le nombre d’intervalles. Mais cela ne change rien au raisonnement.

merci beaucoup pour vos réponse :) je veux commander un transistor MOS par le biais de l'arduino, je veux utilisé la PWM des pin arduino je veux just savoir que dois je écrire sur le void setup () {} pour que la fréquence du pin 3 soit à 62.5KHz ou par exemple la fréquence du PWM à la sortie du pin 11 soit à 31.250Khz. je comprend mieux par des exemples, car ce que je veux est un truc plus tôt simple et encore une fois merci beaucoup pour votre précieuse aide :)

toutou2525: je veux just savoir que dois je écrire sur le void setup () ...

Réponse ici

merci Kamill si je change la fréquence du timer o pour les pin 5 et 6 ça va influer les instructions delay() millis() ... alors si je veux utiliser un timer 1 pour avoir une fréquence plus élevée j'écris: TCCR1B = TCCR1B & 0b00111000; // pour pin 9 et 10 -> 62.5 kHz