Aller au contenu


Contenu de vivitern

Il y a 1 élément(s) pour vivitern (recherche limitée depuis 26-avril 13)


#90844 Equalizing motors speed for balancing robot

Posté par vivitern sur 13 décembre 2017 - 08:25 dans Electronique

I am currently working on a balancing robot project using Arduino Uno. I am able to get the robot to balance but one of its motor have the tendency to rotate more than the other.

Je pense avoir déjà lu un concept similaire sur ce lien: http://jjrobots.com/projects-2/b-robot/ ,  Malheureusement, je n'ai pas complètement saisi le concept présenté.

I am using the L298N Fiche techniquehttp://www.kynix.com/uploadfiles/pdf9675/L298N.pdf)motor controller with 2 x 30:1 Metal Gearmotor 37Dx68L mm with 64 CPR Encoder from polulu.com. I have also tried to compensate for the difference in speed by monitoring the encoder value on each motor. Unfortunately, the compensation logic seems to contradict the PWM control needed to balance the robot and causes it to oscillate quite a lot.

I am currently using the following code to balance the motor speed:

dPos = leftCounterCurr - rightCounterCurr;
if(dPos > 10) {
leftPWM = u + k*abs(dPos);
rightPWM = u - k*abs(dPos);
}
else if(dPos < -10) {
leftPWM = u - k*abs(dPos);
rightPWM = u + k*abs(dPos);
}

dPos refers to the difference in the two encoders values. leftPWM and rightPWM are the PWM values to control the left and right motor respectively. u is the output of the PID control and it is adjusted by certain gain value to compensate for the difference in motor speed.

I hope someone with similar experiences can help me out. Thanks in advance.

Edit 1: @Marko I did some characterization of my motors today. Thought I would post it here in case anyone might find it useful. The results are shown below. It seems that with proper capacitance tuning, I am able to get the motors to give almost similar responses. However, I believe there is still a need to use a control loop for better performance.

4t2ce.png

For example,if the left motor has a 0.3uF capacitor across its terminals while the right motor has a 0.2uF capacitor across its terminal, we can observed that the two response curve are very close together.

Another thing that I notice was that the motor would not move for duty cycle below 20%. And it seems like a universal problem with PWM control of DC brush motors... or at least I have not find any methods to overcome this behavior yet.

 

 

En Français : 

 

Je travaille actuellement sur un projet de robot équilibrise utilisant Arduino Uno. Je suis capable d'équilibrer le robot mais l'un de ses moteurs a tendance à tourner plus que l'autre.
Je pense avoir déjà un concept similaire sur ce lien: http://jjrobots.com/projects-2/b-robot/ , Malheureusement, je n'ai pas complètement saisi le concept présenté.
J'utilise le contrôleur de moteur L298N Fiche technique ( http://www.kynix.com/uploadfiles/pdf9675/L298N.pdf) avec 2  motoréducteur de rapport de réduction  30: 1 reférence Metal Gearmotor 37Dx68L  avec encodeur CPR 64 . J'ai également essayé de compenser la différence de vitesse en surveillant la valeur du codeur sur chaque moteur. Malheureusement, la logique de compensation semble contredire le contrôle PWM nécessaire pour équilibrer le robot et le fait osciller beaucoup.
J'utilise actuellement le code suivant pour équilibrer la vitesse du moteur:
 
dPos = leftCounterCurr - rightCounterCurr;
if (dPos> 10) {
leftPWM = u + k * abs (dPos);
rightPWM = u - k * abs (dPos);
}
else if (dPos <-10) {
leftPWM = u - k * abs (dPos);
rightPWM = u + k * abs (dPos);
}
 
dPos fait référence à la différence entre les valeurs des deux encodeurs. leftPWM et rightPWM sont les valeurs PWM pour contrôler respectivement le moteur gauche et le moteur droit. u est la sortie de la commande PID et est ajustée par une certaine valeur de gain pour compenser la différence de vitesse du moteur.
J'espère que quelqu'un avec des expériences similaires peut m'aider. Merci d'avance.
Edit 1: @Marko J'ai fait une caractérisation de mes moteurs aujourd'hui. Je pensais que je l'afficherais ici au cas où quelqu'un pourrait le trouver utile. Les résultats sont montrés plus bas. Il semble qu'avec un réglage de capacitance approprié, je puisse obtenir des réponses presque similaires. Cependant, je crois qu'il est toujours nécessaire d'utiliser une boucle de contrôle pour de meilleures performances.
( voir image ) 
 
Par exemple, si le moteur gauche a un condensateur de 0,3 uF à travers ses bornes alors que le moteur droit a un condensateur de 0,2 uF à travers sa borne, nous pouvons observer que les deux courbes de réponse sont très proches les unes des autres.
Une autre chose que j'ai remarqué était que le moteur ne bougerait pas pour un cycle de service inférieur à 20%. Et cela semble être un problème universel avec le contrôle PWM des moteurs à balais à courant continu ... ou du moins je n'ai trouvé aucune méthode pour surmonter ce problème pour le moment.