Bonjour, j'essaye de faire atténuer progressivement la luminosité d'une LED en utilisant le concept de la Modulation de largeur d'impulsion (Pulse-width modulation) pendant 3 secondes tout en maintenant une fréquence constante de 1KHz. Je sais faire l'atténuation et maintenir une fréquence de 1KHz, mais lorsque je dois là maintenir pendant 3 secondes, je suis bloqué. Mon code:
Normalement ce code fait atténuer le LED à une fréquence constante de 1KHz, car si f = 1000Hz, alors T = 1/f => T = 1/100 => 1 ms donc 999(1us) + 1us = 1000 us = 1ms et ceci 1000 fois, donc pendant 1 seconde. Donc l'atténuation de la couleur rouge se fait pendant 1 seconde, mais si je veux le faire pendant 3 secondes, ça ne marche plus car :Code:#define F_CPU 8000000 // processeur ATMega324PA avec une fréquence de 8MHz #include <util/delay.h> // registre pour utiliser les fonctions de délais et ajustement automatiquement le délai en fonction du processeur #include <avr/io.h> int main() { DDRC = 0xff; // PORT C est en mode sortie relié au LED unint8_t rouge = 999; unint8_t eteint = 1 for (int i=0; i<1000; i++){ for(int i=0; i<rouge; i++){ PORTC = 0x02; // couleur rouge; _delay_us(1); // delay de 1 microseconde } for(int i=0; i<eteint; i++){ PORTC = 0x00; // eteint; _delay_us(1); // delay de 1 microseconde } rouge--; eteint++; } return 0; }
1 ms/3000 = 0.00033333333 ms = 0,333333 us donc normalement faudrait faire :
mais le problème c'est que le paramètre le plus petite que _delay_us peut prendre est 1 (_delay_us(1) et non _delay_us(0,3)).Code:#define F_CPU 8000000 // processeur ATMega324PA avec une fréquence de 8MHz #include <util/delay.h> // registre pour utiliser les fonctions de délais et ajustement automatiquement le délai en fonction du processeur #include <avr/io.h> int main() { DDRC = 0xff; // PORT C est en mode sortie relié au LED unint8_t rouge = 2999; unint8_t eteint = 1 for (int i=0; i<3000; i++){ for(int i=0; i<rouge; i++){ PORTC = 0x02; // couleur rouge; _delay_us(0,3); // delay de 1 microseconde } for(int i=0; i<eteint; i++){ PORTC = 0x00; // eteint; _delay_us(0,3); // delay de 1 microseconde } rouge--; eteint++; } return 0; }
Donc, je suis complètement bloqué, comment faire pour pouvoir la faire atténuer pendant 3 secondes AVEC une fréquence de 1Khz.
Merci d'avance
-----