PWM arduino

Bonjour
SVP je veux bien savoir si je peux aller au de la de 62.5KHz sur une sortie PWM d'une carte arduino uno?
merci pour vos réponses

Le tout cuit c'est pas bon. Un peu de réflexion n'a jamais fait de mal.

Question 1:
Quel est est l'unité de temps minimale dans un micro-controleur ?
Réponse :
Une période horloge système. C'est à dire dans le cas présent 1 période de 16 MHz.

Question 2 :
Quel est le nombre de bits minimal pour la PWM ?
Reponse :
8 bits pour les timers 0 et 2. Soit 256 pas
8, 9, 10 bits pour le timer 1. Soit 256, 512, 1024 pas

Tu peux calculer la fréquence max de PWM
Fmax = Fsyst/Nombre_de_pas = 16 MHz/256 = ?

en tant que débutant c'est flou, mais merci beaucoup pour vos explications

en tant que débutant c'est flou,

En résumé :
Je t'ai dit qu'en conservant un timer à 8 bits tu ne peut pas aller au delà de 62,5 kHz.

pepe a complété en signalant que si tu accepte de perdre en définition (moins de pas) tu peux augmenter la fréquence de PWM.
Mais qu'il te faudra tout gérer toi même après une lecture appronfondie de la datasheet et peut être une visite sur le site Mike Gammon.

Et plus particulièrement ce paragraphe là

Timer 0, mode 7 (fast PWM mode, top at OCR0A)

C'est clair qu'alors tu sors du confort arduino.

Bonjour
merci beaucoup pour vos réponses :slight_smile:
je voudrais savoir si je veux descendre à 31.125 Khz je dois diviser 16Mhz par 1024 et donc dans le void setup je dois écrire TCCR2B = TCCR2B & 0b00111000 | 1; cela pour pin 3 et 11?

merci beaucoup
ce que je cherche en fait c'est un truc simple :slight_smile:
je veux avoir une fréquence PWM d'environ 16Mhz/512=31.25Khz, pour cela je dois écrire quoi sur le void setup car je trouve que:

TCCR0B = TCCR0B & 0b11111000 | 1; // pour pin 5 et 6 -> 62.5 kHz

je voudrais savoir si je veux descendre à 31.125 Khz je dois diviser 16Mhz par 1024

Je ne pense pas.

je reprends :
le plus petit incrément de temps que l'on peut faire c'est 1 période d'horloge système soit 16 mHz
Comme le timer est sur un octet (8 bits) le nombre de pas est égal à 256.
Donc la fréquence de récurence pour la PWM la plus élevée possible est 16MHz/256 = 62,5 kHz en mode Fast_PWM.
Comme pepe te l'a fait juducieusement fait remarqué arduino règle par défaut dans la fonction (cachée) init() le timer 2 en mode "phase corect".
Si tu divise l'horloge système par 1024 cette fréquence va tomber à 61 Hz.

Détaille ce que tu veux faire qu'on ne soit pas obligé de jouer aux devinettes. Par exemple je ne connais pas par cœur les numéros de pin commandés par le timer 2 : est-ce que les pins 3 et 11 sont OC2A et OC2B ?
OC2A et OC2B c'est fonctionnellement plus parlant pin 3 et 11 qui n'ont aucune relation directe avec la référence Atmel (c'est du Wiring/arduino)

Un conseil : 0b00111000 c'est illisible et cela me parait faux puisque les bits 4 et 5 sont non affectés et en lecture seule.
TCCR2B
Bit 7 6 5 4 3 2 1 0
FOC2A FOC2B – – WGM22 CS22 CS21 CS20
R/W W W R R R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

Utilise plutôt les mnémoniques de la data sheet et le décalage de bits.
0b00001000 = (1<<CS22);
Erreur d'inatention il faut lire :
0b00111000 =(1 << WGM22);
et toujours par clarté utilise plutôt :
Pour mettre à 1 un pour plusieurs bits particulier :
TCCAEFG |= ** (1<<GHR) |** (1 << ERT5)** | ** ( 1<< DERT);
et pour mettre à 0 :
TCCAEFG &= ~(1<<GHR) & ~(1 << ERT5);

A la mise au point et surtout à la relecture dans 1 semaine tu appréciera le petit effort à faire pour changer de méthode.

Bonjour,

J'ai l'impression d'un total remake de ce sujet.

merci
pour être plus explicite, je veux utiliser la PWM de l'arduino avec une fréquence soit de:

  • 16 MHz/1024 = 15625 Hz.
  • 16 MHz/256 = 62500 Hz.
  • 16 MHz/64 = 250000Hz. ????? (je ne suis pas sur)!!!! :slight_smile:

pour avoir une fréquence de ces fréquence sur une sortie PWM de l'arduino, que dois je écrire sur le void setup pour avoir ces résultats?

que dois je écrire pour avoir une fréquence d'environ 30 KHz par exemple? (si c'est possible bien sur :slight_smile:

et merci beaucoup pour votre aide :slight_smile:

Tu es bouché ou tu le fait exprès ?

Tu as l'horloge système = 16 MHz
Tu as des prédiviseurs de l'horloge système : 1, 8, 32, 64, 124, 256, 1024 pour le timer 2.

Tu as enfin un nombre de pas.
Par défaut avec un timer 8 bits il y a 256 pas parce que 28 = 256.

IL FAUT ENCORE DIVISER PAR LE NOMBRE DE PAS POUR AVOIR LA FREQUENCE DE REPETITION DE LA PWM.

Il y a aussi la méthode indiquée par pepe mais IL FAUT TOUJOURS AVOIR DES PAS SINON TU A UN SIGNAL FIXE NON MODULABLE.
MAIS ON NE FAIT PAS CE QUE L'ON VEUX : IL FAUT FAIRE AVEC LES DIVISIONS ENTIÈRES.
Fin pour moi.

merci pour vos réponses
68tjs: je vous ai expliqué ce que je veux faire, et je comprend mieux avec des exemples:

si je veux avoir une fréquence PWM de 62.5 KHz (c'est à dire 16 MHz/ 256 ) que dois je écrire sur void setup?

c'est ce que j'ai demandé à chaque fois, que dois je écrire sur void setup, et lorsque j'ai des exemples je comprendrai mieux :frowning:

merci bcp pepe 1000 merci
merci à vous 68tjs
:slight_smile:

bonjour
je commence à comprendre petit à petit, mais j'ai encore des souci et j’espère que vous serez patient :slight_smile:
j'ai pigé que la fréquence à l'entrée soit au max 62.5 KHz, et que pour avoir des fréquences plus basse j'utilise les pré-scalaires pour diviser la fréquence d'entrée soit de 8 ou 64 ...1024.

mais j'ai pas pigé quelques truc: si je met TCCR2B = TCCR2B & 0b00111000 | 1; je trouve en sortie une fréquence de 31.3 KHz sur les pin 3 et 11. (je l'ai visualisé à l'aide d'un oscilloscope)

  • je veux comprendre: TCCR2B = TCCR2B & 0b00111000 veux dire quoi?
  • le role du registre TCCRnA.
  • vous m'avez dis que je peux augmenter en fréquence mais je dois sacrifier la voie A, cela veux dire quoi?
  • j'ai pigé lorsque vous parliez de la résolution mais comment augmenté en fréquence à l'entrée du timer?
    et si j'arrive à le faire, pourrais je diviser la fréquence par les pré-scalaire?

je me démerde depuis quelque jours et j'essais vraiment de comprendre

merci d'avance

Tu sais que tu peux lire la datasheet du micro-contrôleur.
Tu veux sortir de l'univers pré-maché arduino , il te faut assumer.

Pour ma part j'ai donné assez de mon temps.

Surtout quand je vois qu'à deux reprise je t'ai dit qu'écrire :
TCCR2B = TCCR2B & 0b00111000 | 1;
c'était illisible et imbuvable et que maintenant tu demande l'explication : c'est à dire que tu la trouvé quelque part sans chercher à comprendre.

Rappel:

Un conseil : 0b00111000 c'est illisible et cela me parait faux puisque les bits 4 et 5 sont non affectés et en lecture seule.
TCCR2B
Bit 7 6 5 4 3 2 1 0
FOC2A FOC2B - - WGM22 CS22 CS21 CS20
R/W W W R R R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

Utilise plutôt les mnémoniques de la data sheet et le décalage de bits.
0b00111000 --> (1 << WGM22);

Si tu ne comprend pas commence par prendre un tuto de C/C++
Je n'ai rien de plus à ajouter.

Bonjour :slight_smile:
merci beaucoup pour vos explications

je vais encore plonger en espérant de trouver une solution pour augmenter la fréquence même en sacrifiant la voie A, et pour la résolution même 1% me suffira dans mon travail.

merci beaucoup :slight_smile:

comme c'est fougnateux à trouver :
liste des définitions ATMEL en pj
Chemin :
/hardware/tools/avr/avr/include/avr/
fichier : iom328p

iom328p.h (19.5 KB)