Régulateur de vitesse MCC ne fonctionne pas


bonjour, bonsoir,

dans l'optique d'un projet de fin d'année, j'ai du réaliser un asservissement en vitesse d'un moteur à courant continu à l'aide d'une carte arduino uno.

ne connaissant rien au langage c++, j'ai essayé de m'inspirer de montages existants disponibles sur internet. le problème est que même en suivant pas à pas les explications, je suis quand même incapable de faire fonctionner mon code.

j'ai eu des résultats très satisfaisants en suivant le montage suivant :
http://www.robot-maker.com/shop/blog/32_utilisation-des-encodeurs.html

en effet j'ai réussi à visualiser sur le moniteur série la vitesse de mon moteur.

l'étape suivante qui consiste à asservir la vitesse du moteur à partir de la vitesse mesurée ne fonctionne pas. tout ce que je reçois via le moniteur est une suite de carrés et de caractères étranges. et la carte arduino qui réagit aléatoirement, soit en bloquant le courant, soit en le laissant passer.

or, le de l'asservissement est de bloquer le courant de manière cyclique, pour atteindre la vitesse de consigne via le montage disponible ici, avec le code que j'ai utilisé :
http://www.ferdinandpiette.com/blog/2012/04/asservissement-en-vitesse-dun-moteur-avec-arduino/

je mets en annexe, le montage que j'ai réalisé 
code: [select]
/**
* asservissement d'un moteur à l'aide d'un régulateur pid
* avril 2012 - ferdinand piette
*/
 
#include <simpletimer.h>           // http://arduino.cc/playground/code/simpletimer
#define _debug false
 
simpletimer timer;                 // timer pour échantillonnage
const int _moteur =  9;            // digital pin pour commande moteur
unsigned int tick_codeuse = 0;     // compteur de tick de la codeuse
int cmd = 0;                       // commande du moteur
 
const int frequence_echantillonnage = 50;  // fréquence du pid
const int rapport_reducteur = 19;          // rapport entre le nombre de tours de l'arbre moteur et de la roue
const int tick_par_tour_codeuse = 16;      // nombre de tick codeuse par tour de l'arbre moteur
 
float consigne_moteur_nombre_tours_par_seconde = 5.;  //  nombre de tours de roue par seconde
 
float erreur_precedente = consigne_moteur_nombre_tours_par_seconde;
float somme_erreur = 0;   // somme des erreurs pour l'intégrateur
float kp = 300;           // coefficient proportionnel
float ki = 5.5;           // coefficient intégrateur
float kd = 100;           // coefficient dérivateur
 
/* routine d'initialisation */
void setup() {
    serial.begin(115200);         // initialisation port com
    pinmode(_moteur, output);     // sortie moteur
    analogwrite(_moteur, 255);    // sortie moteur à 0
 
    delay(5000);                  // pause de 5 sec pour laisser le temps au moteur de s'arréter si celui-ci est en marche
 
    attachinterrupt(0, compteur, change);    // interruption sur tick de la codeuse (interruption 0 = pin2 arduino mega)
    timer.setinterval(1000/frequence_echantillonnage, asservissement);  // interruption pour calcul du pid et asservissement
}
 
/* fonction principale */
void loop(){
    timer.run();
    delay(10);
}
 
/* interruption sur tick de la codeuse */
void compteur(){
    tick_codeuse++;  // on incrémente le nombre de tick de la codeuse
}
 
/* interruption pour calcul du pid */
void asservissement()
{
    // réinitialisation du nombre de tick de la codeuse
    int tick = tick_codeuse;
    tick_codeuse=0;
 
    // calcul des erreurs
    int frequence_codeuse = frequence_echantillonnage*tick;
    float nb_tour_par_sec = (float)frequence_codeuse/(float)tick_par_tour_codeuse/(float)rapport_reducteur;
    float erreur = consigne_moteur_nombre_tours_par_seconde - nb_tour_par_sec;
    somme_erreur += erreur;
    float delta_erreur = erreur-erreur_precedente;
    erreur_precedente = erreur;
 
    // pid : calcul de la commande
    cmd = kp*erreur + ki*somme_erreur + kd*delta_erreur;
 
    // normalisation et contrôle du moteur
    if(cmd < 0) cmd=0;
    else if(cmd > 255) cmd = 255;
    analogwrite(_moteur, 255-cmd);
 
    // debug
    if(_debug)  serial.println(nb_tour_par_sec,8);
}


voila, j'espère que mes explications sont claires. si vous voulez des précisions n'hésitez pas à poser des questions. la mienne est simple :  qu'est ce qui se passe pour que le moniteur, qui m'affiche la vitesse avec l'un des programmes, s'emballe avec un autre ?

vous remerciant d'avance pour votre aide,

cordialement



Arduino Forum > International > Français (Moderators: jfs, Snootlab) > Régulateur de vitesse MCC ne fonctionne pas


arduino

Comments

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts