Go Down

Topic: Charge et décharge du condensateur (Read 3487 times) previous topic - next topic

baszoe

Le montage que j'ai réalisé est en fichier joint avec le programme que j'ai écris mais il ne fonctionne pas

 
1) Calculer la valeur de C pour avoir 5*RC = 2,5 s. pour la valeur du condo j'ai trouvé 100µF
2) Ecrire un programme Arduino permettant de réaliser les consignes  suivantes.
•Lorsque l'utilisateur appuie sur le bouton poussoir, la broche D7 passe à HIGH pour une
durée de 2,5 s. Le condensateur étant initialement déchargé, cela a pour effet de
démarrer la charge. Après ce temps, la broche D7 passe à LOW ce qui a pour effet de
décharger le condensateur. Durant cette phase, le programme acquière la tension aux
bornes du condensateur qu'il envoie vers le port série avec la valeur de la tension de la
broche D7 (5V ou 0V). L'envoi des données sur le port série se fera pendant 5 s (2,5 s pour
la charge et 2,5 s pour la décharge).
Cette valeur sera visualisée sous forme de graphe à l'aide du logiciel Processing.


Dans l'attente de votre aide je vous remercie d'avance
 


J-M-L

C'est quoi ça?


void loop() {
    void loop()
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

bilbo83

Bonsoir,

Il y a plusieurs erreurs dans ton progamme.

Tout d'abord les variables:
Après float vana = 0.0 il manque un ";".
byte etatCourant  et   unsigned long Timer, sont définies dans le setup() donc inconnues dans loop().

Ensuite, dans ta loop(), tu a un delay(2000), c.à.d. 2s, ce qui signifie que tu ne fait une mesure que toutes les deux secondes. Tu pourrais réduire le temps de boucle à 100mS, voire moins.

Et tu n'as pas initialiser ta liaison série avec la vitesse de transmission par un "Serial.begin()" dans le setup().

Et il ya certainement d'autres erreurs, mais corrige déjà toutes celles-ci.

baszoe

Bonsoir,

Il y a plusieurs erreurs dans ton progamme.

Tout d'abord les variables:
Après float vana = 0.0 il manque un ";".
byte etatCourant  et   unsigned long Timer, sont définies dans le setup() donc inconnues dans loop().

Ensuite, dans ta loop(), tu a un delay(2000), c.à.d. 2s, ce qui signifie que tu ne fait une mesure que toutes les deux secondes. Tu pourrais réduire le temps de boucle à 100mS, voire moins.

Et tu n'as pas initialiser ta liaison série avec la vitesse de transmission par un "Serial.begin()" dans le setup().

Et il ya certainement d'autres erreurs, mais corrige déjà toutes celles-ci.
Bonjour,

Merci de ton aide.

J'ai corrigé le programme et sa donne sa:

int vnum = 0;
float vana = 0.0;
byte etatCourant = LOW;
    unsigned long Timer = 0;
void setup() {
      Serial.Begin(9600);
}

void loop() {
   
      unsigned long dateCourante = millis();
      unsigned long intervalle = dateCourante - Timer;
     
      if (etatCourant == LOW && intervalle > 2500) {
       
        etatCourant = HIGH;
        digitalWrite(7, etatCourant);
        Timer = dateCourante;
      }
      else if (etatCourant == HIGH && intervalle > 2500) {
       
        etatCourant = LOW;
        digitalWrite(7, etatCourant);
        timer = dateCourante;
}
   //: Voltemetre    
      vnum = analogRead(A0);
vana = 5.0* (vnum/1024.0);
Serial.print("Valeur numérique : ");
Serial.print(vnum);
Serial.println(" sur 1024");
Serial.print("Valeur analogique : ");
Serial.print(vana);
Serial.println("V");
delay(2000);
     
    }

Y-a-t'il d'autre erreurs ? et comment rajouter un "interrupteur" dans ce programme qui permet de faire ce qui est demandé dans mon premier post ?


Dans l'attente de votre aide je vous remercie d'avance.

bilbo83

#4
Mar 26, 2017, 11:01 am Last Edit: Mar 26, 2017, 11:04 am by bilbo83
Tu as toujours le delay à 2000, mets 100 pour tester.

Pour la conversion numérique/volt de vana:
Si tu veux être plus précis il faut que tu mesure la tension sur ta sortie 7 , ce ne sera certainement pas 5v exactement (ton circuit RC étant connecté).
Ensuite, ce n'est pas vnum/1024.0, c'est vnum/1023.0

Tu as également une mauvaise initialisation de Timer, au premier passage dans loop, millis()-Timer a une très forte probabilité d'être >2500. Ce n'est pas très grave, mais la solution est facile à trouver.

bilbo83

Précision:

Pour être conforme au réel, tu doit tenir compte de la mesure de la tension de sortie de la pin 7 à l'état haut (post précédent) mais également de la tension de sortie à l'état bas, ce ne sera certainement pas zéro.

J-M-L

corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code] // votre code ici [/code].

ça doit ressembler à cela:
Code: [Select]
// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)


Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

baszoe

Tu as toujours le delay à 2000, mets 100 pour tester.

Pour la conversion numérique/volt de vana:
Si tu veux être plus précis il faut que tu mesure la tension sur ta sortie 7 , ce ne sera certainement pas 5v exactement (ton circuit RC étant connecté).
Ensuite, ce n'est pas vnum/1024.0, c'est vnum/1023.0

Tu as également une mauvaise initialisation de Timer, au premier passage dans loop, millis()-Timer a une très forte probabilité d'être >2500. Ce n'est pas très grave, mais la solution est facile à trouver.

J'ai fait une courbe avec un delay(100) cela ne change rien à la prise de mesure, ce qui gère la prise de mesure est le 2500 ms, en changeant 2500 ms par 100 ms la prise de mesure ce fait tout les 100 ms.

Je ne comprend pas a quoi sert le delay et pourquoi les 2500 ms gère et la prise de mesure alors que je voudrais qu'il gère le temps de maximum de la prise de mesure (2.5 s de charge et 2.5 s de décharge donc durée total de la prise de mesure de 5 s).

Dans l'attente de votre aide je vous remercie d'avance.

dfgh

#8
Mar 26, 2017, 01:34 pm Last Edit: Mar 26, 2017, 01:45 pm by dfgh
hello
avec 10ms, ca marche bien, les courbes sont jolies

j'ai rajouté un pic toutes les secondes pour avoir une échelle de temps

edit: suite au post ci dessus ( de_pépé_), la liaison est en 115200

baszoe

hello
avec 10ms, ca marche bien, les courbes sont jolies

j'ai rajouté un pic toutes les secondes pour avoir une échelle de temps

edit: suite au post ci dessus ( de_pépé_), la liaison est en 115200
Bonjour,

J'ai le même programme et la courbe ne s'interrompt jamais et sa donne uniquement le chargement du condensateur (première partie de ta courbe qui dure indéfiniment).
Peut-tu m'envoyer ton programme s'il-te-plaît ?

Dans l'attente de votre aide je vous remercie d'avance.

dfgh

je t'ncourage à regarder la fonction milis();

voici le code avec un while pour bloquer son exécution ( copie d'écran oblige)
et etat courant est un intermédiaire dont il est possible de se passer
Code: [Select]
int etatCourant = LOW;
int temps_charge = 2500;
unsigned long depart_charge = 0;
unsigned long fin_charge = 0;
int temps_decharge = 2500;
unsigned long depart_decharge = 0;
unsigned long fin_decharge = 0;
unsigned long ms = 0;
float charge = 0.0;
float decharge = 0.0;
void setup() {
  Serial.begin(115200);
  pinMode (7, OUTPUT); digitalWrite(7, LOW);
  pinMode (2, INPUT);
  pinMode (A0, INPUT);
}

void loop()
{
  if (!digitalRead(2))
  {
    etatCourant = HIGH;
    digitalWrite(7, etatCourant);
    depart_charge = millis();
    ms= millis();
    do
    {
      fin_charge = millis();
      if((millis()-ms)>1000){ms= millis();Serial.println(1023);}
      charge = (analogRead(A0));
      Serial.println(charge);
      delay(10);
    } while ((fin_charge - depart_charge) < temps_charge);
 
    etatCourant = LOW;
    digitalWrite(7, etatCourant);
    depart_decharge = millis();
    ms= millis();
    do
    {
      fin_decharge = millis();
      if((millis()-ms)>1000){ms= millis();Serial.println(1023);}
      decharge = (analogRead(A0));
      Serial.println(decharge);
      delay(10);
    } while ((fin_decharge - depart_decharge) < temps_decharge);
    while(1);
  }
}

baszoe

je t'ncourage à regarder la fonction milis();

voici le code avec un while pour bloquer son exécution ( copie d'écran oblige)
et etat courant est un intermédiaire dont il est possible de se passer
Code: [Select]
int etatCourant = LOW;
int temps_charge = 2500;
unsigned long depart_charge = 0;
unsigned long fin_charge = 0;
int temps_decharge = 2500;
unsigned long depart_decharge = 0;
unsigned long fin_decharge = 0;
unsigned long ms = 0;
float charge = 0.0;
float decharge = 0.0;
void setup() {
  Serial.begin(115200);
  pinMode (7, OUTPUT); digitalWrite(7, LOW);
  pinMode (2, INPUT);
  pinMode (A0, INPUT);
}

void loop()
{
  if (!digitalRead(2))
  {
    etatCourant = HIGH;
    digitalWrite(7, etatCourant);
    depart_charge = millis();
    ms= millis();
    do
    {
      fin_charge = millis();
      if((millis()-ms)>1000){ms= millis();Serial.println(1023);}
      charge = (analogRead(A0));
      Serial.println(charge);
      delay(10);
    } while ((fin_charge - depart_charge) < temps_charge);
 
    etatCourant = LOW;
    digitalWrite(7, etatCourant);
    depart_decharge = millis();
    ms= millis();
    do
    {
      fin_decharge = millis();
      if((millis()-ms)>1000){ms= millis();Serial.println(1023);}
      decharge = (analogRead(A0));
      Serial.println(decharge);
      delay(10);
    } while ((fin_decharge - depart_decharge) < temps_decharge);
    while(1);
  }
}

Merci, mais dans mon sujet on me demande d'utiliser un bouton poussoir en temps qu'interrupteur, comme les explication ci-dessous.

•Lorsque l'utilisateur appuie sur le bouton poussoir, la broche D7 passe à HIGH pour une
durée de 2,5 s. Le condensateur étant initialement déchargé, cela a pour effet de
démarrer la charge. Après ce temps, la broche D7 passe à LOW ce qui a pour effet de
décharger le condensateur. Durant cette phase, le programme acquière la tension aux
bornes du condensateur qu'il envoie vers le port série avec la valeur de la tension de la
broche D7 (5V ou 0V).



dfgh

hello
oui et ton schéma dit bien que le BP est sur D2

chez moi, le BP est un bout de fil raccordé à gnd un court instant puis raccordé à +5V.
le prg fait le reste

D7 sur la résistance
A0 sur sur la borne + du condo


baszoe

Merci à tous de m'avoir aider j'espère que ce sujet servira à d'autre personne.

bilbo83

#14
Mar 26, 2017, 06:57 pm Last Edit: Mar 26, 2017, 06:59 pm by bilbo83
Oui, tu as raison pepe, la datasheet du constructeur donne bien 1024 (vu pour un ATmega 2560).
Rien vue sur la doc de l'AT91SAM de la DUE que j'utilise plus couramment, mais je suppose que c'est pareil.
Cela ne me paraissais pas normal, mais bon, je vais bien lire la doc pour mieux comprendre.

On retrouve 1023 dans beaucoup de tutos et cela était plus conforme à mes habitudes.


Go Up