Misurare la corrente con un anello amperometrico

Da raspibo.
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Per misurare la corrente con un anello amperometrico si possono usare sia il bus I2c che il bus SPI, si usa lo stesso sensore in entrambi i casi, ma cambia il modello di integrato che andremo ad utilizzare per dialogare con Raspberry Pi, di seguito gli esempi su entrambi i bus:

i2c

Questo esperimento usa la scheda Input Analogico collegata come descritto in "Collegare dispositivi I2C" e questo sensore amperometrico (disponibile anche qui)

Il sensore amperometrico viene fornito con un jack di collegamento. Attaccate i due contatti del Jack a un entrata della scheda di input analogico (il programma presentato di default ipotizza che sia collegato sulla porta 0). Non importa la polarita', infatti questo sensore amperomentrico non e' altro che un trasformatore a una spira di primario con una resistenza di carico, generera' in output una tensione proporzionale alla corrente in transito raggiungendo 1V al passaggio di 30A.

Il sensore amperometrico si apre come una pinza, occorre richiuderlo in modo che abbracci il uno dei due fili che portano la corrente ad un utilizzatore (a 230V alternata).

Cursensor.png

Questo e' il programma Python che calcola l'intensita' di corrente istantanea in transito:

#!/usr/bin/env python3

import sys,fcntl,os,time,struct,math

analog_addr = 0x68
I2C_SLAVE   = 0x0703
SAMPLES = 48

#per la rev.A
#devname = "/dev/i2c-0"
#per la rev.B
devname = "/dev/i2c-1"

if len(sys.argv) < 2:
        line = 0
else:
        line = int(sys.argv[1])

dev=os.open("/dev/i2c-0", os.O_RDWR)

fcntl.ioctl(dev, I2C_SLAVE, analog_addr)

cmd=bytearray([0x80 | 0x10 | (line<<5)])
os.write(dev, cmd)
sqsum=0
for j in range(SAMPLES):
        time.sleep(0.004167)
        ret=os.read(dev, 2)
        value=struct.unpack('>h',ret)[0]
        sqsum += (value * value)

current = math.sqrt(sqsum/SAMPLES)*30/1000
print("{:7.4f}A {:6.3f}W".format(current,current * 230))

Come si vede viene rilevato un certo numero di campioni e poi ne viene calcolato lo scarto quadratico medio dalla tensione nulla. Il fattore di conversione 30/1000 si deve al fatto che la misura e' in millivolt e 1 volt corrisponde a 30 Ampere. 48 campioni consentono di misurare 10 cicli interi di alternata (240 campioni al secondo, 48 campioni sono 1/5 di secondo). Se si vuole maggiore precisione occorre aumentare il numero di campioni (ma la rilevazione richiedera' piu' tempo). Per esempio con 240 secondi impiega 1 secondo.

SPI

In questa implementazione si fa uso dell'integrato MCP3008 collegato al Raspberry PI come indicato nella pagina: Input Analogico SPI: gli integrati MCP300x Il sensore amperometrico e' lo stesso descritto sopra. I terminali del sensore vengono inseriti tra la massa e il canale 0 dell'integrato mcp3008 (con una resistenza da 1000 ohm per limitare la corrente).

                                            1Kohm
massa <----> sensore amperometrico <-----/\/\/\/\/\-----> pin 1 MCP3008 (o altro ingresso analogico)

Il programma python per leggere il sensore e' il seguente:

#!/usr/bin/env python

import spidev
import time
import math

mcp3008 = spidev.SpiDev(0,0)

# cambiare adcnum se si vuole usare un ingresso diverso
adcnum=0
xferarg=[1,(1+adcnum)<<4,0]
start = time.time()
end = time.time()
sum = 0
count = 0
vref = 3.3
while end - start < 0.2:
        ret=mcp3008.xfer2([1,(8+adcnum)<<4,0])
        adcout = (((ret[1]&3) << 8) + ret[2]) * 3.3 / 1024
        #print ((ret[1]&3) << 8) + ret[2], adcout
        sum += 2 * adcout * adcout
        count += 1
        end = time.time()

average = math.sqrt (sum/count)
print "{:6.3}A = {:7.3}W".format(average*30, average*30*230)   

mcp3008.close()

In realta' questo programma legge solo le semionde positive (per le semionda negativa il valore letto e' zero). Si continua a leggere il compionamento fino al raggiungimento di 10 onde intere (0.2 secondi). Il convertitore e' veloce, vengono letti circa 700 campioni. Viene fatta la media dei quadrati e i valori letti vengono sommati due volte per compensare i campioni mancanti per le semionde negative.

SPI con MCP3204 e onda intera

Sempre nella pagina: Input Analogico SPI: gli integrati MCP300x e' stato indicato come connettere un MCP3204.

Per misurare l'intera onda, un estremo dell'anello amperometrico SCT-013-000 e' stato collegato a un partitore resistivo che trasla la tensione alternata nulla a 1.65V (la meta' di 3.3v)

           10Kohm                10Khm 
+3.3v ---/\/\/\/\/------+------/\/\/\/\/----- GND
                        |
                        |      + 10uF elettr.
                        +-------|[]---------- GND
                        |
                   anello amperometrico
                        |
                        v
                   a una delle entrate analogiche dell'MCP3204

il condensatore elettrolittico raffredda la tensione centrale (creando inerzia). A questo punto misurando 30A la tensione oscillera' tra .65V e 2.65V.

Il programma che legge la corrente e' il seguente:

#!/usr/bin/env python

import spidev
import time
import math

mcp3204 = spidev.SpiDev(0,0)
# cambiare adcnum se si vuole usare un ingresso diverso
adcnum=0
xferarg=[0x6,adcnum<<6,0]
start = time.time()
end = time.time()
ssum = 0
sum = 0
count = 0
vref = 3.3
while end - start < 0.1:
        ret=mcp3204.xfer2([0x6,adcnum<<6,0])
        adcout = (((ret[1]&0xf) << 8) + ret[2]) * 3.3 / 4096
        ssum += adcout * adcout
        sum += adcout
        count += 1
        end = time.time()

average = math.sqrt(ssum * count - sum * sum) / count
print "{:6.3f}A = {:10.3f}W {}".format(average*30, average*30*230,count)
mcp3204.close()