comment utiliser analogReference (INTERNAL);

bonjour. je pense que je n'ais pas compris comment utiliser analogReference (INTERNAL); j'ai trouvé des exemples mais ça ne fonctionne pas je débute, j'avance très lentement et la je ne trouve pas d'explications, alors je fait a nouveau appel a vous.

lorsque je fait simplement la lecture d'un capteur ACS712 comme cela j'obtiens bien dans le moniteur série un nombre cohérent.

void setup() {
   Serial.begin(9600);
  
}

void loop() {
 int sensorValue = analogRead (A0);
 Serial.println (511 - sensorValue);
 delay( 250);

}

afin d’améliorer la précision j'essaie d'appeler la référence interne comme cela:

void setup() {
   Serial.begin(9600);
   analogReference (INTERNAL);
  }

void loop() {
 int sensorValue = analogRead (A0);
 Serial.println (511 - sensorValue);
 delay( 250);

}

mais dans le moniteur série j'ai -512 qui s'affiche en permanence.

en cherchant dans les tutos et exemples il est parfois dit d'initialiser en ajoutant cette ligne dans le setup.

void setup() {
   Serial.begin(9600);
   analogReference (INTERNAL);
   analogRead(A0);
}

mais cela ne change rien. je ne comprends pas, j'ai clone chinois, mais bon jusque la tout passe Meci par avance

Clone ou pas clone : rien à voir puisque la carte compte pour du 2eme ou 3eme ordre, ce qui compte c’est le microcontrôleur et c’est le même.
Un point de réglé :grin: .

int sensorValue = analogRead (A0);
 Serial.println (511 - sensorValue);

Peut tu expliquer ce que font ces lignes ?
Si tu y arrive tu trouvera ton erreur.

Un peu de technique sur le fonctionnement du convertisseur analogique digital (CAD)
Le CAD prend la tension de référence (Vref) et la découpe en 210 (1024) intervalles.
Soit un pas de mesure Vpas = Vref/1024.
Par défaut Vref = Vcc, si tu utilise la référence interne Vref = 1,1V

Le CAD renvoi un nombre compris entre 0 et 1023 qui représente le nombre de pas contenus dans la tension à mesurer.
Diviser des volts par des volts c’est juste un nombre donc pour obtenir des volts il va falloir multiplier ce nombre par le pas de mesure.

Avec ces explications tu devrai pouvoir corriger ton code, si tu as des doutes n’hésite pas à poser des questions complémentaires.

bonsoir
merci d’essayer de m’aider.

Alors je suis partit avec ses bases:

Déja j’avais de la chance d’avoir trouvé ce fil ou tu explique pas mal de choses a ce sujet. y compris le filtrage.
Je ne comprends pas pourquoi chez moi ça ne marche pas

-et ça marche, enfin je comprends a peu près le principe.
-ce que je ne comprends pas c’est qu’en essayant d’améliorer la résolution suivant ce principe:
Utiliser une tension de référence plus petite augmente la résolution de la mesure : 5V/1024 = 4.88mV alors de 1.1V/1024 = 1,07mV…

et en ajoutant:

analogReference (INTERNAL);

plus rien ne marche!

j’ai donc lu cet article, mais le code lié ne fonctionne pas!
https://wiki.mchobby.be/index.php?title=SENSEUR-COURANT-ACS712

En cherchant encore j’ai trouvé une bibliothèque qui fonctionne a merveille.
https://github.com/rkoptev/ACS712-arduino

Cette bibliothèque comporte une option de lecture pour le courant alternatif et la lecture, dans ce cas se fait sur une période.
mais mon soucis c’est que je n’ai besoins de lire que des courants très faibles, donc je n’utilise qu’une faible partie des 1023 points et j’ai du bruit que je n’arrive pas a éliminer. du coups pour un courant de zéro Ampère j’ai 0.03 millis ampères de bruit. soit environ 7/8 watts sous 230V.

en cherchant j’ai trouvé sur le site du zero que l’on pouvait augmenter la précision en utilisant les 1023 points sur 1.1V au lieu des 5V.

Voila mon cheminement… celui d’un débutant.

le petit bout de code que j’ai posté au dessus est en fait pour juste afficher/tester de combien de “pas” sur les 1023 l’entré analogique de l’arduino mesure.
et je fait - 512 pour “etaloner/centrer”
Mais ça marche tant que je ne dit pas dans le setup:

analogReference (INTERNAL);

Par contre j’ai compris que juste le fait de donner cette commande change la tension de reference de 5V a 1.1V, je n’ai donc rien modifié dans le câblage
c’est dur de débuter!!!

En fait la bibliothèque dont voici une copie du .ccp fonctionne a merveille mais si j’ajoute dans le setup la

ligne analogReference (INTERNAL)

et si je change

#define VREF 5.0 par:
#define VREF 1.1

ça ne fonctionne plus

#include "ACS712.h"

ACS712::ACS712(ACS712_type type, uint8_t _pin) {
 pin = _pin;

 // Different models of the sensor have their sensitivity:
 switch (type) {
 case ACS712_05B:
 sensitivity = 0.185;
 break;
 case ACS712_20A:
 sensitivity = 0.100;
 break;
 case ACS712_30A:
 sensitivity = 0.066;
 break;
 }
}

int ACS712::calibrate() {
 uint16_t acc = 0;
 for (int i = 0; i < 10; i++) {
 acc += analogRead(pin);
 }
 zero = acc / 10;
 return zero;
}

void ACS712::setZeroPoint(int _zero) {
 zero = _zero;
}

void ACS712::setSensitivity(float sens) {
 sensitivity = sens;
}

float ACS712::getCurrentDC() {
 int16_t acc = 0;
 for (int i = 0; i < 10; i++) {
 acc += analogRead(pin) - zero;
 }
 float I = (float)acc / 10.0 / ADC_SCALE * VREF / sensitivity;
 return I;
}

float ACS712::getCurrentAC(uint16_t frequency) {
 uint32_t period = 1000000 / frequency;
 uint32_t t_start = micros();

 uint32_t Isum = 0, measurements_count = 0;
 int32_t Inow;

 while (micros() - t_start < period) {
 Inow = analogRead(pin) - zero;
 Isum += Inow*Inow;
 measurements_count++;
 }

 float Irms = sqrt(Isum / measurements_count) / ADC_SCALE * VREF / sensitivity;
 return Irms;
}

mais mon soucis c'est que je n'ai besoins de lire que des courants très faibles, donc je n'utilise qu'une faible partie des 1023 points et j'ai du bruit que je n'arrive pas a éliminer. du coups pour un courant de zéro Ampère j'ai 0.03 millis ampères de bruit. soit environ 7/8 watts sous 230V.

en cherchant j'ai trouvé sur le site du zero que l'on pouvait augmenter la précision en utilisant les 1023 points sur 1.1V au lieu des 5V.

L'ACS712 est connu pour être bruyant et pas adapté à la mesure des faibles courants.

Ensuite Énorme problème : on ne connait rien de ton matériel. Qu'elle carte ? si c'est une Uno le bruit c'est normal l'implantation est pourrie ratée du point de vue mesure analogique. Mais il est possible d'améliorer.

Que veut-tu mesurer : un courant continu ou un courant alternatif. C'est important car l'ACS712 donne en sortie une image du courant en entrée donc s'il est alternatif en entrée il le sera aussi en sortie . Il faudra faire un décalage de tension et rechercher les extremum.

Lis bien le message épinglé "Règles du forum francophone" qui en plus des règles de fonctionnement donne des conseils pour exposer son problème.

Je ne suis pas un grand programmeur et j'aime les choses simples c'est à dire l'inverse des bouts de programme que l'on trouve sur internet et qui se veulent universels donc bien compliqués. La conversion en volts je l'a fait ainsi

float Vref;
int lecture ;
float mesure ;

Vref = 1.1V ;
lecture = analogRead(Ax) ;
mesure = lecture* (Vref/1024.0);

On peut faire plus synthétique en économisant la variable intermédiaire lecture mais tant qu'il reste de la mémoire pour les variables je vais au plus lisible. Point de #define VREF 5.0, ce n'est pas trop vrai avec des nombres réels mais le compilateur a des capacité d'optimisation autant le laisser travailler.

Attention il y a des précautions à prendre avec le convertisseur AD des microcontrôleurs : On entre pas directement dans le cœur du CAD mais sur des entrées d'un multiplexeur analogique, c'est la sortie de ce multiplexeur qui entre dans le CAD

Tout changement dans le multiplexeur ou le CAD (changement d'entrée, changement de tension de référence) peut induire une première mesure fausse. Donc par précaution dès que l'on modifie quoi que soit dans la chaine Mux-CAD on jette la première mesure qui suis ce changement et on ne garde que la suivante.

Alain-alph: mais dans le moniteur série j'ai -512 qui s'affiche en permanence.

À mon avis c’est tout simple: vous voyez -512 parce que vous envoyez tout le temps plus de 1.1V sur A0... donc la lecture donne 1023 et (511-1023) donne -512


68tjs: float Vref; int lecture ; float mesure ; Vref = 1.1V ; lecture = analogRead(Ax) ; mesure = lecture* (Vref/1024.0);

On peut faire plus synthétique en économisant la variable intermédiaire lecture mais tant qu'il reste de la mémoire pour les variables je vais au plus lisible. Point de #define VREF 5.0, ce n'est pas trop vrai avec des nombres réels mais le compilateur a des capacité d'optimisation autant le laisser travailler.

Petite remarque en passant (au cas où Alain ne soit pas assez avancé pour comprendre que c’est du pseudo code):

  • le compilo ne sait pas ce que sont des unités, on n’écrit pas Vref = 1.1[color=red]V[/color] ; mais Vref = 1.1;

  • si vous voulez aider le compilateur en général il vaut mieux déclarer un #define Vref 1.1 ou un const float Vref = 1.1;, mais dans ce cas simple il verra sans doute que l’expression Vref/1024.0 est constante et il va pré-calculer.

  • la variable intermédiaire lecture sera aussi sans doute dégagée par l’optimismeur, pour le vérifier il suffit de recompiler avec

 float mesure = analogRead(A0) * (1.1/1024.0);

(et faire quelque chose avec mesure comme l’imprimer sinon le calcul va être viré :) ) et comparer avec le même programme avec variables intermédiaires globales. (Suis sur ma tablette, peux pas tester)

Comme tu mesures de l'alternatif, je suppose que tu as dû polariser ton entrée à Vcc/2. Ce qui fonctionne lorsque tu utilises la référence externe puisqu'elle est elle même dépendante de Vcc. Mais si tu utilises la référence interne, il faut polariser ton entrée à Vref/2 soit autour de 0.55V.

Edit: Je viens de lire la datasheet de l'ACS712. Il délivre une tension, image du courant, centrée sur Vcc/2 donc l'entrée est tout le temps (ou presque) supérieure à 1,1V. Du coup, pour résoudre ton problème il faudrait réduire cet offset de tension sans modifier le gain de l'ensemble. Donc un simple diviseur de tension n'est pas adapté car il va réduire la dynamique du signal et tu vas te retrouver dans le même cas qu'avec une référence interne.

bonjour
merci a tous.
je vais reprendre tout a zero, et comme je débute…
ce que je retiens:

-L’ACS712 est connu pour être bruyant et pas adapté à la mesure des faibles courants

-Qu’elle carte ? si c’est une Uno le bruit c’est normal l’implantation est pourrie ratée du point de vue mesure analogique.
Mais il est possible d’améliorer

oui j’ai vu pas mal de vos posts sur ce sujet “le filtrage” mais ça ne m’apporte pas un grand changement

Que veut-tu mesurer : un courant continu ou un courant alternatif. C’est important car l’ACS712 donne en sortie une image du courant en entrée donc s’il est alternatif en entrée il le sera aussi en sortie . Il faudra faire un décalage de tension et rechercher les extremum

c’est bien de l’alternatif et a mon avis c’est par la que ça pèche (sur mon décalage de tension) Je remarque que cela m’est signalé une deuxième fois

Comme tu mesures de l’alternatif, je suppose que tu as dû polariser ton entrée à Vcc/2.
Ce qui fonctionne lorsque tu utilises la référence externe puisqu’elle est elle même dépendante de Vcc.
Mais si tu utilises la référence interne, il faut polariser ton entrée à Vref/2 soit autour de 0.55V.

Oui, je pense aussi maintenant que c’est par la que je fait ma betise.

À mon avis c’est tout simple: vous voyez -512 parce que vous envoyez tout le temps plus de 1.1V sur A0… donc la lecture donne 1023 et (511-1023) donne -512

Non, helas c’est a vide
donc je prends en comptes vos remarque et je regarde puis je reviens vers vous, mais si vous avez encore des conseils je suis preneur
merci
Alain

bonjour

Du coup, pour résoudre ton problème il faudrait réduire cet offset de tension sans modifier le gain de l'ensemble. Donc un simple diviseur de tension n'est pas adapté car il va réduire la dynamique du signal et tu vas te retrouver dans le même cas qu'avec une référence interne.

OK. j'ai compris c’était évident mais cela m'a échappé donc merci je vais chercher une autre solution pour lire des puissances alternatives de zero a environ500 watts je vais regarder du coté du PZEM-004T merci a tous

Alain-alph: Non, helas c'est a vide

--> Pas vraiment à vide si vous avez connecté votre module sur la pin A0.