Papy la bricole

Cyclurba, le vélo utile

Faites vous-même votre ESC pour moteur brushless avec un arduino.... Toutes des démarches de compréhension.

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.




Dernière mise à jour : 01/09/2020

Objectif 1 : Faire tourner le moteur en fonctionnement pas à pas

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);
 }
Télécharger le code ici
Mais satisfaction, le moteur tourne !.
avec quelques saccades car il y a un petit delay(t) entre chaque séquence. On peut faire varier la vitesse de rotation par ce delay(t) et aussi par la tension d'alimentation.
Attention ne réduisez pas trop ce délay(t) et n’utilisez pas une trop forte tension dans un premier temps.

cliquez ici pour voir la video rotation moteur

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.

Un peu de technologie. Utilisation des régistres.

Les microcontrôleurs utilisés pour les cartes Arduino ont trois ports :
Port B (broches numériques de 8 to 13)
Port C (broches analogiques/numériques)
Port D (broches numériques 0 to 7)
Chaque port est contrôlé par 3 registres qui permettent une manipulation de bas-niveau, plus rapide
Le registre (un octet) DDR détermine le sens d'utilisation des broches en tant qu'ENTREE ou SORTIE. Le registre (un octet) PORT contrôle le niveau HAUT ou BAS des broches en SORTIE. Par exemple DDRD = B11111110; // met les broches n° 1 à 7 de l'Arduino en sortie, la broche 0 en entrée
et PORTD = B10101000; // met les broches 7,5 et 3 au niveau HAUT
Nous avons utilisé le port B (broches 8 à 13) donc toute la boucle loop peut etre réécrite comme ceci

 //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..).



Objectif 2 : Rajouter l’utilisation des capteurs à effet hall.