broche motorisée par brushless outrunner

  • Auteur de la discussion JB
  • Date de début
J

JB

Apprenti
bonjour
J'utilise pour ma motorisation de mini broche cnc un moteur brushless outrunner 400 kV associé à un variateur adapté.
le résultat est satisfaisant en commande manuelle mais dès que je lui demande de tourner
en iso ( M4 S1000 par exemple); il ne démarre pas.
Est il possible de lui programmer une rampe d'accélération dans la config linux et est-ce que ça pourrait résoudre
mon problème?
Merci d'avance.
 
J

JB

Apprenti
bonjour jf
Le variateur que j'utilise peut monter à 26V et 40A, mais je n'ai besoin de tant de courant.
Il n'est pas programmable, et je génère le signal MLI depuis le PC ( de 1 à 2ms toute le 50ms)
ça ne va pas être facile à programmer, mais ce n'est peut être pas la meilleure solution...
Cordialement.
 
S

speedjf37

Compagnon
Bonjour,

J'utilise un outrunner 980kV qui monte à 19800tr/mn avec 22V
Je l'ai monté en direct avec un arbre de 8mm ER11
je le pilote avec un variateur ESC et un montage de test de servo en manuel

j'avais prévu de le piloter avec un interface 0/10V

Je viens de trouver cette solution:(pas testé)

http://wiki.linuxcnc.org/cgi-bin/wiki.pl?RC_Servo_Test

L'idéal serait d'asservir la vitesse avec un encodeur .
 
Dernière édition par un modérateur:
F

Francois59

Apprenti
Juste comme ça :
Personne n'a jamais essayé avec un variateur brushless type hélico, en mode governor = asservissement de la vitesse ????
 
N

nopxor

Compagnon
Bonjour,

Il est possible d'interfacer un microprocesseur entre la sortie PWM de commande de vitesse de broche du port // et l'entrée du variateur RC.
Il existe une bibliotheque Arduino (servo RC) qui facilitera beaucoup le codage du programme.

Il est sûrement possible de générer le signal directement depuis un port du PC depuis LinuxCNC via un programme dédié, mais si cela est plus élégant, c'est peut être plus fastidieux à coder.
 
S

speedjf37

Compagnon
Bonjour,


Présentation du montage:

outrunner_er11_800x600.png
La broche moteur sur arbre 8mm ER11

esc800x600.png
La variateur ESC
 
N

nopxor

Compagnon
Joli travail :-D .
Peux tu en dire plus sur la liaison mécanique de la broche avec l'axe moteur ?
Un croquis de la vue en coupe par exemple.
Le moteur ne chauffe t'il pas trop ?

A propos de drive de Brushless, j'ai trouvé un site intéressant qui décrit 2 montages à base d'Atmega8:
Un sensorless et un avec capteurs Hall.
C'est tout chaud ...(30 septembre)
Bien sûr il faut adapter les Mosfets selon la puissance du moteur à contrôler.

http://davidegironi.blogspot.it/2013/09/a-simple-brushless-sensorless-motor.html#.Uk1utuWdeFX
 
Dernière édition par un modérateur:
S

speedjf37

Compagnon
Bonjour,

J'ai remplacé l'arbre du moteur par le support de broche (tout en 8mm de diamètre).

Pour la chauffe du moteur pas essayé en production.
Il ne devrait pas fatiguer il est donné pour 100A sous 22V soit 2200w (c'est pour entrainer une hélice d'avion)
alors avec les fraises de la cnc en queue de 3.2mm !!!!
 
N

nopxor

Compagnon
C'est très compact.
Cela donne des idées pour une broche de rectif, voir même pour une tête pivotante de CNC.
 
S

speedjf37

Compagnon
Bonjour,

Plus de détails sur le montage: :)

broche_support800x600.png
montage broche et support
 
N

nopxor

Compagnon
Merci.
Le remplacement de l'axe doit pas être évident à faire...
Y a t-il une procédure spéciale pour démonter la carcasse de ces moteurs ?
 
D

diiity

Compagnon
speedjf37 a dit:
Bonjour,

J'utilise un outrunner 980kV qui monte à 19800tr/mn avec 22V
Je l'ai monté en direct avec un arbre de 8mm ER11
je le pilote avec un variateur ESC et un montage de test de servo en manuel

j'avais prévu de le piloter avec un interface 0/10V

Je viens de trouver cette solution:(pas testé)

http://wiki.linuxcnc.org/cgi-bin/wiki.pl?RC_Servo_Test

L'idéal serait d'asservir la vitesse avec un encodeur .

Bonjour,

Intéressant ton montage, mais est ce que tu as assez de puissance?
Aurais tu les plans de ton montage, des détails?

diiity
 
Dernière édition par un modérateur:
M

moissan

Compagnon
supprimer completement les roulement du moteur , et utiliser uniquement les roulement de la broche est vraiment la bonne solution

un acouplement entre un moteur entier et une broche est une source de probleme
 
S

stanloc

Compagnon
moissan a dit:
supprimer completement les roulement du moteur , et utiliser uniquement les roulement de la broche est vraiment la bonne solution

un acouplement entre un moteur entier et une broche est une source de probleme

la difficulté de réalisation n'est pas la même. Un moteur d'une part et une broche d'autre part offre un choix important de solutions et un accouplement par courroie crantée (j'y tiens) un jeu d'enfant. Il faut déjà annoncer quelle plage de vitesses importe car c'est là que j'attends que des solutions pertinentes soient apportées.
Stan
 
S

speedjf37

Compagnon
Bonjour,

C'est un montage de test.
Il est destiné à une mini cnc PORTIX.
Les 20000rpm pour la gravure de CI avec fraise javelot (la broche d'origine moteur DC 10000rpm)

J'utilise Linuxcnc
Le pilotage direct du variateur ESC par une MLI 1ms 2ms fonctionne (mais est à améliorer)

Je n'ai pas d'accouplement dans mon montage.

L'arbre du moteur en 8mm est remplacé par l'arbre ER11.(la cloche est montée serrée + une vis de blocage).

Les roulements du moteurs sont restés en place (ils sont fait pour la vitesse et l'hélice)
Il y a 2 roulements (abec 7 de roller pour le test) en bas de broche pour les contraintes de fraisage.
Il faudrait monter 2 roulements coniques qui tiennent les 20000rpm en 8mm (une référence svp ?)
 
J

JB

Apprenti
Bonjour,
J'ai fini par trouver la bonne config:
Le variateur demande un signal pour les servos: un PWM avec un signal haut variant de 1ms à 2ms toute les 50ms.
J'ai réglé tout çà avec Halscope (période de 50ms = 20 Hz) puis j'ai affiné par essais (21 hz ).
Le résultat est satisfaisant en manuel et en automatique.
Je n'ai que le sens M3 ( mais le M4 on peut s'en passer sur un fraiseuse !)
Le moteur commence à tourner avec une consigne de 2400 tr/min et monte jusqu'à 7000tr/min.
La réponse est bonne à plein régime mais pas du tout à basse vitesse.
Avec une commande en boucle ouverte ce n'est pas étonnant.

Il me reste à tester une boucle de retour: je pense faire un capteur avec une sonde à effet hall.....

Capture.png
 
M

Marc PELTIER

Compagnon
Bonsoir à tous !
J'ai moi aussi programmé avec HAL une sortie PWM pour une broche brushless RC, qui fonctionne, mais je voudrais signaler la question de la résolution :

Le signal de type radio-commande varie de 1 à 2 ms toutes les 50 ms. Vu par LinuxCNC, c'est donc un signal PWM de 20 Hz variant de 2% à 4%. Comme la résolution, gérée par Hal, est de 10 bits (1024 pas) pour 0 à 100%, la plage de variation utile, vue par le contrôleur RC, n'a plus qu'une très faible résolution. On améliore la situation en combinant deux PWM de fréquences différentes, mais ce n'est pas l'idéal. En pratique, l'asservissement de vitesse par cette méthode ne serait sans doute pas satisfaisant.

J'en suis arrivé à la conclusion qu'il faudrait un micro-contrôleur genre Arduino pour s'occuper de ça, en aval de LinuxCNC / Hal, mais je ne l'ai pas encore fait, et je règle la vitesse à la main en tournant un potentiomètre.

L'idée d'utiliser un contrôleur d'hélico, capable de faire l'asservissement tout seul, est séduisante, mais il faut pouvoir lui passer la consigne avec une résolution suffisante, et le problème est donc le même...
 
J

JB

Apprenti
Bonsoir,
je pense que le problème principal vient du fait que ces moteurs et variateurs ne commutent pas sur des signaux
venants de capteur à effet hall.
sinon c'est beaucoup plus compliqué au niveau du variateur.

l’inconvénient c'est la précision, l'avantage c'est le prix!

ça donne par contre beaucoup de couple.....

De plus j'ai mis un capteur à effet hall à coté de la cage tournante ( récupéré dans un ventilateur)
qui me fournit une image de la vitesse réelle ( réponse) très bonne.
C'est l'avantage d'un outrunner.
Je me suis aperçu que selon la tension d'alimentation du variateur l'erreur de poursuite varie énormément....
Peut-on travailler en boucle fermée avec linuxcnc ?
à suivre....
 
D

domi.U&M

Compagnon
bonjour,

je ne comprends pas comment ce type de moteur monté sur une broche est refroidi. derrière une hélice, ok. mais ici, sans déplacement d'air, ça doit vite chauffer, non?
 
J

JB

Apprenti
bonjour,

Pour refroidir j'ai mis une hélice de ventilo sur le moteur, l'air est pulsé vers le bas.
une fois cartérisé ( en plastique à cause des courants de foucault) et muni d'un filtre à l'aspiration
ça devrait permettre une bonne durée de vie du moteur.
Actuellement au bout de 30 min à 5000 tr/min c'est juste tiède.

Quitte à dépouiller un ventilateur de PC j'ai récupéré la sonde à effet hall,
Il suffit de l'approcher de la cage tournante et de raccorder tout ça à linux pour avoir une mesure de vitesse fiable....
C'est beaucoup mieux qu'un système optique car c'est insensible à la poussière.

J'ai regardé sur arduino le codage des sorties PWM: il est sur 10 bits comme dans HAL.
Aura- t- on une meilleure réponse avec un arduino ?
A essayer...
Cordialement.

broche.JPG
 
M

Marc PELTIER

Compagnon
@JB
Je ne me suis pas fait comprendre : Avec Hal, on code sur 10 bits une variation de rapport cyclique de 0 à 100% avec une période de 20 ms, mais le contrôleur du moteur ne sera sensible qu'aux créneaux au standard de la radio-commande, c'est-à-dire à la partie qui va de 2 à 4% (1 à 2 ms), de sorte qu'il ne verra qu'une vingtaine de pas effectifs pour le réglage de sa vitesse.

Avec un Arduino, on peut recevoir le signal émis par Hal sur 10 bits, et le réinterpréter pour générer des créneaux variant de 1 à 2 ms en 1024 pas, effectivement utiles pour le réglage. On garde donc la résolution, malgré le codage particulier, de type radio-commande, du contrôleur.

Une solution théoriquement meilleure serait d'avoir un contrôleur qui interpréterait directement la PWM 0 à 100% fournie par Hal, mais ça n'existe pas dans le commerce, à ma connaissance. Il faudrait reflasher un contrôleur, ou partir d'un contrôleur Brushless open-source. Passer par un Arduino est plus simple en pratique.
 
J

JB

Apprenti
bonsoir,
Judicieuse remarque: je n'y avait pas pensé : :prayer:
Je suis un pur mécano pro et un électro amateur, ceci explique cela........
j'ai un arduino uno sous la main, je vais tester ça dès que j'aurai un moment de libre.

Ceci dit: l'arduino gère le pwm de 0 à 255 ( sur 8 bits) en utilisant la bibliothèque fournie....

Je complète le post après les essais

merci
 
N

nopxor

Compagnon
Bonjour,

Interfacer un arduino entre la sortie de LinuxCNC et un variateur est très simple.

Le signal PWM de commande de broche entre sur une entrée analogique de l'arduino qui a une résolution de 10 bits. A cette valeur binaire, il suffit de faire correspondre une valeur de position servo (avec la fonction writeMicroseconds()) comprise entre 1000 et 2024 μs à une broche qui va commander le variateur.
 
J

JB

Apprenti
bonsoir
J'ai testé l'arduino, le résultat est très concluant :supz:
La vitesse moteur est plus "stable" à un régime donné (plus précise)...
Pour le moment j'arrive à récupérer l'info du capteur effet hall sur une interruption (front montant).
Je pense arriver à réguler la vitesse en boucle fermée (PID)( après un peu de boulot...)
La rampe d'accélération est facile à faire (enfin je pense !)
Après, il suffit de renvoyer l'info sur le PC "vitesse atteinte" pour démarrer le cycle d'usinage.
Quand tout sera au point je posterais les résultats.
Cordialement.
 
N

nopxor

Compagnon
Dernière édition par un modérateur:
J

JB

Apprenti
Bonsoir,
La boucle d'asservissement PID du brushless avec l'arduino marche de façon satisfaisante.
Les oscillations ne se sentent pas au niveau de la broche en régime permanent.
Il faut régler le PID en douceur.....

graph.jpg


Voilà le programme; il est configuré pour fonctionner depuis le moniteur série.
à tester.......

#include <Servo.h> //utilisation librairie servo
#include <SimpleTimer.h> // utilisation librairie simpletimer (voir internet)


// --- Déclaration des constantes ---
const int POS_MIN=1000; // PWM mini en µs selon variateur
const int POS_MAX=1700; // PWM maxi en µs selon variateur
int angle_servo=0;

// --- constantes des broches ---
const int broche_servo=9; // sortie PWM sur broche 9
const int SPINDLE_SPEED=0; // entrée consigne (PWM linux CNC ou PWM Mach3 ou potar) sur broche entrée analogique 0
long clic=1; // entrée logique codeur broche 1
SimpleTimer timer;
// --- Déclaration des variables globales ---
Servo mon_servo;
float vit_consigne=0;
float vit_reponse=0;
float vit_erreur=0;
float vit_compar=0;
float delta_erreur=0;
float erreur_precedente=0;
int octetRecu;
float somme_erreur=0;
int kp=10; // gain reel = gain declare/10
int kd=5; // dérivée reelle = dérivée declarée/10
int ki=8; // intégrale reelle = intégrale declarée/10
int vitesse_max=5000; // vitesse maxi moteur à mesurer -10%
int vitesse_mini=1500; // vitesse mini moteur à mesurer
void setup() {
Serial.begin(9600);
mon_servo.attach(broche_servo, POS_MIN, POS_MAX);
pinMode(broche_servo, OUTPUT);
attachInterrupt(clic, compteur, RISING); // interruption sur front montant du capteur
timer.setInterval(100, asservissement); // interruption pour calcul du comparateur toute les 100ms
timer.setInterval(99, envoi); // interruption pour envoi sur moniteur série toute les 99ms

}

//*******************************************************************
void loop(){
timer.run();
if (Serial.available() > 0) { // consigne envoyée par le moniteur série 2=2000tr/min 3=3000tr/min etc...
// à masquer si entrée par COMMANDE PAR PWM OU POTAR 10k SUR BROCHE1 ...
octetRecu= Serial.read();
if (octetRecu == '0') vit_consigne=0;
if (octetRecu == '1') vit_consigne=vitesse_mini;
if (octetRecu == '2') vit_consigne=2000;
if (octetRecu == '3') vit_consigne=3000;
if (octetRecu == '4') vit_consigne=4000;
if (octetRecu == '5') vit_consigne=5000;
}

}
// *******************************************************************
/* Interruption sur signal du codeur */
void compteur()
{
clic++; // On incrémente dans le compteur le nombre d'impulsion du capteur
}
// *******************************************************************
// Interruption pour calcul asservissement

void asservissement()
{
// COMMANDE PAR PWM OU POTAR 10k SUR BROCHE1 à démasquer...
//consigne=analogRead(SPINDLE_SPEED); // lecture consigne sur 10 bits
//vit_consigne=consigne*vitesse_max/1023; // transformation en tr/min


vit_reponse = clic*600/7; // transformation en tr/min du retour codeur 7 impulsions par tour
clic=0; // remise à zéro du compteur
if (vit_consigne<=10) somme_erreur=0; // raz de l'intégrale à l'arret

clic=0; // remise à zéro du compteur
vit_erreur=vit_consigne-vit_reponse; // calcul de l'erreur proportionnelle
delta_erreur = vit_erreur-erreur_precedente; // calcul de l'erreur dérivée
somme_erreur += vit_erreur; //calcul de l'erreur intégrale

vit_compar= (kp*vit_erreur/10) + (delta_erreur*kd/10) +(somme_erreur*ki/10); // calculcomparateur

erreur_precedente = vit_erreur; // enregistrement vitesse actuelle
angle_servo=map(vit_compar,0,vitesse_max,0,180); // remise à l'échelle
mon_servo.write(angle_servo); // écriture
}
// *******************************************************************
// interruption envoi résultats vers moniteur série
void envoi()
{
if (vit_consigne>0){
Serial.print(vit_consigne, DEC);
Serial.print(" ");
Serial.print(vit_reponse, DEC);
Serial.println(" ");
}
}

// --- Fin programme ---
 
N

nopxor

Compagnon
Bonjour,

Félicitations pour ton programme :supz:
Comment as-tu installé le capteur Hall ?
 
J

JB

Apprenti
bonjour
j'ai carterisé le moteur avec une pièce en PVC blanc avec un passage d'air et un ventilo au dessus du moteur pour refroidir.
J'ai donc inséré le capteur dans ce carter, il est à 5 mm de la cage tournante, la detection est parfaite.
 

Sujets similaires

N
Réponses
78
Affichages
9 754
nipil
N
Haut