Pages: [1]   Go Down
Author Topic: Comparaison de tension et sortie PWM  (Read 1418 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 !
Logged

68 aujourd'hui
Offline Offline
Edison Member
*
Karma: 41
Posts: 2257
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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" ?
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Comme dit 68tjs (au fait ca veut dire quoi ? t'es un vieux 68tard ? révolutionnaire ? smiley-wink )
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:
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" smiley-wink

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

Logged

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 ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

68 aujourd'hui
Offline Offline
Edison Member
*
Karma: 41
Posts: 2257
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

à 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 !
Logged

France
Online Online
Faraday Member
**
Karma: 38
Posts: 3535
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
si la commande est à 5V et le capteur à 0V le rapport cyclique sera maximal
Code:
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:
analogWrite(hachPin, (valCom-valCapt)/4);

Il va sans dire que la remarque de Barbudor reste valable.
« Last Edit: May 21, 2012, 02:24:49 pm by fdufnews » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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 ?

68 aujourd'hui
Offline Offline
Edison Member
*
Karma: 41
Posts: 2257
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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é.
Logged

Pages: [1]   Go Up
Jump to: