Wattmetro digitale AC fai-da-te

wattmetro fai da te

Il wattmetro digitale fai da te è un progetto completo dedicato a tutti quelli che desiderano conoscere il consumo dei propri elettrodomestici. Per esempio, vi siete mai chiesti quanto costa lasciare il televisore in modalità stand-by per tutta la notte? oppure volete sapere quanto le diverse configurazioni del frigorifero influiscono sulla bolletta elettrica? Se la risposta è sì, allora sarete felici di usare un wattmetro per misurare il consumo energetico dei vostri dispositivi. In questo progetto andremo a vedere come si realizza un wattmetro digitale AC.

Caratteristiche del wattmetro digitale fai da te

Quello che andremo a costruire è un wattmetro, che può misurare il reale consumo di energia di un dispositivo connesso ad una linea elettrica da 230vrms/50Hz. Il microcontrollore PIC raccoglie la tensione e le informazioni sulla corrente grazie all'aiuto delle ADC e poi calcola la tensione RMS della rete elettrica, la corrente RMS utilizzata dal dispositivo e il risultante consumo medio di energia. Tutte queste informazioni vengono poi visualizzate sullo schermo Lcd.
Il wattmetro non necessita di una fonte di energia esterna, perché la riceve dalla rete. Nonostante ciò, la parte del microcontrollore è completamente isolata dai componenti che si interfacciano con la rete elettrica.

Progetto del circuito

Gli schemi del progetto sono stati realizzati con SoloCapture, l'editor di SoloPCB per gli schemi.

Schema

Per calcolare l'energia, abbiamo bisogno di conoscere la tensione che passa attraverso il carico e quanta corrente viene utilizzata dal carico. La tensione da misurare è direttamente la tensione della rete.

Sappiamo che essa è di 230Vrms/50Hz, ma ha una tolleranza del 10%. Sappiamo che la tensione della rete può variare tra 207Vrms e 253Vrms, quindi per ottenere un valore accurato è opportuno misurare la tensione della rete, senza inserire i 230Vrms nel calcolo.
La linea principale è collegata al connettore AC IN (j1). Per la misurazione della tensione viene collegata una rete di partitori di tensione (R1, R2, R3) tra la fase e le linee neutrali. Con l'aiuto del partitore, la tensione di rete viene ridotta al fattore di R1/(R1+R2+R3) = 1/201, che converte +o- 320V (picco) in +o-1.59V.
Viene poi eseguito il passaggio a 2.5V, che alla fine porta i +o- 320V a 0.91V - 4.09V, perfettamente nel range di 0V-5V .

Input wattmetro
Dopo i processi di riduzione e di modifica, la tensione attraverso R2 viene letta dall'ADC MCP3202. Poi l’informazione viene elaborata dal microcontrollore in formato 12 bit attraverso una interfaccia SPI. Per isolare la parte del microcontrollore dalla sezione che si interfaccia con la rete elettrica, sono stati usati optoaccoppiatori HCPL-0630 ad alta velocità. Il secondo canale di input analogico del microcontrollore viene utilizzato per leggere la tensione di riferimento da 2.5V e funge da fattore di correzione per i calcoli.

Mentre le linee neutrale e di terra provenienti dal connettore AC IN sono direttamente collegate al connettore AC OUT (j2), la linea di fase passa attraverso il sensore di corrente ACS712-20A (U4) per la misurazione della corrente.

Il sensore rilascia 2.5V a 0A. Quando la corrente scorre tra i terminali IP+ e IP-, l’output del sensore cambia ad un passo di 100m V/A. Quindi la tensione di output diventa 4.5V a +20A e 0,500V a -20A. L’output del sensore viene letto da un altro integrato Microchip, MCP3202, e inviato al microcontrollore sempre attraverso SPI: ACS712 offre isolamento interno, così da non richiedere interventi all’esterno.
Il sensore di corrente ACS712 è in grado di leggere +- 20° ma, considerando le limitazioni di corrente dei blocchi del terminale, il percorso della corrente AC è protetto da un fusibile 16A collegato in serie alla linea di fase.
Ci sono due isolate fonti da 5V per alimentare la rete ed il microcontrollore. Il trasformatore genera 2x6Vrms da 230Vrs. Ogni output viene rettificato dal raddrizzatore a ponti di diodi e poi regolato dai regolatori lineari 78L05. D2a D3 sono i Led che indicano lo stato di ogni alimentatore da 5V.
Il microcontrollore del wattmetro è il PIC18F252; in pratica legge la tensione e la corrente e calcola la tensione RMS, la corrente RMS e l’energia media. Poi si interfaccia con lo schermo LCD e mostra tutti questi valori. È dotato di un modulo SPI che permette di comunicare con gli ADC MCP3202. Il master clock del microcontrollore è a 5Mhz quando viene utilizzato un oscillatore al cristallo da 20Mhz. È presente un connettore ICSP (j3) che viene utilizzato per programmare il PIC.

Wattmetro analogico fai da te: il progetto della PCB

PCB Wattmetro

Realizzare il wattmetro come un dispositivo palmare è stata una buona idea e il contorno della PCB è stato disegnato di conseguenza. Autocad è stato impiegato per creare il contorno e il file .dxf è stato importato in SoloPCB.
Tutti i footprint che non sono inclusi nelle librerie SoloPCB sono stati creati manualmente e possono essere trovati nei file di progetto di SoloPCB.
Le linee (fase, neutro e messa a terra) che collegano il connettore AC IN al connettore AC OUT sono state disegnate più spesse possibile, mentre i condensatori di bypass sono posizionati più vicino possibile agli IC. Per AGND e DGND sono stati progettati due piani di terra separati per tenere bassa la resistenza di terra.
Tutti i componenti sono stati posizionati sul layer superiore; per rivestire sia il layer superiore che quello inferiore è stato utilizzato una copertura di acrilico.

Copertura Wattmetro

Software per il wattmetro fai-da-te

Il microcontrollore legge i campioni di tensione e di corrente ogni millisecondo e raccoglie 40 coppie di campioni; poi calcola i valori RMS e la potenza media. Il periodo di 1 ms viene generato utilizzando il modulo Timer A, che funziona in modalità 16 bit e produce un interrupt ad ogni overflow.

 

Quindi assegniamo un valore di partenza in ogni ciclo e attendiamo l’innesco del primo millisecondo.
Dopo aver raccolto tutti i campioni, inizia il processo di calcolo; la tensione RMS e la corrente RMS vengono calcolate utilizzando l’equazione qui sotto

ac-wattmeter-rms-calculation

I campioni di tensione e di corrente includono la relazione di fase tra la tensione e la corrente, quindi la reale potenza AC, che è data da V*I* cosθ, può essere ottenuta calcolando la potenza media tramite l’equazione riportata di seguito.

ac-wattmeter-average-power-calculation

I valori RMS risultanti vengono visualizzati sul display Lcd, utilizzando la libreria lcd.h del compilatore C della CCS.

L’intero codice C viene fornito alla fine di questo articolo con il resto della documentazione in allegato.

Assemblaggio e test del wattmetro fai da te

Di seguito viene elencata la lista delle parti necessarie al progetto

Quantity Part Description Designator
2 78L05 5V 0.1A Regolatore lineare SOT-89 U1 U2
1 REF03 2.5V Riferimento di tensione SO-8 U3
1 ACS712-20A Sensore di corrente ad effettoHall SO-8 U4
2 MCP3202-BI/SN Dual Channel 12 Bit Convertitore AD SO-8 U5 U10
3 HCPL-0630 High Speed Optoisolatore SO-8 U6 U7 U8
1 PIC18F252-I/SO 8 Bit Microcontrollore SO-28 U9
2 DF08S 800V 1A Mini Ponte a diodi BR1 BR2
1 HR-E3013051 230V to 2x6V 1.5VA Transformatore TR1
1 TC1602D 2×16 Dot Matrix LCD LCD1
2 470uF 25V Electrolytic Capacitor 10x10mm C1 C18
2 100uF 16V Electrolytic Capacitor 6.3×5.4mm C2 C17
2 22pf 50V 0805 NPO SMD Ceramic Capacitor C11 C12
1 1nF 50V 0805 X7R SMD Ceramic Capacitor C9
14 100nF 50V 0805 X7R SMD Ceramic Capacitor C2 C4 C5 C6 C7 C8 C10 C13 C22 C14 C15 C16 C17 C20
1 1uF 25V 1206 X7R SMD Ceramic Capacitor C21
2 0R 1% 0805 Resistore R16
2 1M 1% 0805 Resistore R2 R3
3 1K 1% 0805 Resistore R5 R6 R17
5 10K 1% 0805 Resistore R1 R14 R15 R18 R19
4 2K 5% 0805 Resistore R7 R8 R9 R13
4 330R 5% 0805 Resistore R4 R10 R11 R12
2 Red LED 0805 D2 D3
1 20MHZ Quarzo Y1
1 SS14 1A 40V Diodo Schottky SMA D1
1 Schurter 0031.8221 SMD Fuse Holder F1
1 16A Fuse 20x5mm -
2 1×3 5.2mm Pitch Screw Terminal Block J1 J2
1 1×5 2.54mm Male Header J3

Ecco un esempio di misurazione con un boiler da 2KW collegato al wattmetro.

Wattmetro digitale collegato al boiler

Codice PIC

Il codice PIC è scritto in linguaggio C per il compilatore CCS.

#include <18F252.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=20000000)
#define ADC0_EN   PIN_C2
#define ADC1_EN   PIN_C6

#INCLUDE 

#define LCD_ENABLE_PIN PIN_A0
#define LCD_RS_PIN PIN_A2
#define LCD_RW_PIN PIN_A1
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7

#define SPI_MODE_0  (SPI_L_TO_H | SPI_XMIT_L_TO_H) 

#include 

char read_count=0;
char tick=0;
unsigned int32 adc_accum_v=0;
unsigned int32 adc_accum_i=0;

unsigned int16 adc0_ref=0;
unsigned int16 adc1_ref=0;

float rms_v=0;
float rms_i=0;

float rms_v_cor=1.04245;

float rms_v_accum=0;
float rms_i_accum=0;

float adc0_step=0;

unsigned int32 adc_value_v[41];
unsigned int32 adc_value_i[41];

unsigned int32 sampling_period=60536; // 65536-60536=5000 >> 5000x200ns=1ms 

float apparent_power=0;
float average_power_accum=0;
float vi_accum=0;

char i,k;

#INT_RTCC
void  RTCC_isr(void) 
{

set_rtcc(sampling_period);
tick=1;
read_count++;
return;
}

void initialize() {
   setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_64);
   lcd_init();
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);      //13.1 ms overflow
   
   output_high(ADC0_EN);
   output_high(ADC1_EN);
      
}


unsigned int16 mcp3202_read(char adc_no, char ch_no) {

   unsigned int16 reading = 0;
   unsigned char MSbyte=0x00;
   unsigned char LSbyte=0x00;


   // Chip Select
   if (adc_no==0) {output_low(ADC0_EN);}
   else {output_low(ADC1_EN);}

   // Send Start Bit
   Spi_Write(0x01);


   // Channel Select and Read High Byte
   if (ch_no==0) {MSbyte=Spi_Read(0xA0);}
   else {MSbyte=Spi_Read(0xE0);}


   // Read Low Byte
   LSbyte=Spi_Read(0x00);

   // Join the Bytes
   reading=make16((MSbyte & 0x0F),LSbyte);

   output_high(ADC0_EN);
   output_high(ADC1_EN);

   return reading;
}

void main()
{
   delay_ms(100);
   
   initialize();
   
   adc1_ref = 2048;
   adc0_ref = mcp3202_read(0,1);
   adc0_step = 2.5/adc0_ref;
   
   k=0;
   
   while (1) {
      
      set_rtcc(sampling_period);
      enable_interrupts(INT_RTCC);
      enable_interrupts(GLOBAL);
      
      while (read_count<40) {
      
         while(tick==0) {}
         tick=0;

         adc_value_v[read_count-1] = mcp3202_read(0,0);
         adc_value_i[read_count-1] = mcp3202_read(1,0);

      }
      
      
      disable_interrupts(INT_RTCC);
      disable_interrupts(GLOBAL);
      read_count=0;

     
      for (i=0;i<40;i++) {
         
         if (adc_value_v[i]>=adc0_ref) {adc_value_v[i] = adc_value_v[i] - adc0_ref;}
         else {adc_value_v[i] = adc0_ref - adc_value_v[i];}
         
         if (adc_value_i[i]>=adc1_ref) {adc_value_i[i] -= adc1_ref;}
         else {adc_value_i[i] = adc1_ref - adc_value_i[i];}
   
         
         adc_accum_v +=  (adc_value_v[i] * adc_value_v[i]); 
         adc_accum_i +=  (adc_value_i[i] * adc_value_i[i]);    
         
         vi_accum += ((adc_value_v[i]*adc0_step*201) * rms_v_cor) * (adc_value_i[i] * ((5/4096)/0.100))  ;
       }
      
      
      average_power_accum += vi_accum /40; 
      
      vi_accum=0;
      
      rms_v = ((sqrt(adc_accum_v /40))*adc0_step*201) * rms_v_cor ;
      rms_i = sqrt(adc_accum_i /40) * ((5/4096)/0.100);
      
      rms_v_accum += rms_v;
      rms_i_accum += rms_i;
      
      k++;
      
      if (k == 20) {
         k=0;
         
         printf(lcd_putc,"\f%3.1f V",(rms_v_accum/20));
         lcd_gotoxy(9,1);
         printf(lcd_putc,"%2.2f A",abs(((rms_i_accum/20) - 0.1)));
         
         lcd_gotoxy(5,2);
   
         printf(lcd_putc,"%4.1fW",average_power_accum/20);
         
         rms_v_accum=0;
         rms_i_accum=0;
         
         average_power_accum=0;
     }

      adc_accum_v=0;
      adc_accum_i=0;
      

      
   }

}

Buon DIY a tutti!

Original article witten by, and courtesy of, Electro-Labs

ALLEGATO

wattmetro-fa-da-te

13 Commenti

  1. mikelin 16 marzo 2015
    • Emanuele Bonanni Emanuele 16 marzo 2015
  2. mikelin 16 marzo 2015
    • Emanuele Bonanni Emanuele 16 marzo 2015
  3. adrirobot 17 marzo 2015
    • Emanuele Bonanni Emanuele 21 marzo 2015
  4. Giuseppe.Campione 4 aprile 2015
    • Emanuele Bonanni Emanuele 7 aprile 2015
  5. Fabio Raudino 19 aprile 2015
    • Emanuele Bonanni Emanuele 19 aprile 2015
  6. jacopo.abramo 5 luglio 2015
    • Emanuele Bonanni Emanuele 6 luglio 2015

Scrivi un commento

ESPertino è la nuova scheda per IoT compatibile ARDUINO.
Scopri come averla GRATIS!