volatile uint16_t dutyCycle = 50; // Pourcentage de niveau haut (50% par défaut)
void setupTimer1();
void setDutyCycle(uint16_t duty);
int main(){
DDRB |= (1<<PB1); //Pin 9
setupTimer1();
while(1){
setDutyCycle(dutyCycle);
}
}
void setupTimer1() {
// Initialiser le Timer1
TCCR1A = 0;
TCCR1B = 0;
// Configuration du Timer1 pour le mode PWM rapide, 16 bits
// WGM13 = 1, WGM12 = 1 WGM11 = 1
TCCR1A |= (1 << WGM11);
TCCR1B |= (1 << WGM12) | (1 << WGM13);
// Prescaler à 8
TCCR1B |= (1 << CS11); // CS10 = 0, CS11 = 1, CS12 = 0
// Configurer la sortie PWM sur la broche 9 (OC1A)
TCCR1A |= (1 << COM1A1);
// Pour une fréquence de 50 Hz, la valeur maximale du compteur est à 19999
ICR1 = 19999;
// Initialiser le rapport cyclique
setDutyCycle(dutyCycle);
}
void setDutyCycle(uint16_t duty) {
// Vérification de la valeur du rapport cyclique entre 0 et 100
if (duty > 100) {
duty = 100;
}
// Calcul du comparateur OCR1A en fonction du rapport cyclique
OCR1A = (duty * (ICR1 + 1)) / 100;
}