|
//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:
|
|
|
|
|
|
}
|