Exemple: timer0

Ce programme illustre la possibilité d'utiliser le timer 0 pour la gestion des moteurs. Si on va lentement, on garde la valeur usuelle de programmation du timer 0, et delay() fonctionne normalement. On peut aller 8 fois plus vite ou 16 fois plus lentement tout en conservant delay(). Sinon pour d'autres vitesses delay() est aléatoire.

Comme le programme ajuste la valeur passée à delay(), les 4 valeurs prises pour la base de temps donnent le même visuel. Ce programme fait un "Blink with delay" sur une led, et fait tourner un moteur. Pour qu'il fonctionne aussi avec un temps entre impulsions de 16ms, j'utilise exceptionnellement le mode pas. La led permet de visualiser le fonctionnement correct de delay.

Liens

Pour faire fonctionner cet exemple, il faut soit télécharger QuickStepExemples.zip contenant tous les fichiers d'exemples, soit télécharger timer0.zip contenant cet exemple, soit créer un répertoire du nom de l'exemple et mettre dedans:
- le fichier timer0.ino de l'exemple
- le fichier de configuration QuickStepConf.h propre à cet exemple
- les trois fichiers (QuickStep.h, QuickStep.cpp et digitalWriteFast.h) pour avoir la bibliothèque (identiques pour toutes les applications)

QuickStepConf.h (extrait)

#define timer0pourQuickStep

#define UN_TOUR (200L) pas_ou_micro_pas
#define STEP 12
#define DIR 13
#define ENABLE
#define NB_ORDRES_DANS_LA_PILE 7

Par défaut c'est le timer 2 qui est utilisé, il faut donc préciser que l'on veut le timer 0.

Je veux faire tourner le moteur à 0,25tr/s, mais ce n'est pas nécessaire de le préciser car je vais imposer ma base de temps. Il faudra la choisir en décommentant la ligne voulue

timer0.ino

Si on choisi pour la base de temps 128µs, 1024µs, 4096µs ou 16384µs, delay(), millis() et micro() fonctionnent encore (mais pas forcément à la bonne vitesse). On va faire ce choix, et ajuster la valeur des 500ms pour avoir un clignotement correct.

#
  $menu = ":QS";
  include "QuickStep.h"

const uint8_t LED1 = A4, // Branchements des Leds
              LED2 = A5;

// Valeurs pour lesquelles delay(), millis() et micros() fonctionnent
//const float maBaseDeTemps = 128 micro_secondes; // delay() sera 8 fois trop rapide
const float maBaseDeTemps = 1024 micro_secondes; // delay() sera à vitesse normale
//const float maBaseDeTemps = 4096 micro_secondes; // delay() sera 4 fois trop lent
//const float maBaseDeTemps = 16384 micro_secondes; // delay() sera 16 fois trop lent
//const float maBaseDeTemps = 100 micro_secondes; // ni 128, ni 1024, ni 4096, ni 16384

unsigned long cinqCentMilliSecondes; // valeur pour delay(500);

void setup()
{
  Serial.begin(115200); // Pour quickStepInfo
  quickStepInit(); // Obligatoire pour utiliser QuickStep
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  quickStepBaseDeTemps(maBaseDeTemps);
  quickStepInfo();
  if (maBaseDeTemps == 128 micro_secondes) cinqCentMilliSecondes = 500 * 8;
  else if (maBaseDeTemps == 1024 micro_secondes) cinqCentMilliSecondes = 500;
  else if (maBaseDeTemps == 4096 micro_secondes) cinqCentMilliSecondes = 500 / 4;
  else if (maBaseDeTemps == 16384 micro_secondes) cinqCentMilliSecondes = 500 / 16;
  else  cinqCentMilliSecondes = 500; // En fait n'importe quoi
}

int8_t sensDeRotation = -1;
void loop()
{ 
  // Led: Blink with delay
  // Période 1s
  digitalWrite(LED1, !digitalRead(LED1)); // Change d'état la led
  digitalWrite(LED2, digitalRead(LED1)); // Met l'autre Led dans le même état
  delay(cinqCentMilliSecondes); // Pour que la led battre la seconde
  
  // X:  Moteur 17HS4401, Hybride + A4988
  // 1 tour dans un sens, 1 tour dans l'autre à 0,25tr/s
  while (quickStepLibre() > 0) 
	  quickStepRotation((sensDeRotation = -sensDeRotation) * UN_TOUR, 0.25 RPS);
}