以下の写真の回路を組んでch0に接続したものの電圧をラズパイによって以下のプログラム(ADC.py)を使ってサンプリング周波数1000hz データ数15000 計測時間15秒 で電圧を測定したところ計測時間15秒のはずが約22秒になってしまいます。このプログラムからサンプリング10000hz 計測時間10秒にすると35秒に差が広がります。データ数は指定した通りの数だけ取れていたのでサンプリング周波数が指定したものよりも小さくなっているようです。指定したサンプリング周波数通りに計測したいのですがどのようにすればよいでしょうか?
ADC.py
import wiringpi as pi
import time
import mcp_adc
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
import openpyxl as excel
SPI_CE = 0
SPI_SPEED = 1000000
READ_CH = 0
VREF = 5.0
V = []
Vi = []
i = 0
adc = mcp_adc.mcp3208( SPI_CE, SPI_SPEED, VREF )
x = np.arange(0,15, 0.001)
y = x/10
lines, = plt.plot(x, y)
while True:
value = adc.get_value( READ_CH )
volt = adc.get_volt( value )
print ("Value:", value, "Volt:", volt )
V.append(volt)
Vi.append(volt)
i = i+1
time.sleep( 0.001 )
if i==15000:
T = (15/i) fs = 1/T i =0 wb=excel.Workbook() ws=wb.active n=15000 for i in range(1,n): T=Vi[i-1] ws.cell(row=i,column=1,value=T) wb.save("denatsu.xlsx") Vi.clear()
またモジュールmcp_adcは以下の通りです
import wiringpi as pi
import struct
class mcp3002:
def init( self, ss, speed, vref ):
self.ss = ss
self.speed = speed
self.vref = vref
pi.wiringPiSPISetup( self.ss, self.speed )
def get_value( self, ch ):
senddata = 0x6800 | ( 0x1800 * ch )
buffer = struct.pack( '>h', senddata )
pi.wiringPiSPIDataRW( self.ss , buffer )
value = ( buffer[0] * 256 + buffer[1] ) &0x3ff
return value
def get_volt( self, value ):
return value * self.vref / float( 1023 )
class mcp3008:
def init( self, ss, speed, vref ):
self.ss = ss
self.speed = speed
self.vref = vref
pi.wiringPiSPISetup( self.ss, self.speed )
def get_value( self, ch ):
cmd = 0xc0 | ( ch <<3 )
buffer = cmd <<16
buffer = buffer.to_bytes( 3, byteorder='big' )
pi.wiringPiSPIDataRW( self.ss, buffer )
value = ( buffer[0] <<16 | buffer[1] <<8 | buffer[2] ) >>7
return value
def get_volt( self, value ):
return value * self.vref / float( 1023 )
class mcp3204:
def init( self, ss, speed, vref ):
self.ss = ss
self.speed = speed
self.vref = vref
pi.wiringPiSPISetup( self.ss, self.speed )
def get_value( self, ch ):
cmd = 0xc0 | ( ch <<3 )
buffer = cmd <<24
buffer = buffer.to_bytes( 4, byteorder='big' )
pi.wiringPiSPIDataRW( self.ss, buffer )
value = ( buffer[0] <<24 | buffer[1] <<16 | buffer[2] <<8 | buffer[2] ) >>13
return value
def get_volt( self, value ):
return value * self.vref / float( 4095 )
class mcp3208:
def init( self, ss, speed, vref ):
self.ss = ss
self.speed = speed
self.vref = vref
pi.wiringPiSPISetup( self.ss, self.speed )
def get_value( self, ch ):
cmd = 0xc0 | ( ch <<3 )
buffer = cmd <<24
buffer = buffer.to_bytes( 4, byteorder='big' )
pi.wiringPiSPIDataRW( self.ss, buffer )
value = ( buffer[0] <<24 | buffer[1] <<16 | buffer[2] <<8 | buffer[2] ) >>13
return value
def get_volt( self, value ):
return value * self.vref / float( 4095 )
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/08 10:19
2019/11/08 17:47
2019/11/09 18:30
2019/11/09 18:39