Projet

Général

Profil

Feature #14038 » ProgrammePWM_diviseurTIMER1_1_FAST_PWM_14_20_05_2022_02.ino

Code Arduino de la commande PWM - Anonyme, 23/05/2022 17:50

 
//Le 20/05/2022//

// Programme pour générer une PWM de période 22ms avec un état haut varialble (de 1ms à 2ms) en changeant le diviseur du Timer 1 et en utilisant le mode Fast PWM 14 (c'est-à-dire TOP=ICR1)//
//===========================================================================================================================================================================================//
// 2ms à l'état haut c'est le mode marche avant;
//1.5 ms à l'état haut c'est le mode arrêt;
//1 ms à l'état haut c'est le mode marche arrière;


//Constantes:



//Variables:

// on compte jusqu'à 44000 (bin:1010 1011 1110 0000) pour avoir la période 22ms


byte VALEUR_DE_ICR1H=0b10101011; // limite "haute" de comptage pour le Timer 1 est de 65535,et la valeur de ICR1 doit être comprise entre 0 et 65535.
byte VALEUR_DE_ICR1L=0b11100000; //Le registre ICR1 est commun pour les pin D9 et D10;


// La pin D9 est sur le port OC1A (PB1)

//====================================================================================================================//
// pour avoir 2ms à l'état haut => OCR1A= 4000 en décimal (bin: 0000 1111 1010 0000 ) : mode marche avant;
// pour avoir 1.5ms à l'état haut => OCR1A= 2990 en décimal (bin: 0000 1011 1010 1110 ) : mode arrêt;
// pour avoir 1ms à l'état haut => OCR1A= 1980 en décimal (bin: 0000 0111 1011 1100 ) : mode marche arrière;
//====================================================================================================================//

byte VALEUR_DE_OCR1AH=0b00001111; //Valeur du temps à l'état haut du signal PWM à générer sur la sortie OC1A,
byte VALEUR_DE_OCR1AL=0b10100000; // séparée en bits du poid fort et bits du poid faible

/*
// La pin D10 est sur le port OC1B (PB2)

byte VALEUR_DE_OCR1BH=0b00000111; //Valeur du temps à l'état haut du signal PWM à générer sur la sortie OC1B;
byte VALEUR_DE_OCR1BL=0b10111100; // séparée en bits du poid fort et bits du poid faible;

*/

void setup(){
// put your setup code here, to run once:

// Déclaration des pin D9 et D10 en Sortie:

pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
//Serial.begin(9600);
// Paramétrage du Prescaler//
//==============================================================================================================//
// De préférence à ne pas toucher à la fréquence d'horloge pour ne pas avoir;
//des performences médiocres au niveau du fonctionnement du microcontroleur;


// CLKPR=0b10000000; //activer le prescaler en mettant son premier bit (à poid fort) à 1 et les autres bits à 0
// CLKPR=0b00000000; // exple: inscrir le code "00000011" signéfiant la dévision de la fréquence principale par 2
//pour avoir une fréquence de 8MHz


//Timer 1 (Sortie D9 et D10)//
//=============================================================================================================//
//Paramétrage du mode de fonctionnement du Timer 1 en mode "FAST PWM 14" c'est à dire TOP=ICR1 :

bitSet(TCCR1B,WGM13); //Mise de WGM13 à 1
bitSet(TCCR1B,WGM12); //Mise de WGM12 à 1
bitSet(TCCR1A,WGM11); //Mise de WGM11 à 1
bitClear(TCCR1A,WGM10); //Mise de WGM10 à 0

// Paramétrage du prédiviseur du Timer 1 à 8 //
//==============================================================================================================//
//le prédiviseur du Timer 1 est configuré par défaut sur 64//
bitClear(TCCR1B,CS12); // Mise de CS12 à 0
bitSet(TCCR1B,CS11); // Mise de CS11 à 1
bitClear(TCCR1B,CS10); // Mise de CS11 à 0

// Génération des signaux PWM//
//=============================================================================================================//
// Générer du signal PWM sur la sortie D9( connectée à OC1A du microcontrolleur):
// PWM en mode "non inversé": sortie D9 mise à 1 lorsque la valeur de timer 1 atteint la valeur de OCR1A;
//sortie D9 (OC1A) mise à 1 à chaque remise à zéro du timer 1 c'est à dire TOP=ICR1;
bitSet(TCCR1A,COM1A1); // Mise de COM1A1 à 1
bitClear(TCCR1A,COM1A0); // Mise de COM1A0 à 0
ICR1H=VALEUR_DE_ICR1H; //ICR1 va compter de 0 jusqu'à atteindre la valeur "VALEUR_DE_ICR1"
ICR1L=VALEUR_DE_ICR1L;
OCR1AH=VALEUR_DE_OCR1AH; // OCR1A va compter de 0 jusqu'à atteindre la valeur "VALEUR_DE_OCR1A"
OCR1AL=VALEUR_DE_OCR1AL;
/*
// Générer du signal PWM sur la sortie D10( connectée à OC1B du microcontrolleur):
// PWM en mode "non inversé": sortie D10 mise à 1 lorsque la valeur de timer 1 atteint la valeur de OCR1B,
//sortie D10 mise à 1 à chaque remise à zéro du timer 1
bitSet(TCCR1A,COM1B1); // Mise de COM1B1 à 1
bitClear(TCCR1A,COM1B0); // Mise de COM1B0 à 0
ICR1H=VALEUR_DE_ICR1H; //ICR1 va compter de 0 jusqu'à atteindre la valeur "VALEUR_DE_ICR1"
ICR1L=VALEUR_DE_ICR1L;
OCR1BH=VALEUR_DE_OCR1BH; // OCR1B va compter de 0 jusqu'à atteindre la valeur "VALEUR_DE_OCR1B"
OCR1BL=VALEUR_DE_OCR1BL;
*/
// end of setup
}

void loop() {
// Boucle infinie
// Si on utilise les interruptions, on quitte cette boucle pour aller exécuter le code en haut (s'il contient des interruptions!),
//avant de revenir ici

// put your main code here, to run repeatedly:

}
    (1-1/1)