ProgramFiles:
Merci de cette réponse, cependant pourais-je avoir un peu plus d'explication sur le procédé ?
J'ai pas l'habitude des datasheets et j'ai très peu de connaissance en éléctronique.
Datasheet §18.11.1 :
Registre TCCR2A (configuration du timer 2 partie A) :
COM2A1 COM2A0 COM2B1 COM2B0 – – WGM21 WGM20
COM2A1 COM2A0 -> Gestion du générateur de PWM hardware de la broche OC2A
COM2B1 COM2B0 -> Gestion du générateur de PWM hardware de la broche OC2B
WGM21 WGM20 -> Gestion du mode de fonctionnement du générateur de PWM hardware OC2A et OC2B
Dans ton cas si tu veut un signal PWM logiciel :
COM2A1 = 0, COM2A0 = 0 -> pas de signal sur OC2A
COM2B1 = 0, COM2B0 = 0 -> pas de signal sur OC2B
WGM21 = 0, WGM20 = 0 -> Mode normal
Datasheet §18.11.2 :
Registre TCCR2B (configuration du timer 2 partie B) :
FOC2A FOC2B – – WGM22 CS22 CS21 CS20
FOC2A FOC2B -> "Force compare", j'ai jamais eu à utiliser ces bits ...
WGM22 -> suite de WGM21 et WGM20 du registre TCCR2A
CS22 CS21 CS20 -> choix du prescaler du signal d'horloge qui alimente le timer
Dans ton cas si tu veut un signal PWM logiciel :
FOC2A = 0, FOC2B = 0 -> "force compare" désactivé
WGM22 = 0 -> mode normal
CS22, CS21, CS20 -> à toi de calculer ton prescaler suivant la fréquence voulu
D'aprés la valeur de ton 1er post tu as CLK/64 => CS22 = 1, CS21 = 0, CS20 = 0
Registre TCNT2 -> compteur du timer 2
Met le à 0 avant de lancer le timer2
Registre OCR2A -> valeur de "match compare" du comparateur (canal) A
-> tu met ici la valeur de ton signal PWM
Registre OCR2B -> valeur de "match compare" du comparateur (canal) B
Registre TIMSK2 (gestion des interruptions du timer 2) :
– – – – – OCIE2B OCIE2A TOIE2
OCIE2A -> interruption sur "match compare" du comparateur (canal) A
OCIE2B -> interruption sur "match compare" du comparateur (canal) B
TOIE2 -> interruption sur "overflow" du compteur du timer 2
Dans ton cas si tu veut un signal PWM logiciel :
OCIE2A = 1 -> interruption lors du "match compare" de TCNT2 et OCR2A
OCIE2B = 0 -> pas d'interruption lors du "match compare" de TCNT2 et OCR2B
TOIE2 = 1 -> interruption sur overflow du timer
Ensuite tu doit utiliser :
// Cette 1er interruption place la broche à HIGH
ISR(TIMER2_OVF_vect) { // Timer 2 oveflow
PORTn |= (1 << PINm); // n = lettre du PORT de la broche voulu, m = numéro de la broche voulu
}
// Cette 2eme interruption place la broche à LOW
ISR(TIMER2_COMPA_vect) { // Timer 2 OCR2A compare match
PORTn &= ~(1 << PINm); // n = lettre du PORT de la broche voulu, m = numéro de la broche voulu
}
// En jouant avec la valeur de OCR2A tu modifie le duty de ton signal pwm
// Lors de l'overflow : signal PWM = HIGH
// Tant que TCNT2 != OCR2A : signal PWM = HIGH (inchangé)
// Lors du compare match : signal PWM = LOW
// Overflow -> attente -> compare match -> attente -> overflow -> ...
Dans setup() :
Avant de configuré le timer 2 :
cli(); // Désactive les interruptions
Aprés avoir configuré le timer 2 :
sei(); // Active les interruptions
ProgramFiles:
Quels sont les contraintes d'utiliser une autre broche, qui d'après ta réponse ne sera pas généré depuis le générateur de signaux PWM hardware ?
Le générateur de PWM hardware ne demande aucune utilisation du CPU.
La génération de signal PWM par interruption met en pause le CPU à chaque fois que l'interruption du timer se déclenche.
Si ton signal PWM à générer est de fréquence élevé tu va utiliser tout ton temps cpu à générer le signal PWM, le reste de ton code sera alors exécuté au ralenti.