Objectif 1 : le plus simple : faire tourner le moteur en fonctionnement pas à pas
Objectif 2 : Rajouter l’utilisation des capteurs à effet hall. Compréhension.
Objectif 3 : Faire un programme pour l’apprentissage automatique de la connexion des capteurs hall.
Objectif 4 : Rajouter l’utilisation du PWM pour faire varier et controler la vitesse
Objectif 5 : Problème de coupure du courant dans une bobine. / Optimisation du pont en H. / PWM deadtime. /
Objectif 6 : Rajouter le mode freinage / Récupération d'énergie/ Recharge batterie / Utilisation en éoliene
Objectif 7 : Fonctionnement du moteur à vitesse très lente comme pour les gimbal
Objectif 8 : Voir le principe utilisé sur les moteurs de drones qui n’ont pas de capteurs Hall.
Objectif 9 : Chargeurs de batteries / Equilibrage des cellules.
Matériel : Trois demi Ponts en H pour la commande séquencielle des bobinages.
Le courant rentre par une bobine, sort par une autre, et la troisième n'est pas connectée. Il y a 6 séquence qui vont se répéter;
Les interrupteurs sont des composants électroniques de différentes technologies,
qui s'ouvrent ou se ferment selon l’état (0 ou 1) de leur patte de commande.
Leur bon fonctionnement implique que le signal commande ne provienne pas directement de l'arduino mais passe par un driver / amplificateur. Ici un TC4469 de Microchip.
Connexion à l’arduino par les pins 8, 9, 10, 11,12,13 selon la configuration ci dessous
On va écrire le programme pour faire tourner le moteur comme un moteur pas à pas selon les 6 séquences suivantes:
sequence 1 : A->C
sequence 2 : A->B
sequence 3 : C->B
sequence 4 : C->A
sequence 5 : B->A
sequence 6 : B->C
Il faut prendre son temps pour ne pas se tromper dans l’écriture du code ci-dessous. Attention de ne pas fermer en même temps l’interrupteur haut et l’interrupteur bas du même demi pont!
void setup() {
//bobine A fil marron
pinMode(8, OUTPUT); // mosfet haut fil blanc
pinMode(9, OUTPUT); // mosfet bas fil jaune
//bobine B fil jaune
pinMode(10, OUTPUT); // mosfet haut fil bleu
pinMode(11, OUTPUT); // mosfet bas fil vert
//bobine C fil rouge
pinMode(12, OUTPUT); // mosfet haut fil blanc
pinMode(13, OUTPUT); // mosfet bas fil vert
}
void loop() {
int t=5;
// bobine non utilisée bobine au + bobine au -
//Sequence =1 ;A->C
digitalWrite(10, 1);digitalWrite(11, 0); digitalWrite(8, 0);digitalWrite(9, 0); digitalWrite(13, 1);digitalWrite(12, 1);delay(t);
//Sequence =2 ;A->B
digitalWrite(12, 1);digitalWrite(13, 0); digitalWrite(8, 0);digitalWrite(9, 0); digitalWrite(11, 1);digitalWrite(10, 1);delay(t);
//Sequence =3 ;C->B
digitalWrite(8, 1);digitalWrite(9, 0); digitalWrite(12, 0);digitalWrite(13, 0); digitalWrite(11, 1);digitalWrite(10, 1);delay(t);
//Sequence =4 ;C->A
digitalWrite(10, 1);digitalWrite(11, 0); digitalWrite(12, 0);digitalWrite(13, 0); digitalWrite(9, 1);digitalWrite(8, 1);delay(t);
//Sequence =5 ;B->A
digitalWrite(12, 1);digitalWrite(13, 0); digitalWrite(10, 0);digitalWrite(11, 0); digitalWrite(9, 1);digitalWrite(8, 1);delay(t);
//Sequence =6 ;B->C
digitalWrite(8, 1);digitalWrite(9, 0); digitalWrite(10, 0);digitalWrite(11, 0); digitalWrite(13, 1);digitalWrite(12, 1);delay(t);
}
Vous constatez que vous pouvez le freiner assez facilement avec votre doigt et même l’arréter.
Il ne peut pas donner de couple. Ceci vient du fait que le changement de séquences doit se faire à des
moments précis de passage des aimants du rotor devant les bobines. C'est le role des capteurs à effet Hall de l'objectif 2
Avant d’engager le deuxième objectif, revenons à au programme. Il est nécessaire d’améliorer l’écriture pour qu’il soit plus court à écrire et plus rapide dans son exécution.
Port B (broches numériques de 8 to 13)Chaque port est contrôlé par 3 registres qui permettent une manipulation de bas-niveau, plus rapide
Port C (broches analogiques/numériques)
Port D (broches numériques 0 to 7)
//controle_moteurbrushless_sans_capteurs_objectif1.ino void setup() { DDRB = B11111111;//toutes les broches 8 à 13 du port B en sortie } void loop() { int t=5; PORTB=B00110100;delay(t);//Sequence =1 ;A->C PORTB=B00011100;delay(t);//Sequence =2 ;A->B PORTB=B00001101;delay(t);//Sequence =3 ;C->B PORTB=B00000111;delay(t);//Sequence =4 ;C->A PORTB=B00010011;delay(t);//Sequence =5 ;B->A PORTB=B00110001;delay(t);//Sequence =6 ;B->C }
L’avantage est que, au changement de séquence, tous les ports sont actualisées en même temps alors que entre le premier digitalWrite et le sixième digitalWrite du code précédent, il s’est écoulé quelques nano secondes… C’est suffisant pour que les interrupteurs hauts et bas soient fermés tous les deux pendant ces quelques nano secondes si le code est mal écrit.
Utiliser les régistres permet d'avoir une exécution plus rapide du programme. C'est l'avantages des codes de bas niveau (assembleur, C,..) par rapport aux codes de haut niveau.(Python..).