Ce coup-ci c'est testé et corrigé.
Effectivement Timer 1 et Timer 2 ne sont pas identiques en ce qui concerne la division d'horloge. La fonction dans le programme suivant permet de régler la fréquence sur les broches 9 et 10 (timer 1) et sur les broches 3 et 11 (timer 2). Les broches 3 et 11 permettent des fréquences de 32k, 4k, 1k, 500, 250, 100 et 30 (environ, j'ai arrondi). les broches 9 et 10 permettent des fréquences de 32k, 4k, 500, 100 et 30.
Si on essaye d'appeler la fonction pour les broches 9 et 10 avec des fréquences de 1k ou 250, l'horloge est coupée (plus de PWM).
/* Allowed pins to change the PWM */
const byte PINS_9_10 = 0;
const byte PINS_3_11 = 1;
/* Allowed frequencies */
const byte PWM_32k = 0; /* All pins */
const byte PWM_4k = 1; /* All pins */
const byte PWM_1k = 2; /* Pins 3 and 11 only */
const byte PWM_500 = 3; /* All pins */
const byte PWM_250 = 4; /* Pins 3 and 11 only */
const byte PWM_100 = 5; /* All pins */
const byte PWM_30 = 6; /* All pins */
/* CS codes for timer 1 */
const byte codeForTimer1[] PROGMEM = {
B00000001,
B00000010,
B00000000, /* no clock if config not allowed */
B00000011,
B00000000, /* no clock if config not allowed */
B00000100,
B00000101,
};
/* CS codes for timer 2 */
const byte codeForTimer2[] PROGMEM = {
B00000001,
B00000010,
B00000011,
B00000100,
B00000101,
B00000110,
B00000111,
};
void setPWMFrequency(byte pins, byte frequency)
{
if (frequency < 7) {
if (pins == PINS_9_10) {
byte csCode = pgm_read_byte_near(codeForTimer1 + frequency);
TCCR1B &= B11111000; /* aucune horloge */
TCCR1B |= csCode;
}
else if (pins == PINS_3_11) {
byte csCode = pgm_read_byte_near(codeForTimer2 + frequency);
TCCR2B &= B11111000; /* aucune horloge */
TCCR2B |= csCode;
}
}
}
void setup() {
// put your setup code here, to run once:
setPWMFrequency(PINS_9_10, PWM_32k);
setPWMFrequency(PINS_3_11, PWM_32k);
analogWrite(9,128);
analogWrite(3,128);
}
void loop() {
// put your main code here, to run repeatedly:
}