Moteur CC en mode PWM et mesure courant par shunt

Bonjour à tous,

Je me permets de solliciter votre aide sur le problème suivant.
Dans un montage à base d’Arduino Pro mini, j’in un moteur à courant continu qui actionne une trappe.
Ce moteur est commandé en mode PWM par un circuit TB6612FNG afin de faire varier sa vitesse et d’avoir un démarrage progressif.
Il est également équipé d’un encodeur de position, petit aimant en bout d’arbre qui passe devant un capteur à effet hall.

Le fonctionnement que je recherche est le suivant :

  • Dans le sens montée de la trappe, ayant une butée mécanique en fin de course, je souhaite arrêter le moteur sur détection de surintensité. Pour cela j’ai introduit un shunt de courant dans le circuit de puissance du moteur.
  • Dans le sens descente, j’utilise l’encodeur et arrêt une fois un certain nombre d’impulsions atteintes.

Mon problème est la détection de surintensité.
Pour cela, j’utilise une entrée analogique de l’Arduino, pour mesurer la tension présente aux bornes d'un shunt. Mais avec la commande PWM, cette tension varie beaucoup. Elle est en dent de scie, et il m’est très difficile de la mesurer.

Auriez-vous une approche simple, pour intégrer cette tension, afin d’avoir une mesure fiable ?

Bonjour,
Solution : Ajout d'un circuit intégrateur.
Cela se fait simplement avec un circuit RC --> circuit en "GAMMA" constitué d'une résistance série suivie d'un condensateur relié à la masse.
On dit GAMMA car le câblage rappelle la forme de la lettre greque "gamma" en majuscule. Ce circuit s'appelle aussi filtre passe bas car il filtre les fréquences pour ne laisser passer que la valeur continue du signal.

Pour déterminer les valeurs de R et de C les renseignements que tu donnes sont insufisants :
Valeur ohmique du shunt ?
fréquence de la PWM ?

Merci pour cette réponse.
La résistance utilisée a pour valeur 1 ohm. Elles en série avec le moteur et raccordée à la masse d'un côté.
Actuellement, avec la fonction analogread renvoie une valeur brute d'environ 40 -60 en fonctionnement et 180-200 en butée.
Si je ne me trompe pas le pas de résolution de l'entrée analogique est 5V/1024 soit 4,9mv.
Ce qui nous donne un courant d'environ 250mA en fonctionnement normal et 900ma en blocage.

la constante de temps du réseau intégrateur RC à ajouter dépend de la fréquence du PWM , valeur logiquement demandée par ]68tjs

La fréquence de PWM varie, elle commence à 20 et monte progressivement vers 255. ( Fonction analogWrite(A0, PWM))
Cela afin d'avoir un démarrage progressif du moteur, et minimiser le pic de courant au démarrage.

Non , ces valeurs déterminent le rapport cyclique, la fréquence s'exprime en Hertz
c'est donc probablement 490Hz pour cette carte (période environ 2ms)

cf : référence AnalogWrite analogWrite() - Arduino Reference

avec R=100kOhm et C=100nF (produit RC= 10ms) ça devrait aller

Merci al1fch, je vais tester cela c'est après-midi.
Je reviendrais faire un bilan de mes tests.

Je viens de tester, résistance de 100K, avec condensateur de 100nf.
Cela fonctionne, j'ai regardé avec un oscilloscope, le signal PWM est bien intégré au niveau du condensateur.
Par contre, je rencontre un nouveau problème, lorsque je raccorde l',ensemble sur l'entrée A2 de mon Arduino, je retouvre une tension de 5V aux bornes de condensateur.
Voici mon montage :

Il semblerait que l'entrée A2 fournisse un courant de charge pour le condensateur.

Montrer le code pour voir comment est géré A2 (probable pullup configuré préalablement sur cette broche = résistance reliant A2 et +5V en interne)

Autre hypothèse : C'est la différence entre la détection de valeur moyenne et la détection de valeur crête.
La notion est assez floue j'en conviens.

L'impédance d'entrée du microcontrôleur est très élevée et le condensateur ne peut pas se décharger.

Essayes 10k plutôt que 100k avec 100 nF si cela convient encore comme filtrage, sinon passe la 100nF à 1µF.
Tu peux aussi mettre une résistance de 100 k en parallèle sur le condensateur (avec 10k série).
Le pont d'affaiblissement sera faible.

Pour la sensibilité de l'ADC il y a 3 possibilités :

  1. la solution sans rien faire avec la référence au Vcc --> pas de mesure ~ 5mV
  2. les solutions en changeant la référence de tension :
  • la référence interne de 1,1V ±10% -> pas de mesure ~ 1 mV
  • une référence externe appliquée sur Aref --> pas = Vref/1024.

al1fch : je n'ai pas configuré l'entrée A2 par programmation, car pour moi c'est une entrée analogique, donc pas de configuration spécifique. Il faut faire quelque chose de spécial ?
68tjs : je vais essayer avec une 10k un 1uf et une 100k en parallèle. Je reviens ensuite donner les résultats.

AnalogRead() se charge de configuer comme il faut mais A2 pouvant au besoin servir en E/S numérique (avec ou sans pull-up) on voit parfois passer des codes où ce type de d'entrée/sortie se voit d'abord imposer un pull-up avant de servir en entrée analogique , le pull-up ne pouvant alors que perturber la tension d'entrée !!

J'ai rajouter un pinMode(A2, INPUT); avant de faire un analogRead, mais cela ne change rien.
Pareil avec le montage avec un 100K en parallèle sur le condensateur.

Actuellement, avec la fonction analogread renvoie une valeur brute d'environ 40 -60 en fonctionnement et 180-200 en butée.

Pourtant il y a suffisamment de différence pour détecter la fin de course ...

J'ai fait un montage de ce genre avec un L293D, une résistance de 0.5Ω, avec en // sur la résistance une capa de 3300µF 6.3V. C'est réactif, j'en suis plutôt satisfait.

Une autre hypothèse pour expliquer la charge 'franche' du condensateur par l'entrée analogique : la diode de protection de cette entrée serait en court-circuit. (Conséquence d'un exces de tension lors d'un essai antérieur)
Essayer une autre entrée...

Bonjour,

Je m'insère dans votre discussion en tentant quelques remarques :

  • 1 Je propose, pour commencer, de confirmer le bon fonctionnement en partant du schéma du post #7, mais en ne faisant que remplacer l'Arduino par l'oscillo. (A la rigueur par un voltmètre continu)
    Noter les valeurs de tension aux bornes du condensateur dans les situations suivantes : PWM min et PWM max.
    On devrait s'attendre à obtenir quasiment 0V et nettement moins de 12V selon les valeurs de l'intensité du moteur. (En fonctionnement le moteur réalise un diviseur de tension avec le shunt, la tension aux bornes du shunt doit être très inférieure à 12V, tout dépends du moteur et aussi du freinage mécanique à la rotation que l'on peut appliquer)

-2 Ensuite, avant de connecter l'entrée analogique de l'Arduino (qui se comportera comme un voltmètre de calibre 5V) ; bien vérifier qu'aucune situation ne permettra de dépasser 5V. Si les 5V sont dépassés fugitivement (moteur bloqué ; surintensité créant une surtension sur le shunt au moment du démarrage du moteur) alors l'entrée analogique de l'Arduino est en danger et il faut prévoir une protection :

  • Diviseur de tension, mais on perd en sensibilité.
  • Diodes de protection.

Serge .D

Bonjour,

En fait, j'avais mis une résistante de 1ohm comme shunt car mon moteur était donné pour 1.2A.
Je pensais que la tension ne dépasserait jamais 2V.
C'était sans compter les pics de courant au démarrage, j'ai flingué l'entrée analogique de l'arduino, j'ai également flingué le circuit de commande du moteur.

Finalement, j'ai mis un contact fin de course pour détecter la position haute de ma trappe et je me sers de l'encodeur pour déterminer la position basse.

Je vous remercie pour votre aide.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.