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
https://forum.arduino.cc/index.php?topic=437641.0
-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.
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;
}