Go Down

Topic: Comparaison de tension et sortie PWM (Read 1 time) previous topic - next topic

Eliam

Salut à tous et à toutes !

Nous sommes un petit groupe d'élèves à travailler en ce moment sur un projet d'élec, et nous devons utiliser une carte Arduino (UNO) pour effectuer les opérations suivantes :
-mesurer deux tensions d'entrée comprises entre 0 et 5V
-calculer la différence des deux tension
-sortir une jolie tension carrée dont le rapport cyclique est proportionnel au résultat précédent

Traduction : si la commande est à 5V et le capteur à 0V le rapport cyclique sera maximal, si la commande et le rapport cycliques sont égaux le rapport cyclique est nul.
Cependant, nous rencontrons deux problèmes : premièrement, si nous n'effectuons que les opérations citées ci-dessus, le rapport cyclique n'est pas nul quand les deux tensions sont égales mais quand la tension du capteur est 1V en dessous de la tension de commande... Bizarre !
Deuxièmement, notre prof aimerait qu'on intègre un PID dans le programme, afin que le rapport cyclique change en douceur. Mais malgré ce que j'ai trouvé sur le net et sur ce site je n'arrive pas du tout à faire cette deuxième partie !

Je vous montre ce que nous avons écrit, sans la partie PID :
Code: [Select]

int hachPin = 9;      // Hacheur connectée sur la broche 9
int comPin = 3;   // réglage commande utilisateur connecté sur la broche analogique 3
int captPin = 4;   // capteur connecté sur la broche analogique 4

// variables pour stocker la valeur de la tension lue
int valCapt, valCom;

void setup()
{
  pinMode(hachPin, OUTPUT);   // configure la broche en sortie
}



void loop()
{
       
      valCapt = analogRead(captPin);
      valCom = analogRead(comPin);

      if(valCom-valCapt<=0)
      analogWrite(hachPin, (valCapt-valCom)/4);  // calcul du rapport cyclique : les tensions d'entrée sont entre 0 et 1023, le PWM se commande entre 0 et 255, d'ou le rapport 1/4
}


Quand au code avec PID, j'ai quasiment copié ligne pour ligne le code donné en exemple sur le site ici http://arduino.cc/playground/Code/PIDLibaryBasicExample
cependant la sortie est bizarre : sur l'oscillo, faire varier les tensions d'entrée ne changent pas le rapport cyclique mais l'amplitude du signal carré, de plus en dessous de certaines valeurs (environ 3,3V pour la tension de commande) le signal devient carrément plat.

J'aimerai donc avoir quelques conseils à la lumière de votre expérience, sachant que c'est mon test d'arduino

Merci d'avance et bonne soirée à vous !

68tjs

Avez vous procédé par étape pour vérifier votre programme et votre montage ?
Quote
le rapport cyclique n'est pas nul quand les deux tensions sont égales mais quand la tension du capteur est 1V en dessous de la tension de commande

Avez vous comparé les mesures faites avec l'arduino en affichant les résultats avec un serial.Print() avec les mesures faites au voltmètre ?
C'est une étape essentielle pour identifier la localisation du non fonctionnement.

PS : je suis un vieil analogicien qui aimerait savoir ce qu'est un "PID" ?

barbudor

Comme dit 68tjs (au fait ca veut dire quoi ? t'es un vieux 68tard ? révolutionnaire ? ;) )
Comme dit notre ami, afficher les valeurs pour voir avec quoi vous travailler
Là vous êtes en aveugle pur

Quote
si la commande est à 5V et le capteur à 0V le rapport cyclique sera maximal, si la commande et le rapport cycliques sont égaux le rapport cyclique est nul.


Et si le capteur est supérieur à la commande ?
Votre code ne fait rien si valCapt > valCom

En quoi est-ce un problème ?

==> Il est impératif que tous les cas ammène à un résultat défini.

Apparemment votre signal hachPin va commander quelque chose qui va amener une grandeur physique mesurée par le capteur à grandir : une position, une température, je ne sais pas.
Si à un moment donné valCapt < valCom vous activez du signal sur hachPin (par exemple, vous chauffez)
Admettons que le système réagisse vite et qu'au tour de loop() suivant vous vous retrouviez avec valCapt > valCom
Résultat votre code ne fais rien ET GARDE LA SORTIE ACTIVE
Le système se met alors à dériver hors de contrôle !

Je suggère de modifier comme ceci :
Code: [Select]
if(valCom-valCapt< 0 )
      analogWrite(hachPin, (valCapt-valCom)/4);
else
      analogWrite(hachPin, 0);


@68tjs : PID : Proportionnelle Intégrale Dérivée : algorithme d'asservissement très réputé.
Il consiste à définir le signal de sortie comme une combinaison linaire de 3 grandeurs :
- le signal du capteur (proportionnelle)
- l'intégrale du signal du capteur (intégrale)
- la dérivée du signal du capteur
Le tout est de bien calculer les coefficients pour arriver au type d'asservissement souhaité.
C'est tout ce que j'en sais. je suis sensé l'avoir étudié à l'école mais je devais "ailleurs" ;)

Sur mon robot j'ai appliqué un code de PID piqué directement sur le code de Pololu pour leur robot mp3I

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

skywodd

Bonjour,

Quote
le rapport cyclique n'est pas nul quand les deux tensions sont égales mais quand la tension du capteur est 1V en dessous de la tension de commande

Est ce que le montage est bon ?
Si oui est ce qu'en ajoutant des Serial.println(...) pour afficher les deux valeurs on ce retrouve bien avec des résultats cohérent ?


PS : je suis un vieil analogicien qui aimerait savoir ce qu'est un "PID" ?

PID -> Proportionnel Intégrale Dérivé
C'est une méthode de régulation générique qui permet de lisser / réguler une variation.
http://fr.wikipedia.org/wiki/Régulateur_PID
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

68tjs

à Barbudor:
22 ans en 1968 : a l'époque j'ai collé quelques "il est interdit d'interdire" et "l'imagination au pouvoir" , c'étaient mes deux préféré :smiley-mr-green:

PID : je connaissais le principe mais pas le nom sous la forme d'initiales  -> le grand âge !

fdufnews

#5
May 21, 2012, 09:17 pm Last Edit: May 21, 2012, 09:24 pm by fdufnews Reason: 1
Quote
si la commande est à 5V et le capteur à 0V le rapport cyclique sera maximal

Code: [Select]
analogWrite(hachPin, (valCapt-valCom)/4);

Il me semble que tu fais le contraire de ce que tu dis.
Si capteur = 0 et commande=5V, la commande vaut (0-1023)/4.... le résultat est négatif.

C'est pas plutôt ça que tu veux?
Code: [Select]
analogWrite(hachPin, (valCom-valCapt)/4);

Il va sans dire que la remarque de Barbudor reste valable.

Eliam

Salut à tous,

tout d'abord merci pour vos réponses ! Vous m'avez orienté sur le serial monitor qui m'a été bien utile pour le coup (je ne connaissais pas) et qui m'a montré que ça fonctionnait en fait plutôt bien le code, avec la ligne conseillée par Barudor c'est parfait. Ce qui m'étonne c'est que l'oscillo affiche pas les tensions correspondantes aux sorties affichées par la Arduino dans le serial monitor, mais enfin ça a l'air de fonctionner quand même. J'en déduis que ça vient de mon collègue qui a mal réglé l'oscillo ^^

Par contre je n'arrive pas à bien comprendre comment fonctionne le PID que j'aimerai maintenant intégrer dans mon code, la doc ne m'aide pas trop et bizarrement si je copie-colle les codes présentés en exemple pour le PID (http://arduino.cc/playground/Code/PIDLibaryBasicExample), il agit vraiment bizarrement : à 0V en entrée, la valeur de la variable de sortie est à 255, et passé un seuil d'environ 0.7V en entrée, la sortie plonge à zéro... je ne pige pas vraiment ce qu'il se passe. Si quelqu'un maîtrise un peu le sujet, j'aimerai bien être éclairé, sinon je me débrouillerai sans !

Merci en tout cas pour votre aide.

barbudor

Attention, les tensions que tu va voir sur la sortie PWM de l'Arduino restent du 0..5V modulé en largeur d'impulsion.
Ce n'est pas une vrai sortie analogique.
Si tu as besoin d'une vrai sortie analogique, il faut utiliser après un filtre RC puis un ampli op.
Le calcul de RC va dépendre de tes besoins réactivité et bruit résiduel.
Un petit RC va régir rapidemment aux changement mais avoir plus de bruit résiduel.
Un gros RC va mieux filtrer le PWM mais ralentir la vitesse de réaction aux changements de valeur.


Pour le PID, il faut d'abord comprendre le principe et le fonctionnement théorique avant d'utiliser une LIB ou de l'implémenter soit même.
Si tu ne sais pas comment ça marche, tu feras n'importe quoi.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

68tjs

Il y a aussi la solution : [Registre à décalage 8bits +réseau résistif R/2R].

Un exemple de réalisation avec le code arduino:
http://electro-nut.blogspot.fr/2009/08/making-12-bit-serial-dac.html

Le filtrage est plus aisé.

Go Up