Go Down

Topic: Projet régulation d'un moteur 12v avec arduino (Read 585 times) previous topic - next topic

KvDMvC


Bonjour à tous,

je suis débutant sur Arduino, alors soyez indulgents ;) Je suis assez curieux et aime bien chercher par moi même, mais un petit coup de pouce n'est pas de refus.

Je vous présente mon projet, je souhaiterais faire réguler un moteur cc 12v par l'intermédiaire d'un Arduino.

J'ai actuellement un boitier qui actionne un moto-réducteur 12 volts permettant de faire varier l'ouverture d'une vanne. J'ai dans l'idée de supprimer cette vanne et faire varier directement la vitesse d'un moteur cc.

Le signal d'entrée vers l'arduino :

- +12v sur le fil n°1 lorsque je souhaite augmenter la vitesse du moteur (je pensais incrémenter un compteur jusqu'à 1024 tant que la tension est de +12v)

- +12v sur le fil n°1 modulé à 50% en PWM, soit une moyenne de 6 volts lorsque je souhaite augmenter lentement la vitesse du moteur (le compteur s'incrémente lentement lorsqu'on détecte cette tension)

- +12V sur le fil n°2 lorsque je souhaite diminuer la vitesse du moteur (décrémenter un compteur tant que la tension est de -12v).

- +12v sur le fil n°2 modulé à 50% en PWM, soit une moyenne de 6 volts lorsque je souhaite diminuer lentement la vitesse du moteur (le compteur diminue lentement à cette tension).


C'est en réalité un signal +12/-12 volts (avec les fils n°1 et 2) qui fait tourner un moteur dans un sens, puis dans l'autre. Mais, si j'utilise une masse à part, mes deux signaux restent positifs.

Pour lire ce signal, je pensais utiliser un pont diviseur de tension branché sur une broche analogique de l'arduino afin de la réduire en dessous de 5v. Mais j'ai lu que cela ne serait pas forcément la meilleure solution car cela dépend de la consommation du récepteur?

1ère question: dois-je utiliser un pont diviseur de tension ou une carte de régulation de tension?

2nde question: je ne suis pas sûr de moi concernant mon signal PWM à 6 volts. Comment puis-je en être certain? J'ai fait le test avec un multimètre sur la fonction HZ/% (Facom). Je trouve 47.4% (fil n°1) et 52.4% (fil n°2) avec une fréquence de 15.61 Hz sur les deux.

3ème question: dans le cas où il s'agirait d'un 12v pwm, comment le lire avec le arduino?


Une fois le traitement du signal résolu, je pensais actionner et moduler la vitesse du moteur avec une fonction de mappage et port analogique en fonction du compteur que j'aurais incrémenté ou décrémenter. L'aduino pilotera un IBT2 42amp en 12v (que j'ai déjà en ma possession) car le moteur consomme assez d'intensité:

- lorsque le compteur sera au max : la vitesse du moteur serait de 100%

- lorsque le compteur sera au mini : la vitesse du moteur serait de 0%

4ème question: si vous avez des suggestions sur la manière de traiter le signal d'entrée, je suis preneur.

En attendant, je vous remercie d'avance et vous souhaite une bonne journée !  :)
 

KvDMvC

Bonjour à tous!

Après quelques recherches je suis tombé sur le filtre RC (résistance condensateur).

Est-ce qu'un électronicien pourrait m'aiguiller davantage sur le principe ou me donner un bon lien pour me renseigner sur le sujet?

Est ce que cela serait une bonne solution pour lire mon signal pwm 12v?

Merci d'avance

hbachetti

Quote
Pour lire ce signal, je pensais utiliser un pont diviseur de tension branché sur une broche analogique de l'arduino afin de la réduire en dessous de 5v. Mais j'ai lu que cela ne serait pas forcément la meilleure solution car cela dépend de la consommation du récepteur?
Le récepteur est une entrée digitale de l'ARDUINO, qui ne consomme rien.

Quote
1ère question: dois-je utiliser un pont diviseur de tension ou une carte de régulation de tension?
Un pont diviseur est suffisant.

Quote
2nde question: je ne suis pas sûr de moi concernant mon signal PWM à 6 volts. Comment puis-je en être certain? J'ai fait le test avec un multimètre sur la fonction HZ/% (Facom). Je trouve 47.4% (fil n°1) et 52.4% (fil n°2) avec une fréquence de 15.61 Hz sur les deux.
Il suffit de considérer une fourchette aux alentours de 50%.

Quote
3ème question: dans le cas où il s'agirait d'un 12v pwm, comment le lire avec le arduino?
Mesurer la longueur d'une impulsion est parfaitement faisable avec un ARDUINO : pulseIn

Quote
Après quelques recherches je suis tombé sur le filtre RC (résistance condensateur).
C'est aussi une solution.

Un pont diviseur avec un condensateur en parallèle sur la résistance côté masse.
Ensuite mesurer la tension avec une entrée analogique.

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

KvDMvC

Merci pour ta réponse.

La solution du PulseIn me paraît la plus simple. Couplée à un pont diviseur je pourrais abaisser ma tension et savoir si j'ai un signal pwm à 50% ou 12 v complet.
Par contre je ne saurais pas faire la différence en 0 volt (pas de signal) et 12 volts (signal maxi) car le pulseIn renverra 0 dans les deux cas?

L'avantage du filtre RC est que je peux faire la différence entre les 3 états possible de mon signal : 0, PWM et 12V.
Par contre j'ai du mal à comprendre comment calculer les valeurs de la résistance et du condensateur. Quelles infos sont nécessaires pour déterminer le filtre RC? Ce sont des notions d'electronique que je ne connais pas du tout.

hbachetti

#4
Apr 05, 2019, 11:59 pm Last Edit: Apr 06, 2019, 12:02 am by hbachetti
Simple.

Comme il faut bien fixer l'un des deux paramètres, fixons la valeur de la résistance, pas trop élevée :
Pont diviseur R1=10KΩ au +12V et R2=6.8KΩ à la masse.
Ce qui donne au point milieu :
Vs = 12V * R2 / (R1+R2) = 12 * 6800 / (10000+6800) = 4.85V
Ce calcul est valable pour 12V. Si la tension réelle est de 13V ou 14V il faut le refaire.

Ensuite il faut multiplier R par C et tu obtiens la constante de temps.

A 15Hz, la demi-période est de 33ms.
Je considère la demi-période car le condensateur va se décharger seulement pendant les demi-périodes à 0V.

Le calcul suivant donne le temps au bout duquel le condensateur sera déchargé de 63% :

T = RC
donc C = T/R
C = 0.033 / 6800 = 0,0000048

Donc il te faut un 4.7µF pour 63% d'ondulation.
Si tu veux une ondulation plus faible, augmente le condensateur, par exemple 47µF pour avoir moins de 10% d'ondulation.

Tu peux le faire aussi avec des résistance 10 fois plus élevées et un condensateur 10 fois plus petit.
Il sera plus sensible aux parasites, mais comme le condensateur filtre, cela devrait marcher aussi.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

KvDMvC

#5
Apr 06, 2019, 09:44 pm Last Edit: Apr 06, 2019, 10:48 pm by KvDMvC
Merci pour toutes ses informations précieuses, je n'en demandais pas tant ^^!

J'ai saisi la logique du calcul mais je ne comprend pas comment tu as défini la valeur de 63%?

Édit: après une petite recherche j'ai trouvé la réponse à ma question...
Donc en gros si je comprend bien, au bout de 1T soit 33ms ma tension sera de 0,67*12v=8,04v ? Et 33 ms plus tard ma tension redescendra à 0,37*12v=4,44v?

Comment calculer mon C pour avoir une valeur plus lisse?

hbachetti

Quote
Comment calculer mon C pour avoir une valeur plus lisse?
Voir plus haut :

Quote
Si tu veux une ondulation plus faible, augmente le condensateur, par exemple 47µF pour avoir moins de 10% d'ondulation.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

KvDMvC

Salut,

merci pour les réponses. Je viens de me replonger dans mon projet que j'avais mis de côté par manque de temps.

Voici le schéma que j'ai réalisé, avec en vert le signal PWM.
Est-ce correct?


hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

KvDMvC

#9
Apr 29, 2019, 07:30 pm Last Edit: Apr 29, 2019, 07:45 pm by KvDMvC
Bonjour,

je viens de faire un essai avec une platine d'essai et un petit moteur 5v. J'ai disposé 4 boutons poussoir pour simuler un signal +5v (augmentation rapide du compteur) +3.3v (augmentation lente) -5v (réduction rapide) et -3.3v (réduction lente).

Le moteur est branché sur un MOSFET IRF520N et la borne 3 en PWM.
Lorsque le moteur n'est pas branché, mon compteur augmente et diminue normalement, en revanche lorsque le moteur est branché cela fonctionne aussi mais le compteur augmente tout seul sans appuyer sur un seul bouton.

Est-ce dû aux ondes électromagnétiques générées par le moteur:

Voici le code, et en attaché une photo du montage.

Code: [Select]
int SignalVrePlus, SignalVreMoins;
int compteur=0;
int pinMoteur=3;

void setup()
{
  
  Serial.begin(9600);
  pinMode(pinMoteur,OUTPUT);
}

void loop()
{
  
  SignalVrePlus=analogRead(A0);
  SignalVreMoins=analogRead(A1);
  
  
  if(SignalVrePlus==1023)
  {
    compteur+=7;
    delay(50);
  }
  else if (SignalVrePlus<1023 && SignalVrePlus>0)
  {
    compteur+=4;
    delay(50);
  }
  else if (SignalVreMoins==1023)
  {
    compteur-=7;
    delay(50);
  }
  else if (SignalVreMoins<1023 && SignalVreMoins>0)
  {
    compteur-=4;
    delay(50);
  }
  
  if (compteur>1023)
  {
    compteur=1023;
  }
  if (compteur<0)
  {
    compteur=0;
  }
    
   int valeur=map(compteur,0,1023,0,255);
   Serial.print(compteur);
   Serial.print(", ");
   Serial.println(valeur);
   analogWrite(pinMoteur,valeur);
    
 
  }

bidouilleelec

Bonjour KvDMvC

Et en doublant les analogRead ?
Code: [Select]

analogRead(A0);
SignalVrePlus=analogRead(A0);
analogRead(A1);
SignalVreMoins=analogRead(A1);


Cordialement,
bidouilleelec


hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

KvDMvC

#12
Apr 30, 2019, 01:12 pm Last Edit: Apr 30, 2019, 01:21 pm by KvDMvC
Bonjour KvDMvC

Et en doublant les analogRead ?
Code: [Select]

analogRead(A0);
SignalVrePlus=analogRead(A0);
analogRead(A1);
SignalVreMoins=analogRead(A1);


Cordialement,
bidouilleelec


Bonjour, merci pour la réponse. Je fais l'essai et je te redis.

image illisible pour moi
Illisible car impossible à ouvrir, ou illisible car trop de fils partout ?
Dans le doute, je refais le schéma avec tinkercad. Je le mets en attaché.

KvDMvC

Bonjour KvDMvC

Et en doublant les analogRead ?
Code: [Select]

analogRead(A0);
SignalVrePlus=analogRead(A0);
analogRead(A1);
SignalVreMoins=analogRead(A1);


Cordialement,
bidouilleelec


Bonjour bidouilleelec, j'ai fait l'essai et ça ne change rien.
Peut-être parce que je partage la même alimentation entre le moteur et la carte?


KvDMvC

Bonjour à tous,
j'ai avancé sur mon projet:
- j'ai fait l'essai avec mes signaux 12v à travers mon pont diviseur de tension (R1 : 10 Kohm et R2 : 5x 1000 Kohm). J'ai pris une tension maxi de 15 volts pour calculer mon pont car sur un véhicule en charge la tension peut monter à 14,5 volts.

En attaché le schéma:
- en vert le SignalVrePlus
- en jaune le SignalVreMoins
- j'ai utilisé un condensateur de 22 uF car c'était le meilleur compromis après plusieurs essais. C'était le plus stable avec la latence la plus acceptable.

Mon code (je n'ai pas commenté vu la simplicité  :smiley-confuse: ):
Code: [Select]
int SignalVrePlus, SignalVreMoins;
int compteur=0;

void setup() {

   Serial.begin(9600);

}

void loop() {
 
  SignalVrePlus=analogRead(A0);
  SignalVreMoins=analogRead(A1);

  Serial.print(SignalVrePlus);
  Serial.print(" | ");
  Serial.println(SignalVreMoins);
  delay(50);
}


Mes résultats sur la stabilité et la latence  :) :

Test avec signal PWM 12v (delay 50ms) :
A Gauche VreMoins, à droite VrePlus
Code: [Select]
0 | 0
0 | 0
0 | 0
0 | 152
0 | 187
0 | 276
0 | 375
0 | 430
0 | 369
0 | 300
0 | 251
0 | 133
0 | 70
0 | 37
0 | 19
216 | 9
377 | 4
374 | 2
313 | 0
317 | 0
392 | 0
465 | 0
239 | 0
121 | 0
62 | 0
32 | 0
16 | 0
7 | 0
3 | 0
1 | 0
0 | 0


Test Signal à 12V (delay 50ms):
A gauche VreMoins, à droite VrePlus
Code: [Select]
0 | 0
0 | 0
0 | 0
0 | 270
0 | 524
0 | 660
0 | 731
0 | 770
0 | 792
0 | 803
0 | 810
0 | 813
0 | 817
0 | 677
0 | 360
0 | 193
0 | 104
0 | 56
0 | 30
0 | 16
0 | 8
0 | 3
0 | 1
0 | 0
0 | 0



Je ne pense pas pouvoir faire mieux niveau qualité de lecture du signal. J'ai environ 400ms de latence pour arriver à zéro, que je pourrais contrer en partie avec une condition sur une plage déterminée.
Qu'en pensez-vous?

@+

Go Up