Ce référentiel contient la bibliothèque Truerms C ++ pour Arduino. Avec cette bibliothèque, il est possible de calculer la valeur moyenne et le RMS (Root Mean Square) ou la valeur effective du signal d'entrée ADC. Cette bibliothèque calcule également la puissance réelle , apparente et le facteur de puissance des signaux d'entrée de tension et de courant. À partir de la version 1.3, la mesure d'énergie a été ajoutée au projet.
La tension et la représentation de tension d'un courant peuvent être mesurées avec l'ADC de l'Arduino en utilisant des circuits d'entrée appropriés pour mettre à l'échelle les quantités mesurées jusqu'à la plage de tension compatible 0-5V de l'ADC. La solution fournie utilise une méthode simple pour l'échelle des quantités mesurées. L'utilisateur ne doit définir que la valeur de pic à pic à pleine échelle de la tension d'entrée et du courant AC. Lorsque les unités des quantités mesurées sont définies en volts et en ampères, la puissance calculée est en WATT et l'énergie en WS (Joules). Cette bibliothèque est facile portable sur d'autres plates-formes.
Les classes de bibliothèque suivantes sont implémentées:
AverageRmsRms2PowerPower2La moyenne calcule la valeur moyenne à partir d'un certain nombre d'échantillons d'entrée (généralement) de l'ADC. RMS ou RMS2 est destiné à calculer la valeur carré de la racine d'un signal et de puissance ou Power2 est destiné à calculer la puissance à la fois à la tension et à l'entrée de courant.
RMS2 et Power2 fonctionnent mieux lorsqu'ils sont utilisés dans une routine de service d'interruption en répartissant la charge de traitement sur les plages horaires de l'échantillon. Le nombre d'échantillons pour une exécution d'acquisition RMS (scan) est défini comme une fenêtre . RMS2 et Power2 occupent un employé d'échantillon supplémentaire (longueur de fenêtre +1) lorsque l'option de restauration de base automatique est activée (BLR_ON).
Les méthodes suivantes existent:
begin()start()stop()update()update1()update2()publish() Pour un démarrage rapide, vérifiez l'exemple de croquis Arduino fourni avec la bibliothèque.
Ce sont les étapes à suivre pour une implémentation réussie:
begin() . Cette méthode est pour l'initialisation et il a besoin d'entrée pour définir la mise à l'échelle des unités de mesure, la taille de la fenêtre d'échantillonnage, le nombre de bits de l'ADC (ou signal d'entrée) utilisé et le mode d'acquisition (scan continu / scan unique).start() pour démarrer l'acquisition.update() (ou update1() + update2() pour Power2 ) à plusieurs reprises à un rythme constant.publish() pour obtenir les résultats. Pour la classe Power2 Update () est décomposé en update1() et update2() . update1() doit être appelé d'abord pour traiter l'échantillon de la tension d'entrée et update2() pour traiter l'échantillon à partir du courant d'entrée ou de Vica Versa (courant de tension). La tension d'échantillonnage et le courant se produisent généralement en séquence pour un ADC multiplexé.
Pour l'utilisation moyenne de la classe:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
Avec:
range est la balançoire complète maximale attendue du signal d'entrée CA (valeur de crête à crête).window la longueur de la fenêtre de l'échantillon, exprimée dans un nombre entier d'échantillons.nob est la résolution de bit du signal d'entrée (profondeur de bits ADC). Utilisez les constantes prédéfinies: ADC_8BIT , ADC_10BIT ou ADC_12BIT .mode définit le mode sur une numérisation continue ou une seule analyse. Utilisez les constantes prédifiées CNT_SCAN ou SGL_SCAN . void start(void); Cette méthode démarre l'acquisition pour la numérisation continue et le mode de balayage unique.
void stop(void); Cette méthode arrête l'acquisition.
void update(int instVal); Attribuez la valeur de l'échantillon en cours.
void publish(void); Publiez le (s) résultat de la dernière exécution d'acquisition terminée. Les résultats sont dans la ou les variables de sortie telles que définies ensuite.
Les variables définies par le public sont:
int instVal - la valeur du dernier échantillon acquis
float average - le résultat de la valeur moyenne
bool acquire - Bit d'état, vrai lorsque Scan est en attente.
Pour la classe RMS ou RMS2, utilisez:
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
Avec:
range est la balançoire complète maximale attendue du signal AC (valeur de crête à crête).window la longueur de la fenêtre d'échantillon exprimée dans un nombre entier d'échantillons.nob est la résolution bit du signal d'entrée, il s'agit généralement de la profondeur du bit ADC. Utilisez les constantes prédéfinies: ADC_8BIT , ADC_10BIT ou ADC_12BIT .blr définit ou désactivez la fonction de restauration de base automatique. Utilisez les constantes prédifiées BLR_ON ou BLR_OFF .mode définit le mode sur une numérisation continue ou une seule analyse. Utilisez les constantes prédifiées CNT_SCAN ou SGL_SCAN . void start(void); Cette méthode démarre l'acquisition pour la numérisation continue et le mode de balayage unique.
void stop(void); Cette méthode arrête l'acquisition.
void update(int instVal); Attribuez la valeur de l'échantillon en cours.
void publish(void); Publiez le (s) résultat de la dernière exécution d'acquisition terminée. Les résultats sont dans la ou les variables de sortie telles que définies ensuite.
Les variables définies par le public sont:
int instVal - la valeur du dernier échantillon acquis, restauré à la ligne de base lorsque BLR_ON
float rmsVal - le résultat de la valeur RMS
int dcBias - la valeur dcbias dans les unités ADC. Uniquement pertinent lorsque BLR_ON
bool acquire - bit d'état, vrai si scan est en attente
Pour la consommation de puissance :
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Avec:
range1, range2 est la balançoire complète maximale attendue des signaux AC (valeur de crête à crête) de la tension et du courant.window la longueur de la fenêtre d'échantillon exprimée dans un nombre entier d'échantillons.nob est la résolution bit du signal d'entrée, il s'agit généralement de la profondeur du bit ADC. Utilisez les constantes prédifiées: ADC_8BIT , ADC_10BIT ou ADC_12BIT .blr définit ou désactivez la fonction de restauration de base automatique. Utilisez les constantes prédifiées BLR_ON ou BLR_OFF .mode définit le mode sur une numérisation continue ou une seule analyse. Utilisez les constantes prédifiées CNT_SCAN ou SGL_SCAN . void start(void); Cette méthode démarre l'acquisition pour la numérisation continue et le mode de balayage unique.
void stop(void); Cette méthode arrête l'acquisition.
void update(int instVal1, int instVal2); Attribuez à la fois les valeurs d'échantillon de courant (par exemple la tension et le courant).
void publish(void); Publiez le (s) résultat de la dernière exécution d'acquisition terminée. Les résultats sont dans la ou les variables de sortie telles que définies ensuite.
Les variables définies par le public sont:
int instVal1 - la valeur du dernier échantillon acquis (tension), restauré à la ligne de base lorsque BLR_ON
int instVal2 - la valeur du dernier échantillon acquis (courant), restauré à la ligne de base lorsque BLR_ON
float rmsVal1 - RMS Value1 (tension)
float rmsVal2 - RMS Value2 (courant)
int dcBias1 - la valeur dcbias1 dans les unités ADC. Uniquement pertinent lorsque BLR_ON
int dcBias2 - la valeur dcbias2 dans les unités ADC. Uniquement pertinent lorsque BLR_ON
float apparentPwr - la puissance apparente
float realPwr - réel puissance
float pf - Facteur de puissance
float energy - Netto Energy
bool acquire - bit d'état, vrai si scan est en attente
Pour la classe Power2 Utilisation:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Avec:
range1, range2 est la balançoire complète maximale attendue des signaux AC (valeur de crête à crête) de la tension et du courant.window la longueur de la fenêtre d'échantillon exprimée dans un nombre entier d'échantillons.nob est la résolution bit du signal d'entrée, il s'agit généralement de la profondeur du bit ADC. Utilisez les constantes prédifiées: ADC_8BIT , ADC_10BIT ou ADC_12BIT .blr définit ou désactivez la fonction de restauration de base automatique. Utilisez les constantes prédifiées BLR_ON ou BLR_OFF .mode définit le mode sur une numérisation continue ou une seule analyse. Utilisez les constantes prédifiées CNT_SCAN ou SGL_SCAN . void start(void); Cette méthode démarre l'acquisition pour la numérisation continue et le mode de balayage unique.
void stop(void); Cette méthode arrête l'acquisition.
void update1(int instVal); Attribuez l'exemple de la valeur de l'échantillon actuel pour la tension.
void update2(int instVal); Attribuez l'exemple de la valeur de l'échantillon actuel pour le courant. Appelez update1() et update2() Alternativement dans la boucle d'échantillonnage.
void publish(void); Publiez le (s) résultat de la dernière exécution d'acquisition terminée. Les résultats sont disponibles à partir de la ou des variables de sortie telles que définies ensuite.
Les variables définies par le public sont:
int instVal1 - la valeur du dernier échantillon acquis (tension), restauré à la ligne de base lorsque BLR_ON
int instVal2 - la valeur du dernier échantillon acquis (courant), restauré à la ligne de base lorsque BLR_ON
float rmsVal1 - RMS Value1 (tension)
float rmsVal2 - RMS Value2 (courant)
int dcBias1 - la valeur dcbias1 dans les unités ADC. Uniquement pertinent lorsque BLR_ON
int dcBias2 - la valeur dcbias2 dans les unités ADC. Uniquement pertinent lorsque BLR_ON
float apparentPwr , la puissance apparente
float realPwr - réel puissance
float pf - Facteur de puissance
float energy - Netto Energy
bool acquire - bit d'état, vrai si scan est en attente
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
Les arguments signifient:
La plage ADC complète (0 à 5volts) représente une valeur de pic à crête de signal de 700 V. Cela équivaut à une amplitude de signal de 350 V ou 247,5 VRM pour une onde sinusoïdale.
La fenêtre RMS est de 40 échantillons, ce qui signifie que la fenêtre couvre deux cycles de 50 Hz, lorsque le taux d'échantillonnage a été choisi à 1000 échantillons / sec.
La résolution Bit ADC est 10 bits (Arduino Uno).
BLR_ON signifie que la restauration de base est allumée. Pour capturer un signal AC avec l'ADC, la valeur zéro du signal doit être déplacée vers le point médian de la chaîne ADC en ajoutant une tension de décalage CC avec le circuit d'entrée ADC. Ce décalage doit être corrigé par la suite dans le logiciel en soustrayant une valeur constante de la valeur ADC acquise. Cette correction peut être effectuée automatiquement avec BLR_ON et l'étalonnage n'est pas nécessaire. Dans la figure 1, la ligne bleue indique le signal d'entrée à échelle maximale avec une balançoire de tension de 5 V et biaisé sur 2,5 V. La ligne verte montre un signal d'entrée avec une amplitude de 1 V et mesure 1v / sqrt (2) = 0,71 VRMS.

Avec l'option CNT_SCAN, l'acquisition est définie en mode continu. L'acquisition redémarrera automatiquement après avoir terminé le dernier scan.
Appel gridVolt.update(adcVal); à partir de la boucle principale ou à partir d'une routine de service d'interruption (ISR). Assurez-vous que la boucle se répète à un rythme constant.
Obtenez les résultats avec gridVolt.publish() et obtenir la valeur RMS: float Voltage = gridVolt.rmsVal;
void loop() { // loop must run at 1kHz
...
adcValue = analogRead(AN0); // read the ADC.
gridVolt.update(adcValue);
counter++;
if(counter >= 500) { // publish every 0.5s
gridVolt.publish();
Voltage = gridVolt.rmsVal;
counter = 0;
}
...
while(loop_timer_not_expired) {1}
...
}
Measure_avg.ino - Cet exemple montre comment calculer la valeur moyenne d'un signal mesuré avec l'ADC.
Measure_rms.ino - Dans cet exemple, la valeur RMS de la tension d'entrée ADC est déterminée.
AC_powermeter.ino - Cet exemple montre une application de mesure AC complète. Il a besoin à la fois de tension et d'une représentation de tension du courant en entrée sur deux canaux ADC. Il calcule les valeurs RMS de la tension et du courant, la puissance apparente, la puissance réelle et le facteur de puissance.
AC_powermeter_advanced.ino - Cet exemple montre également une application de mesure AC complète. Il fonctionne sur une base d'interruption pour obtenir de meilleures lectures stables. La tension et le courant sont tous deux échantillonnés à 3 kHz. Lorsque la LED Arduino est allumée, les clips ADC (tension de crête d'entrée trop élevée) ou le CC le biaisaient hors de portée.
Energy_metering.ino montre la tension, le courant, la puissance réelle et l'énergie nette dans Wh.
La façon la plus simple d'interface AC élevées AC avec l'ADC Arduino est d'utiliser un transducteur de tension, par exemple le transducteur de tension LV 25-P de Lem USA Inc. Ce transducteur fournit une isolation galvanique, une mise à l'échelle et un changement de niveau dans un seul emballage. Pour la détection du courant, LEM fabrique également le LEM_LA55-P , avec les mêmes avantages que pour le transducteur de tension.
Si l'on préfère construire des circuits de mise à l'échelle d'entrée à partir de composants discrets, une description de conception détaillée est donnée dans la note d'application TiDUAY6C.PDF qui appartient à la conception de référence de l'onduleur de la source de tension de Texas Instruments Incorporated. Notez les avertissements! Les circuits proposés peuvent facilement être adaptés à la gamme 0-5V pour l'Arduino.
En tout temps, utilisez un transformateur d'isolement pour la sécurité!
Mesure de puissance en trois phases.
Beaucoup de temps a été sauvé dans le développement de cette bibliothèque en utilisant l'alternative Arduino-ide Sloeber. Sloeber est un merveilleux plugin Arduino pour Eclipse. Merci à Jantje et à ses contributeurs!