Bonjour
J'utilise deux ventilateurs de PC pour refroidir un système audio de puissance. Je me sers d'une carte mega2560. Le système de refroidissement est asservi à la température du système à refroidir. Le pilotage par PWM de la vitesse des ventilateurs est une solution parfaitement adaptée.
Les ventilateurs courants fonctionnent avec un signal PWM de 25kHz (avec une certaine tolérance). Je dois donc modifier les paramètres du timer du µC pour viser cette fréquence.
Après quelques recherches sur le Web, et une lecture par toujours très compréhensibles pour moi de la datasheet de l'atmega2560, je suis parvenu à un résultat pas tout à fait satisfaisant.
D'autre part, j'avoue avoir tatonné dans les registres du timer, en m'inspirant des exemples que j'ai trouvé sur le net, sans toujours bien comprendre ce que je faisais.
J'aimerai si possible avoir des explications sur ce que j'ai fait, et aussi corriger les erreurs, car il doit y en avoir quelques unes.
Tout d'abord l'erreur en question: Tout fonctionne à peu près bien, la fréquence est bien d'environ 25kHz (vérifié à l'oscillo), le rapport cyclique généré est bien respecté (10% en envoyant la valeur 32, 50% avec 160, 100% avec 320), mais le rapport cyclique est également à 100% lorsque j'envoie la valeur 255 (tel qu'il est illustré dans le code ci dessus)
Ensuite, je n'ai pas l'habitude de programmer les registres avec ce type de code. Par exemple, pour paramétrer TCCRA5, j'aurai plutot fait: TCCR5A=b00100000|b00000010, mais je ne sais pas si c'est bien correct...
Voici le code que j'ai créé spécifiquement pour cet usage. Le signal PWM est envoyé par la pin45 (OC5B de la puce).
```cpp
const int ventR = 45;
void setup() {
TCCR5A = 0;
TCCR5B = 0;
TCNT5 = 0;
// Mode 10: phase correct PWM with ICR5 as Top (= F_CPU/2/25000 =320)
// OC5C as Non-Inverted PWM output
ICR5 = (F_CPU / 25000) / 2;
OCR5B = 0; // rapport cyclique au démarrage
TCCR5A = _BV(COM5B1) | _BV(WGM51);
TCCR5B = _BV(WGM53) | _BV(CS50);
pinMode(ventR, OUTPUT);
}
void loop() {
analogWrite(ventR, 255);
}