Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2019-03-14T17:57:19+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Asservissement position avec correcteur PI, message #2003532019-03-14T17:57:19+01:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/12227/asservissement-position-avec-correcteur-pi/?page=1#p200353<p>Salut! <img src="/static/smileys/smile.png" alt=":)" class="smiley">
Curiosité: je n’ai pas trouver où tu accèdes au mode graphique sur l’IDE Arduino, pourrais-tu m’en dire plus ?</p>
<p>Merci! <img src="/static/smileys/heureux.png" alt=":D" class="smiley"></p>Asservissement position avec correcteur PI, message #2003332019-03-13T23:12:12+01:00dubser/@dubserhttps://zestedesavoir.com/forums/sujet/12227/asservissement-position-avec-correcteur-pi/?page=1#p200333<p>Allô,</p>
<p>Même le système tel que décrit n’est pas totalement linéaire, le théorie s’applique a peu près. Si je comprend bien les courbes, la variable controlée, l’angle, vert, suit approximativement la consigne, vert avec +- une erreur parfaitement normale dans un asservissement proportionnel seulement, ce qui me semble le cas si jai bien compris le script Arduino. S’il est désire une erreur plus faible il faut introduire une composante intégrale a l algorithme. Contrôle PI plutôt que P seulement. Cette fonction devra ajouter (sommer) à la variable controlée une valeur égale a I= SUM(Ki * erreur) ou SUM est l’intégration (sommation a chaque n tours de boucle). Ceci si les constantes sont ajustées correctement va réduire l’erreur a zéro sans oscillation du système en régime permanent. </p>
<p>Je me permet de mentionner cet article qui aborde le même type de sujet et vaut d’être consulté:<br>
<a href="https://zestedesavoir.com/forums/sujet/11649/arduino-asservissement-grace-au-pid/">https://zestedesavoir.com/forums/sujet/11649/arduino-asservissement-grace-au-pid/</a></p>Asservissement position avec correcteur PI, message #2003312019-03-13T22:20:31+01:00clem34/@clem34https://zestedesavoir.com/forums/sujet/12227/asservissement-position-avec-correcteur-pi/?page=1#p200331<p>Merci pour ton aide Aabu. Voici les images. </p>
<p>Les courbes ont été tracé à l’aide du traceur de l’environnement Arduino (qui ne présente visiblement pas les échelles… :o)</p>
<p>Légende et axe :<br>
En bleu => Angle parcouru par le rotor<br>
En rouge => Erreur entre consigne et angle parcouru<br>
En orange => Rapport cyclique<br>
En vert => Consigne<br>
X => n-ième asservissement </p>
<p>Pour Kp = 0.25</p>
<figure><img src="/media/galleries/6770/d9acc9e2-5535-4e4b-983b-f64339fbcf1c.png" alt="graphe_2.png"><figcaption>graphe_2.png</figcaption></figure>
<p> L’amortissement du système est faible, ce qui est a priori normal. Mais l’erreur statique est quant à elle constante quelque soit la consigne. D’après mes souvenirs des cours d’automatiques, l’erreur statique doit être proportionnelle à la valeur de la consigne. => Donc là… pas bon.</p>
<p>Pour Kp = 0.5</p>
<figure><img src="/media/galleries/6770/38fc2340-856c-436b-aa35-eb79530a6e0f.png" alt="graphe_3.png"><figcaption>graphe_3.png</figcaption></figure>
<p>Il y a un faible dépassement et quelques oscillations, mais l’erreur statique remontée par le µC est quasiment nulle, alors que le rotor a parcouru en réalité, un angle bien plus important que la consigne demandée… => Donc là, pas bon non plus.</p>
<p>Pour Kp = 0.75</p>
<figure><img src="/media/galleries/6770/1bb28b17-e702-46e5-8cd0-19df89f51c07.png" alt="graphe_4.png"><figcaption>graphe_4.png</figcaption></figure>
<p>Même constat que pour Kp = 0.5 hormis une légère amplification des oscillations (erreur statique remontée par le µC toujours nulle alors que l’angle parcouru en réalité, est beaucoup, beaucoup plus important que la consigne demandée). => Pas bon non plus…</p>Asservissement position avec correcteur PI, message #2003292019-03-13T22:05:11+01:00Aabu/@Aabuhttps://zestedesavoir.com/forums/sujet/12227/asservissement-position-avec-correcteur-pi/?page=1#p200329<p>Salut,</p>
<p>Sans les images, c’est plus difficile de t’aider. Normalement, il suffit de les copier-coller dans la zone d’édition depuis le presse-papiers ou d’y glisser-déposer le fichier. </p>Asservissement position avec correcteur PI, message #2003282019-03-13T21:45:19+01:00clem34/@clem34https://zestedesavoir.com/forums/sujet/12227/asservissement-position-avec-correcteur-pi/?page=1#p200328<p>Bonjour à tous,</p>
<p>Je suis nouveau sur ce forum et je le trouve super intéressant. Du coup, j’ai souhaité partager le problème que je rencontre actuellement sur un asservissement de position de moteur à courant continu. Je vais essayer d’être le plus précis possible dans mes explications.</p>
<p>Description de mon application : j’effectue un asservissement numérique avec un Atmega328 à l’aide d’Arduino. Ce microcontrôleur vient commander un moteur CC à travers un pont en H. En particulier, la commande est générée par la PWM du microcontrôleur, et est ensuite dirigée vers des portes logiques qui délivrent eux-même le signal PWM et son complément au pont en H.
Le moteur est équipé d’une roue codeuse à effet Hall pour capter la rotation de son axe rotor. Ce capteur fourni des fronts, provoqué par un changement d’angle, que je viens compter avec le µC (l’angle parcouru entre 2 tick est de 30°).
Ref. moteur : <a href="https://www.pololu.com/product/3215">https://www.pololu.com/product/3215</a></p>
<p>Les couples résistants élevés induits par la charge mécanique m’empêche d’utiliser un servomoteur. Le moteur possède donc un réducteur 1:20.4 pour palier à ce problème. L’axe de sorti parcourt dans l’application, au maximum 3 tours.</p>
<p>Pour les besoins de mon application, le axe moteur doit atteindre la consigne sans erreur statique (c’est primordial). J’ai donc souhaité implanter un correcteur PI.</p>
<p>Dans un premier temps, j’ai commencé par un asservissement avec correction proportionnelle seulement dont voici le code :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-arduino"><span class="hljs-keyword">void</span> Asservissement(<span class="hljs-keyword">float</span> ConsignePositionRotor) <span class="hljs-comment">// fonction d'asservissement effectuée toutes les 79ms</span>
{
<span class="hljs-comment">// Chaine directe </span>
ErreurCourante = ConsignePositionRotor - PositionCouranteRotor ; <span class="hljs-comment">// Calcul de l'erreur</span>
RapportCyclique = Kp * ErreurCourante + <span class="hljs-number">127</span> ; <span class="hljs-comment">// Correcteur PI</span>
<span class="hljs-built_in">if</span> ( RapportCyclique > <span class="hljs-number">255</span> ){<span class="hljs-comment">// Saturation dans un sens de rotation</span>
RapportCyclique = <span class="hljs-number">255</span>;
}
<span class="hljs-built_in">if</span> ( RapportCyclique < <span class="hljs-number">0</span> ){<span class="hljs-comment">// Saturation dans l'autre de rotation</span>
RapportCyclique = <span class="hljs-number">0</span>;
}
OCR2A = RapportCyclique ; <span class="hljs-comment">// Registre de la valeur de rapport cyclique de la PWM de l'Atmega328</span>
<span class="hljs-comment">// Chaine de retour </span>
<span class="hljs-built_in">if</span> (ErreurCourante > <span class="hljs-number">0</span>){
PositionCouranteRotor = PositionCouranteRotor + TCNT1 ;
TCNT1 = <span class="hljs-number">0</span> ;
}
<span class="hljs-built_in">if</span> (ErreurCourante < <span class="hljs-number">0</span>){
PositionCouranteRotor = PositionCouranteRotor - TCNT1 ;
TCNT1 = <span class="hljs-number">0</span> ;
}
}
</code></pre></div>
<p>Cette fonction est effectuée toutes les 26.3ms.
TCNT1 est le registre du compteur 1 de l’atmega qui compte les 'ticks’ de ma roue codeuse.
Toutes les variables sont réinitialisées à chaque fin d’asservissement.
Enfin, la constante 127 est ajouté à la variable RapportCyclique pour utiliser les deux sens de rotations(de 0 à 127, on tourne dans un sens et de 127 à 255, on tourne dans l’autre).</p>
<p>J’ai ensuite testé plusieurs consignes d’angles pour 3 valeurs gain Kp (0.25, 0.5 et 0.75) afin de tester cette asservissement tout neuf.</p>
<p>Pour Kp = 0.25 :
L’amortissement du système est faible, ce qui est a priori normal. Mais l’erreur statique est quant à elle constante quelque soit la consigne. D’après mes souvenirs des cours d’automatiques, l’erreur statique doit être proportionnelle à la valeur de la consigne. => Donc là… pas bon.</p>
<p>Pour Kp = 0.5 :
Il y a un faible dépassement et quelques oscillations, mais l’erreur statique remontée par le µC est quasiment nulle, alors que le rotor a parcouru en réalité, un angle bien plus important que la consigne demandée… => Donc là, pas bon non plus.</p>
<p>Pour Kp = 0.75 :
Même constat que pour Kp = 0.5 hormis une légère amplification des oscillations (erreur statique remontée par le µC toujours nulle alors que l’angle parcouru en réalité, est beaucoup, beaucoup plus important que la consigne demandée). => Pas bon non plus…</p>
<p>Voilà mon soucis… J’ai l’impression qu’il y a un truc qui m’échappe… peut-être que j’emploie une mauvaise méthode ?</p>
<p>En vous remerciant par avance pour toutes vos réponses.
Bonne soirée !</p>
<p>PS : j’ai des photos de mes courbes mais je n’arrive pas à les intégrer dans le message…</p>Convertir un angle en tension, message #1979252019-01-24T13:46:35+01:00Aabu/@Aabuhttps://zestedesavoir.com/forums/sujet/12013/convertir-un-angle-en-tension/?page=1#p197925<p>Bonjour, </p>
<p>Je pense qu’il vaut mieux rester sur l’autre sujet, ça reste la continuation des tes questions initiales.</p>
<p>J’ai répondu là-bas. :-)</p>
<p>Je profite de mes super-pouvoirs pour fermer ce sujet-là.</p>Convertir un angle en tension, message #1979142019-01-24T09:59:26+01:00Jupiter41/@Jupiter41https://zestedesavoir.com/forums/sujet/12013/convertir-un-angle-en-tension/?page=1#p197914<p>Bonjour à tous,</p>
<p>Je reviens vers vous suite à mon précédent sujet (<a href="https://zestedesavoir.com/forums/sujet/11649/arduino-asservissement-grace-au-pid/?page=1">https://zestedesavoir.com/forums/sujet/11649/arduino-asservissement-grace-au-pid/?page=1</a>).</p>
<p>Mon professeur va se charger de trouver la fonction de transfert de notre moteur (brushless).
Mais du coup pour s’en servir, quand on l’aura, il faudrait que le PID renvoie une tension comme commande. Et j’aurais 2 questions <img src="/static/smileys/smile.png" alt=":)" class="smiley"> :</p>
<ul>
<li>
<p>Vaut-il mieux convertir l’angle en tension dès le début ou convertir la commande ?</p>
</li>
<li>
<p>Comment faire ? <img src="/static/smileys/smile.png" alt=":)" class="smiley"> Nous avions d’abord pensez à faire un produit en croix pour trouver l’angle après avoir envoyé une certaine tension mais ne faut il pas prendre en compte le temps ? (On rechercherait l’angle parcourue par le drone pendant un temps t lorsque l’on envoie une certaine tension aux moteurs).</p>
</li>
</ul>
<p>Cordialement et Merci d’avance pour votre réponse ! </p>