[UNO] Effet de bord changement de fréquence PWM

Hello,

Dans le source ci-dessous, le changement de vitesse de la PWM (code trouvable un peu partout sur le web) affecte la gpio 13, celle de la LED_BUILTIN gpio 13). Le programe est simple, la LED_BUILTIN clignote, et si un CR ou un LF arrive sur le port série, ça accélère la fréquence des PWM des gpio 5 et 6. Hélas, une fois le changement effectué, la led ne clignote plus... Le programme continue normalement, les octets envoyés sur le port série continuent de s'afficher (après un CR ou LF), c'est juste que la led ne change plus d'état. :confused:

Quelqu'un serait au courant d'une relation quelconque entre la gpio 13 et le registre TCCR0B?

#if !defined(AVR_ATmega328P)
#error this program is for AVR ATmega328P only (UNO, Nano >= v3.0, ...)
#endif
#define PWM_PIN 3
#define console Serial

bool boosted = false;
char received_char;

void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
pinMode(PWM_PIN, OUTPUT);
analogWrite(PWM_PIN, 0x80); // perfect square on PWM's pin
console.begin(9600);
}

void loop()
{
if(millis() & 0x100)
digitalWrite(LED_BUILTIN, 0);
else
digitalWrite(LED_BUILTIN, 1);

while(console.available())
{
received_char = console.read();
console.write(received_char);
if((received_char == '\n') || (received_char == '\r'))
if(boosted == false)
{
TCCR0B = (TCCR0B & B11111000) | B00000001; // for D5 D6 PWM frequency of 62500.00 Hz
boosted = true;
}
}
}

speedUpPWM.ino (881 Bytes)

Bonjour,

Pourquoi tu as #define PWM_PIN 3 alors que le timer 0 est utilisé pour les pins 5 et 6. Comme indiqué dans le commentaire?

   TCCR0B = (TCCR0B & B11111000) | B00000001; // for D5 D6 PWM frequency of 62500.00 Hz

Le code ci dessus n'agit pas sur la pin 13, mais sur delay() puisque delay() utilise le timer 0. La led change d'état, mais si rapidement que c'est invisible à l'oeil.

Je n'utilise pas delay(), mais millis(). La led est celle que j'utilise toujours dans loop() pour vérifier que le programme n'est pas planté (cpu run).

J'ai posté un bout de code minimaliste dont le but est de reproduire l'effet. Sur la plupart des forums c'est ce que l'on demande, pour aller à l'essentiel. J'utilise en fait les 6 PWM en DAC... Mais c'est cette ligne précisément qui provoque l'effet.

Je viens de vérifier à l'oscillo, effectivement, la led clignote à un peu plus de 100Hz. J'en conclus donc que si on change le timer 0, il faut recalculer les timings pour delay() et millis().

Merci beaucoup, kamill, problème résolu. :wink:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.