jpparisy
Patibulaire mais presque
Pour faire tourner le moteur, le programme de commande doit donc exécuter les instructions d'activation des électro-aimants dans le bon ordre et avec la bonne temporisation, pour que le rotor ait le temps de se positionner entre deux pas.
Dans le cas d'un moteur bipolaire, les sorties "A" à "D" sont reliées aux entrées des deux ponts en H, pour pouvoir activer avec la bonne polarité les couples de bobines "A+C" et "B+D".
Dans le programme, les valeurs sont rangées dans un tableau, indiquant les bits du port à positionner. Le tableau est parcouru dans l'ordre croissant pour le sens horaire et dans l'ordre décroissant pour le sens inverse. Par exemple :
Ce sous-programme déplace le moteur d'un pas à chaque appel, il est appelé autant de fois que nécessaire. Le bit 0 du port est relié à "A", le bit 1 à "B", le bit 2 à "C" et le bit 3 à "D".
- Pour faire tourner dans le sens horaire, la séquence est "A, "B", "C" et "D".
- Pour faire tourner en sens inverse, la séquence est "A", "D", "C" et "B".
- Pour faire tourner dans le sens horaire avec des demi-pas, la séquence est "A, "A+B", "B", "B+C", "C", "C+D", "D" et "D+A".
- Pour faire tourner en sens inverse avec des demi-pas, la séquence est "A", "A+D", "D", "D+C", "C", "C+B", "B" et "B+A".
Dans le cas d'un moteur bipolaire, les sorties "A" à "D" sont reliées aux entrées des deux ponts en H, pour pouvoir activer avec la bonne polarité les couples de bobines "A+C" et "B+D".
Dans le programme, les valeurs sont rangées dans un tableau, indiquant les bits du port à positionner. Le tableau est parcouru dans l'ordre croissant pour le sens horaire et dans l'ordre décroissant pour le sens inverse. Par exemple :
Code:
extern bit half_step, two_phase;
static signed int position = 0;
static void delay_step (void);
signed int one_step (signed char direction)
{
static const char step_2[4] = {0b0011, 0b0110, 0b1100, 0b1001,};
static const char step_4[4] = {0b0001, 0b0010, 0b0100, 0b1000,};
static const char step_8[8] = {0b0001, 0b0011, 0b0010, 0b0110,
0b0100, 0b1100, 0b1000, 0b1001,};
position += direction;
if (half_step)
PORTA = step_8[position & 0b0111];
else if (two_phase)
PORTA = step_2[position & 0b0011];
else
PORTA = step_4[position & 0b0011];
delay_step ();
return position;
}
- L'argument "direction" ne peut prendre que les valeurs -1, 0 ou 1, il augmente ou diminue la position courante, suivant son signe.
- La variable "position" définit la position courante du moteur. Sa valeur est renvoyée au programme appelant.
- Dans le cas d'un fonctionnement en demi-pas, indiqué par le bit "half_step", les bits du port à activer sont pris dans le tableau "step_8", indexé par les 3 derniers bits (valeur variant de 0 à 7) de la variable "position".
- Dans le cas d'un fonctionnement en double-phase, indiqué par le bit "two_phase", les bits du port à activer sont pris dans le tableau "step_2", indexé par les 2 derniers bits (valeur variant de 0 à 3) de la variable "position".
- Sinon, ils sont pris dans le tableau "step_4", indexé par les 2 derniers bits (valeur variant de 0 à 3) de la variable "position".
- Le sous-programme "delay_step()" introduit un temps d'attente propre au modèle de moteur utilisé et à la vitesse désirée.