Go Down

Topic: Aide pour creation d'un PID (Read 2819 times) previous topic - next topic

fdufnews

Quote
mais il ne marche pas ...

c'est à dire ????
Qu'est-ce qui ne marche pas?

romain

il affiche seulement 0 aux valeurs de retour (Input) je comprends pas pourquoi  :'(

churchill

A quoi sert ta fontion fonctiontrans() déclarée comme devant retourner un double, mais ne retournant rien ?

churchill

romain

#18
Apr 14, 2010, 03:40 pm Last Edit: Apr 15, 2010, 02:06 pm by freeman32 Reason: 1
ah je vois le problème je pense vient de là. Je veux un sous programme contenant ma fonction de transfert du système. je pensai au début de type :
Code: [Select]
void fonctiontrans(double Input,double Output){
 double k;
 k=3;
 Input2=alpha*Input+k*(1-alpha)*Output;

}

mais sa ne marche pas aussi ... :(

romain

#19
Apr 14, 2010, 04:55 pm Last Edit: Apr 15, 2010, 11:11 am by freeman32 Reason: 1
ah j'ai vraiment fait n'importe quoi voici un programme décent il tourne mais par contre les valeurs c'est pas terrible  si quelqu'un pouvait m'aider je pense qu'il y a juste quelques paramètres a régler

Code: [Select]
#include <PID_Beta6.h>

#define alpha 0.95
#define k     2

double Consigne, Mesure, Commande;

PID pid(&Mesure, &Commande, &Consigne,2,3,1);

void fonctiontrans(){
Mesure=alpha*Mesure+k*(1-alpha)*Commande;
}

void setup()
{
 Serial.begin(9600);
 Consigne = 1000;
 Commande=0;
 Mesure=0;

 pid.SetOutputLimits(-4000,4000);
 pid.SetMode(AUTO);
 pid.SetSampleTime(1000);
}

void loop()
{
if(abs(Consigne-Mesure)>100)
 pid.SetTunings(3,2,1);
else
 pid.SetTunings(2,2,1);
 
fonctiontrans();
pid.Compute();

Serial.print("Mesure : ");
Serial.print(Mesure, DEC);
Serial.print(" Commande :");
Serial.println(Commande, DEC);
delay(40);
}



romain

aidez moi s'il vous plaît  :-[

churchill

Quote
les valeurs c'est pas terrible  si quelqu'un pouvait m'aider je pense qu'il y a juste quelques paramètres a régler

"c'est pas terrible" n'est pas vraiment une unité de mesure qui permettra de résoudre ton problème.

Je n'ai jamais utilisé de PID "proportionnel intégrateur et dérivé" ni n'en ressent le besoin, et à vrai dire je n'ai pas envie de me taper la théorie et de lire tout le fichier source de la bibliothèque dont tu parles PID_Beta6.h pour voir comment ça marche. Sans vouloir m'avancer, je ne crois pas être le seul sur ce forum dans ce cas.

Mais je pense (mais peut-être je me répète) que tu devrais tout d'abord te former un peu au C puis te familiariser avec l'arduino avant de te lancer dans un projet dont tu ne maîtrise rien.
La progression c'est d'abord faire clignoter une led, puis deux, puis appuyer sur un bouton pour faire clignoter une led, puis faire tourner un petit moteur, puis etc... Et quand tu es à l'aise avec tout ça tu t'attaques à ton PID.
On ne peux pas aller sur un forum en disant "Voilà j'ai une carte arduino et un moteur et j'aimerais construire un hélicoptère, mais je n'y arrive pas, aidez moi."

Le principe d'un forum comme celui-ci est que l'on t'aide en corrigeant tes erreurs, en t'orientant, en te conseillant, mais pas en faisant le travail pour toi. Le principe c'est "aides toi et le forum t'aidera".

Ah, et puis ça ne sert à rien de poster "aidez moi s'il vous plaît", car si personne n'a pu (ou voulu) "t'aider" avant, ce n'est pas cela qui va relancer la machine, surtout si tu n'apportes rien de nouveau à ton problème.

Si tu veux réellement de l'aide il faut détailler les points qui te posent problème du genre :
Quote
Voilà la fonction machin, normalement en lui donnant le paramètre a=50 je dois obtenir 17.5 mais là j'ai 17. J'ai cherché sur le site du créateur (www.sonsite.com) et lu la documentation mais je ne vois pas ce qui cloche. Avez-vous une idée ?
Code: [Select]
float machin(a){...}

et pas comme tu l'as fait (ce n'est qu'un exemple) :
Quote
Je veux une un sous programme contenant ma fonction de transfert du système
Parce que là, personnellement je ne comprends rien (je suis peut-être un peu limité, je l'avoue).

Ne te vexes pas de ce que je te dis, c'est en faisant des erreurs et en les corrigeant qu'on avance.

churchill

romain

bon ok j'ai compris la leçon lol je vais essayer de faire un petit effort ^^

romain

bon j'ai réussit mon programme et il marche du tonnerre :) maintenant je me penche sur le i2c j'ai compris le principe mais il y a quelque chose qui me chiffonne comme peut on sélectionner un mode (voir http://www.robot-electronics.co.uk/htm/md22tech.htm ) par exemple pour l'adresse 0x00 (mode registre) il me propose plusieurs modes de fonctionnement du moteur  :
Code: [Select]
Mode Register
The mode register selects which mode of operation and I2C data input type the user requires. The options being:

0,     (Default Setting) If a value of 0 is written to the mode register then the meaning of the speed registers is literal speeds in the range of:
       0 (Full Reverse)  128 (Stop)   255 (Full Forward).

1,    Mode 1 is similar to Mode 0, except that the speed registers are interpreted as signed values. The meaning of the speed registers is literal speeds in the range of:
      -128 (Full Reverse)   0 (Stop)   127 (Full Forward).

2,     Writing a value of  2 to the mode register will make speed control both motors speed. Speed2 then becomes the turn value (type 1).
       Data is in the range of 0 (Full Reverse)  128 (Stop)  255 (Full  Forward).
       note - version 8+ speed controls the total power, the turn (speed 2) value is now with reference to this.

3,    Mode 3 is similar to Mode 2, except that the speed registers are interpreted as signed values.
       Data is in the range of -128  (Full Reverse)  0 (Stop)   127 (Full Forward)
        note - version 8+ speed controls the total power, the turn (speed 2) value is now with reference to this.

4,    (New from version 9) Alternate method of turning (type 2), the turn value being able to introduce power to the system.
      Data is in the range of 0 (Full Reverse)  128 (Stop)  255 (Full  Forward).

5,    (New from version 9) Alternate method of turning (type 2), the turn value being able to introduce power to the system.
       Data is in the range of -128  (Full Reverse)  0 (Stop)   127 (Full Forward)

j'aimerais sélectionner le mode 1 comment puis je faire?? voici un bout de mon programme :
Code: [Select]
void setmode(){
[color=#ff0000]Wire.beginTransmission(0xB0);                
 Wire.send(Mode);
 Wire.send(0x01);                  
 Wire.endTransmission();[/color]
 
 Wire.beginTransmission(0xB0);     // regle la valeur  255 pour la valeur de l'acceleration
 Wire.send(0x03);
 Wire.send(0xFF);
 Wire.endTransmission()
}

es ce correct??

Go Up