Asservissement moteur DC pour utilisation CNC 2 OU 3 axes

Bonjour à tous,
J'ai testé une commande de CNC 3 axes avec des pas à pas d'imprimantes sur la base d'un Uno.
L'association avec un logiciel GRBL de détourage fonctionne correctement.

Mon problème est le suivant:

  • je voudrais remplacer les moteurs Pas à Pas par des moteurs DC avec codeur rotatif
  • je possède une mécanique complète d'un robot didactique équipé de 3 moteurs DC (et non Pas-à-Pas) avec codeur rotatif sur chaque axe
  • existe t-il une solution pour récupérer les impulsions générées à l'origine pour les pas à pas et les utiliser pour piloter en PID les moteurs DC?
  • l'idée serait d'incrémenter un compteur sur chaque axe et de comparer sa valeur courante au nombre d'impulsions générées par chaque axe asservi.
    Mon projet est peu être un peu fou... mais quelqu'un aura certainement une solution plus simple. D'avance merci de votre aide.

Bonjour,

Ca se fait sans problème (il faut brancher les deux voies du codeur sur des entrées d'interruption de la carte Arduino, tu trouveras plein d'infos sur le Net et je peux même te fournir un programme tout fait) mais tu risques de te heurter à deux difficultés:

  • la résolution angulaire de la mesure d'angle de tes moteurs DC: est-ce que tu la connais ? Si la résolution angulaire est pourrie, ton positionnement sera peu précis
  • la zone morte de commande de ton moteur associé à son driver: en général, le moteur ne commence pas à tourner avant de lui appliquer une certaine tension, qui peut dans certains cas aller jusqu'à 1V. C'est très, très loin de faciliter la tâche pour faire de l'asservissement de position

Au-delà de l'effet de seuil dont parle "3Sigma", (qui peut être corrigé par un contrôle intégral savamment dosé), il y a le problème du dépassement de position, rédhibitoire en CNC, qu'il faut maîtriser au niveau du PID. Cela se fait, mais l'ensemble PID, motorisation, mécanique doit être bien géré.

Cordialement.

Pierre

Le contrôle intégral doit vraiment être "savamment dosé" car ce type de contrôle conduit naturellement à du dépassement... Il faudrait quasiment faire un réglage spécifique pour chaque ensemble moteur+driver, sans compter que ce réglage risque de ne plus être optimal au cours du temps (à cause des échauffements, notamment).

3Sigma:
Le contrôle intégral doit vraiment être "savamment dosé" car ce type de contrôle conduit naturellement à du dépassement...

Dans un PID, ce sont les contrôles "P" et "D" qui gèrent "naturellement" les dépassements. Pas le "I". Pour autant, il arrive souvent que ce contrôle "I" amène à des dépassements, non contrôlés, car dès qu'on arrive en régime transitoire de saturation, ce type de contrôle est très difficile à maîtriser. On est souvent amené à le supprimer lors de grande transition ou par détection de dépassement.

3Sigma:
Il faudrait quasiment faire un réglage spécifique pour chaque ensemble moteur+driver, sans compter que ce réglage risque de ne plus être optimal au cours du temps (à cause des échauffements, notamment).

Oui, il "faut" un réglage spécifique à chaque axe qui prenne en compte tous les différents gains, inerties, frottements visqueux et surtout secs (problème avec le 'I").

Oui, les échauffements et diverses dérives doivent avoir été intégrées.

Le "design" des PID sur les CNC est un problème majeur.

Cordialement.

Pierre

ChPr:
Pas le "I". Pour autant, il arrive souvent que ce contrôle "I" amène à des dépassements, non contrôlés, car dès qu'on arrive en régime transitoire de saturation, ce type de contrôle est très difficile à maîtriser. On est souvent amené à le supprimer lors de grande transition ou par détection de dépassement.

Quand tu rajoutes du I, tu rajoutes une tendance à dépasser même s'il n'y a pas de saturation.

Merci à 3Sigma et à ChPr de vos infos.

3Sigma, tu me faits par de 2 difficultés.

  • La résolution angulaire de la chaine mécanique de chaque axe, est basée sur une vis à bille au pas de 3 mm couplée rapport 1/1 au moteur CC avec codeur 3 voies A/B/Z de résolution 200 pts/tour
  • La zone morte de démarrage du moteur: je dois préciser que j'ai aussi le problème de commande du driver car je souhaite partir des impulsions de puissance initialement prévues pour piloter un biphasé pas-à-pas. C'est mon premier problème à résoudre. Pour les impulsions codeur j'ai bien compris qu'il fallait utiliser les interruptions de l'Arduino-Mega que je compte utiliser

ChPr, je souhaiterais m'inspirer de l'excellent article: Asservissement en vitesse d’un moteur avec Arduino » Sciences et Techniques
Qu'en penses tu?

RadioG:

  • La résolution angulaire de la chaine mécanique de chaque axe, est basée sur une vis à bille au pas de 3 mm couplée rapport 1/1 au moteur CC avec codeur 3 voies A/B/Z de résolution 200 pts/tour

Ca voudrait dire que ta résolution est de presque 2 degrés (360° / 200) ? Ca me paraît beaucoup, non ?

RadioG:

  • La zone morte de démarrage du moteur: je dois préciser que j'ai aussi le problème de commande du driver car je souhaite partir des impulsions de puissance initialement prévues pour piloter un biphasé pas-à-pas.

Quel driver utilises-tu ?

3Sigma:
Quand tu rajoutes du I, tu rajoutes une tendance à dépasser même s'il n'y a pas de saturation.

"3Sigma", je ne veux pas polémiquer et je m'en arrêterai là. Non, un contrôle intégral bien positionné ne joue pas sur le dépassement. En effet, il doit être hors zone fréquentielle déterminant la stabilité et de ce fait, n'y interviendra pas.

J'ai fait une simulation d'un asservissement de position basique comportant un PID. J'ai paramétré 5 valeurs de "I" dont une débordant dans la zone de stabilité. Seule celle-ci (prm = 0.1) crée une modification de la surtension. voir la courbe de réponse en fréquence ci-après.

On voit que la courbe de gain entre dans le cercle "0.5 dB", ce qui va augmenter la surtension. Toutes les autres valeurs, restent sagement à l'extérieur de ce cercle.

Et ci-après, les réponses temporelles à un échelon. Encore une fois, on voit que seule la courbe (prm = 0.1) modifie la surtension.

Cordialement.

Pierre

RadioG:
... ChPr, je souhaiterais m'inspirer de l'excellent article: Asservissement en vitesse d’un moteur avec Arduino » Sciences et Techniques
Qu'en penses tu?

C'est certainement un bon article et tu peux, dans un premier temps, t'en inspirer. Pour autant, un asservissement de position est plus complexe et nécessite une bonne approche de sa stabilité avant de l'essayer au "doigt mouillé".

Cordialement.

Pierre

En fait, le déplacement linéaire de mon axe X est assuré par la vis à bille au pas de 3 mm. La précision linéaire est de (3 mm/200) soit +/-15µm , sauf erreur de ma part 30 µm en répétabilité de position. Ceci devrait être suffisant pour du détourage de pistes de circuit imprimé.

Le driver que j’utiliserai avec cette configuration de moteurs DC est du type double pont en H sur chaque axe sur la base de couples de Mofset J115/K405 (drivers issus d’un petit robot cartésien NewMat)

ChPr:
Non, un contrôle intégral bien positionné ne joue pas sur le dépassement.

C'est sûr qu'à partir du moment où tout est bien réglé pour que ça ne dépasse pas, ça ne dépasse pas.
Mais fais l'exercice suivant: tu règle un PD au petits oignons. Ensuite tu rajoutes un bon intégrateur. Et là ça dépasse. C'est pour ça que je dis que parle de tendance au dépassement. C'est sûr qu'après avoir de nouveau réglé ton correcteur pour que ça ne dépasse pas, et bien ça ne dépasse pas.

Alors qu'avec un PD sur un système intégrateur, tu ne vas jamais dépasser.

  • existe t-il une solution pour récupérer les impulsions générées à l'origine pour les pas à pas et les utiliser pour piloter en PID les moteurs DC?

Je vois que la régulation PID soulève toujours autant de passion!

Je recherche toujours une solution logicielle ou interface pour transformer les deux phases prévues pour un moteur pas-à-pas vers un moteur DC avec retour codeur. Le retour codeur servirait à caler le moteur DC sur le nombre de pas prévus à l'origine pour le moteur PAP.

Certaines CN industrielles ont cette option de connexion en moteur PAP ou DC avec codeur.

RadioG:
... Je recherche toujours une solution logicielle ou interface pour transformer les deux phases prévues pour un moteur pas-à-pas vers un moteur DC avec retour codeur. Le retour codeur servirait à caler le moteur DC sur le nombre de pas prévus à l'origine pour le moteur PAP. ...

La CNC sait d'où elle part et sachant où elle veut arriver, elle calcule le nombre de pas à parcourir. Partant de là, elle va envoyer avec une séquence déterminée le nombre de pas qu'il convient de faire.

Le problème, est que tu ne connaîtras ce nombre de points qu'une fois qu'elle les aura effectués. En conclusion, tu peux compter ces pas et en déduire la position à atteindre. Le problème, si c'en est un, est que tu auras temporellement une commande de retard.

Pour autant, le problème est plus compliqué car, par exemple, pour aller d'un point A à un point B, la CNC va "contourner" la pièce à usiner et non pas aller en ligne droite en défonçant toute la pièce.

Cela veut donc dire que, au-delà d'attendre le nombre de pas effectués, il faut en connaître le séquencement. Ça doit être réalisable, mais ça ne doit pas être simple.

Cordialement.

Pierre

"ChPr". Je comprends ton questionnement, mais mon projet est un peu fou, et j'ai toute ma retraite d' automaticien pour y arriver :wink:

Je pars d'une expérience de CNC Arduino, telle qu'on les trouve sur le Net. A partir d'un fichier ISO, toute la gestion des trajectoires sur chaque axe est déjà réalisée en version moteurs pas à pas. Comme tu le sais, les impulsions biphasées sont envoyées sur les moteurs en boucle ouverte, sans retour codeur.

Dans mon cas je récupère sur chaque axe l'impulsion courante de puissance Pas-à-Pas générée pour la transformer au travers d'un compteur/décompteur immédiatement en tension de commande + 10 Volts qui pilotera alors le double pont H du moteur DC. La boucle d'asservissement PID entre en jeu concernant le dynamisme de l'axe.
Par rapport à la distance parcourue par le chariot d'axe, il faudra alors comparer la position courante du codeur multipliée par son coefficient correcteur à la valeur courante du compteur/décompteur du moteur PAP.

Je ne devrais pas avoir de problème de séquencement car c'est le module logiciel CNC/PAP qui reste le maître.
Il s'agit en quelque sorte de réaliser un moteur suiveur du PAP. A titre expérimental je pourrais conserver le moteur PAP d'un axe et vérifier que l'axe suiveur reste synchrone.
Qu'en penses tu?

RadioG:
… Dans mon cas je récupère sur chaque axe l’impulsion courante de puissance Pas-à-Pas générée pour la transformer au travers d’un compteur/décompteur immédiatement en tension de commande + 10 Volts qui pilotera alors le double pont H du moteur DC. …

Les impulsions qui commande le PAP sont des incréments de “position”. Si tu les transformes en tension de ± 10V, alors cela devient (à quelque chose près) des incréments de “couple”. Il n’y a qu’une double intégration entre ces deux unités !!!

Ou alors, je n’ai rien compris.

Cordialement.

Pierre

Effectivement chaque incrément du PAP définit à la fois un ordre par le mouvement induit et une variation de position angulaire correspondant à 360°/nbre de pas. Je mets de côté pour l'instant l'ordre de sens de rotation du PAP.

Ma chaine synématique:

  • en mode PAP: logique de cde GRBL (boucle ouverte) -->2 sorties TOR Arduino --> moteur bipolaire PAP.

  • en mode MoteurDC+Codeur sur moteur: logique de cde GRBL (boucle ouverte) --> analyse par le compteur logiciel du premier incrément PAP généré (boucle fermée) --> envoi tension de cde sur 1 sortie analogique régulée PID Arduino --> pilotage 0/10 Volts du driver moteur DC --> rotation du moteur DC sur un angle équivalent à l'incrément PAP à copier --> retour info codeur vers le compteur/comparateur --> attente d'un nouvel incrément PAP.

Nota: pour un angle de rotation égal sur chaque moteur nous aurons un incrément PAP pour un nombre "x" d'impulsions codeur DC.

Peut-être un petit schéma serait-il plus explicite.

Je n'avais pas compris.

Bon, je vois ce que vous voulez faire. Quand vous parlez de pilotage 10 volts, je pense que vous voulez dire que votre moteur est commandé en PWM ?

Ben oui, dans le principe, ça devrait fonctionner. Maintenant, il faut mettre des chiffres sur tout cela pour voir si ça va suivre.

Si l'incrément du codeur est égal au pas du PAP, vous risquez de vous retrouver dans une situation d'échantillonnage critique.

Cordialement.

Pierre

Tout d'abord merci de votre aide et de votre patience.

Oui je parle de la commande moteur en PWM qui sera régulée PID.

L' incrémentation codeur prévue est de 200 pts/tour pour 48 ou 96 pas/tour pour le PAP actuellement.

Si le ratio s'avère trop faible je peux doubler ou tripler le rapport de transmission vers la vis à bille par courroie crantée pour arriver à 6 dans le meilleur des cas.

RadioG:
... L' incrémentation codeur prévue est de 200 pts/tour pour 48 ou 96 pas/tour pour le PAP actuellement. ...

Cela fait deux ou quatre fois plus d'incréments codeur que de pas PAP. Cela me semble nécessaire

RadioG:
... Si le ratio s'avère trop faible je peux doubler ou tripler le rapport de transmission vers la vis à bille par courroie crantée pour arriver à 6 dans le meilleur des cas. ...

Ce serait dommage de rajouter des frottements secs et autres, mais s'il le faut.
Si vous arrivez à avoir tous les coefficients de la chaîne électro-mécanique (moteur, mécanique, codeur, ...), je veux bien essayer de vous faire une simulation de la chaîne totale pour voir si ça tient la route.

Cordialement.

Pierre