Fréquence pwm

Bonjour à tous,
De ce que j'ai compris, il y a 6 sorties PWM appairés deux à deux.
Une paire de sortie (5 et 6) est à une fréquence double des autres.
La fréquence des PWM serait de 62500 et 31250 Hz, elle peuvent être divisés avec quelques conséquences sur les autres fonctions.
Ce serait bien comme cela, mais voilà : mon problème est que la fréquence des sorties PWM est de 1000 Hz et 500 Hz, ce qui est insufisant pour mon application, alors que j'attendais 62500 et 31250 Hz.
Quel est donc la fréquence normale des PWM? et si c'est 1Kz, peut-on la multiplier?
Merci pour vos réponses.

Bonjour,

Aucun problème, on peut la multiplier et obtenir jusqu'à 62,5 kHz

Cela dépend de la version de ta carte Arduino, moi j'ai constaté 976 Hz pour mon Uno sur la patte 5.
J'ai tout expliqué dans cet article : Modifier la fréquence d’un PWM - PoBot

La partie qui t'intéresse est la ligne de code dans l'avant-dernière section:

TCCR0B = TCCR0B & 0b11111000 | mode;

où mode vaut 001 pour obtenir la plus haute fréquence (pas de division de l'horloge IO donc 62500 Hz)

J'ai écrit l'article d'une seule traite donc il n'est peut être pas très bien structuré.

Bonjour,
Merci deux fois, une fois pour la réponse et une fois pour la découverte du site PoBot.
Cependant j'ai fait plusieurs essais et je n'arrive pas à changer la fréquence du PWM.
Voici le dernier essais:

/*
Commande largeur d'impulsion à partir tension sur entree annalogique
*/

int pwm=10; //PWM sur pin logique 10
int valeur=0; //lecture largeur d'impulsion sur pin analogique 0
int valeurPwm; // mise en mémoire de la valeur de largeur d'impulsion
byte mode=0x01;

void setup() {
pinMode(valeur, INPUT);
TCCR0B = TCCR0B & 0b11111000 | mode;
}

void loop() {
valeurPwm= analogRead(valeur); //prendre la valeur de l'entree largeur d'impulsion
valeurPwm /=4; //convertie l'entree (0-1023) en 0-255 pour la sortie PWM
analogWrite (pwm,valeurPwm); //transmet la valeur d'entree à la sortie PWM
}
mais où est donc le bug?
Je sais que c'est à cause de moi... mais pouvez-vous me donner une solution?

L'erreur vient de ta définition de "mode" que je pense. Pourquoi ne pas simplement utiliser 1, 2, 3, 4 ou 5 ? :wink:

Bonjour,
je me suis décidé à mettre tout le code (insertion de la fonction setPwmFrequency(), mais la fréquence du PWM ne bouge toujours pas!
Voici de code:

int pwm=10; //PWM sur pin logique 10
int valeur=0; //lecture largeur d'impulsion sur pin analogique 0
int valeurPwm; // mise en mémoire de la valeur de largeur d'impulsion

void setup() {
setPwmFrequency(1);
pinMode(valeur, INPUT);

}

void loop() {
valeurPwm= analogRead(valeur); //prendre la valeur de l'entree largeur d'impulsion
valeurPwm /=4; //convertie l'entree (0-1023) en 0-255 pour la sortie PWM
analogWrite (pwm,valeurPwm); //transmet la valeur d'entree à la sortie PWM
}

void setPwmFrequency(int divisor) {
byte mode;
switch(divisor) {
case 1:
mode = 0x01;
break;
case 8:
mode = 0x02;
break;
case 64:
mode = 0x03;
break;
case 256:
mode = 0x04;
break;
case 1024:
mode = 0x05;
break;
default:
return;
}
// le code important : changement du prescaler du comparateur B du timer 0
TCCR0B = TCCR0B & 0b11111000 | mode;
}

Je ne comprends pas ce qui ne va pas...si vous pouviez m'aider...

Le comparateur 0B est uniquement pour la patte 5 et la patte 6*, pas pour la patte 10.

En appliquant les explications de l'article Pobot à cette patte, on peut voir que :

  • la patte 10 de l'Arduino est la patte 2 du port B (PB2 ou patte 16) du micro-contrôleur AVR ATmega8
  • cette patte 16 ou port B2 de l'AVR supporte la fonction OC1B (output compare, c.f. article)

Donc le code devient :

TCCR1B = TCCR1B & 0b11111000 | mode;

J'ai corrigé l'article pour donner l'exemple de recherche de la correspondance pour la patte 10 (vous le verrez demain à cause de notre cache qui prend 24h pour se rafraichir, forte affluence oblige).

  • notez bien que TCCR0B ou TCCR1B n'impactent pas seulement OC0B et OC1B mais aussi OC0A (patte 6) et OC1A (patte 9).

Hé bien merci. j'essaie et j'attends avec impatience de voir l'article demain.

Encore merci. Problème résolu.
Voilà mon code qui fonctionne très bien:

/*
Commande largeur d'impulsion à partir tension sur entree annalogique
Plus réglage de la fréquence du PWM
*/

int pwm=10; //PWM sur pin logique 10
int valeur=0; //lecture largeur d'impulsion sur pin analogique 0
int valeurPwm; // mise en mémoire de la valeur de largeur d'impulsion

void setup() {
byte mode = 0x01; //variable division fréquence
TCCR1B = TCCR1B & 0b11111000 | mode; //Changement du prescaler du comparateur B du timer
pinMode(valeur, INPUT);
}

void loop() {
valeurPwm= analogRead(valeur); //prendre la valeur de l'entree largeur d'impulsion
valeurPwm /=4; //convertie l'entree (0-1023) en 0-255 pour la sortie PWM
analogWrite (pwm,valeurPwm); //transmet la valeur d'entree à la sortie PWM
}