Środowisko pomiarowe¶
Podłączanie za pomocą interfejsu VISA LabView i biblioteki PyVISA¶
Praktycznie każdy sprzęt da się kontrolować.¶
Automatyzacja procesu¶
Szybkość¶
Dokładność¶
Eliminacja subiektywnej oceny człowieka¶
Łatwość przechowywania danych, praktycznie w nieograniczonej liczbie.¶
Bieżąca analiza i weryfikacja¶
Przykład pomiarów: charakterystyka izotermiczna tranzystora¶

Przykład pomiaru charakterystyki nieizotermicznej tranzystora¶

Przykład danych pobieranych z oscyloskopu¶
In [9]:
import pandas as pd
import plotly.express as px
df = pd.read_csv('data/keyosc_wykres.csv', sep = ';', decimal = '.', index_col=0)
fig = px.line(df, width=750, height=550)
fig.write_html('_osc.html')
fig.show()
Symulacje układów elektronicznych narzędziem NGSpice¶
wykres interaktywnyBiblioteka posiada wiele popularnych i zdefiniowancyh elementów. Bez problemu możemy sobie również zdefiniować swój własny element, podajęc jego parametry.
In [10]:
import numpy as np
import plotly.express as px
import pandas as pd
from PySpice.Doc.ExampleTools import find_libraries
from PySpice.Spice.Netlist import Circuit
from PySpice.Spice.Library import SpiceLibrary
from PySpice.Unit import *
circuit = Circuit('U(I)')
source = circuit.V('input', 'in_', circuit.gnd, 3)# 10@u_V)
circuit.model( name='1N4007', modele_type='D',
IS=7.02767@u_nA, RS=0.0341512, N=1.80803, EG=1.05743,
XTI=5, BV=1000, IBV=5e-08, CJO=1e-11,
VJ=0.7, M=0.5, FC=0.5, TT=1e-07
)
circuit.Diode(1, 'in_', circuit.gnd, model = '1N4007')
Vin = slice(0.4, 1.2, 0.01)
df = pd.DataFrame()
temperatures = [25@u_Degree, 50@u_Degree, 75@u_Degree, 100@u_Degree, 125@u_Degree, 150@u_Degree, 175@u_Degree]
analyses = {}
for temperature in temperatures:
simulator = circuit.simulator(temperature=temperature)#, nominal_temperature=temperature)
analysis = simulator.dc(Vinput=Vin)
ser = pd.Series(data=-analysis.Vinput, index=analysis.in_, name=f'{temperature}')
df = pd.concat([df, ser.to_frame()])
df.index.name = 'V'
fig = px.line(df, title='Charakterystyka diody 1N4007', width=750, height=550)
fig.update_yaxes(title='I')
fig.write_html('_dioda.html')
#fig.show()
Unsupported Ngspice version 41
Symulacja: Aproksymacja parametrów modelu metodą genetyczną¶
Dodatkowa fukcjonalność modułu symulacyjnego PySpice¶
Możliwość przyporządkowanie jednostki miary. Program sam dokona konwersji jednostki w zależności od działania.
In [11]:
from PySpice.Unit import *
i = 2@u_A
v = 5@u_V
p = i*v
print(f'{i} * {v} = {p}')
s = 8@u_m
t = 2@u_s
v = s/t
a = v/t
print(f'{s} / {t} = {v}')
print(f'{v} / {t} = {a}')
2 A * 5 V = 10.0 W 8 m / 2 s = 4.0 m*s^-1 4.0 m*s^-1 / 2 s = 2.0 m*s^-2
Analiza danych, prezentacje i publikacje wyników¶
Przykład: porównanie charakterystyk trzech tranzystorów¶
wykres interaktywnyIn [12]:
from fileinput import filename
from operator import index
from tracemalloc import stop
from xml.dom.expatbuilder import TEXT_NODE
import numpy as np
import pandas as pd
import plotly.graph_objects as go
tranzystors = ["A(TP65H035WSQA)", "B(GAN063-560WSA)", "C(TP60H050WS)"]
colorscales = ['Viridis','RdBu', 'YlOrRd' ]
t_start = -50
t_end = 150
t_step = 5
t_a_s = range(t_start, t_end, t_step)
typ = 1 # 1-przejściowa 0-wyjściowa
if typ:
pomiar = "Przejściowa Uds"
c_i = 11 # 11 dla Uds = 1V
else:
pomiar = "Wyjściowa Ugs"
c_i = 6 # 6 dla Ugs = 5V
surfaces = []
for tranzystor in tranzystors:
t_a = t_start
# do budowy indeksu
# wskazany wskazane konkretne pliki z indeksami w pierwszej kolumnie
# z powodu pomyłki niektóre pliki csv nie mają indeksu
#fn = f"data\{pomiar}-A(TP65H035WSQA)-Ta{t_a:.0f}.csv"
fn = f"data\{pomiar}-B(GAN063-560WSA)-Ta30.csv"
#print("Odczytałem plik {}".format(fn))
ds = pd.read_csv(fn, sep = ';', decimal = '.', index_col = 0)
df = pd.DataFrame(index=ds.index.values)
cn = list(ds.columns.values)[c_i-1]
df = df.sort_index()
for t_a in t_a_s:
fn = f"data\{pomiar}-{tranzystor}-Ta{t_a:.0f}.csv"
try:
ds = pd.read_csv(fn, sep = ';', decimal = '.')
#print("Odczytałem plik {}".format(fn))
cn_ = "$T_a={:.0f}°C$".format(t_a)
seria = ds[cn].values
df.insert(len(df.columns), cn_, seria, True)
except:
seria = None #pd.Series(None, name='"$T_a={:.0f}°C$".format(t_a)')
seria.fill(None)
df = pd.concat([df, ds[cn]],ignore_index=True)
x = t_a_s
y = df.index
X, Y = np.meshgrid(x, y)
Z = np.zeros([len(y), len(x)])
for ix in range(0, len(x)):
for iy in range (0, len(y)):
Z[iy,ix] = df.iloc[iy, ix]
xl=len(x)
yl=len(y)
surface = go.Surface(z=Z, x=X, y=Y,
colorscale=colorscales[tranzystors.index(tranzystor)],
name=tranzystor, showlegend=True, showscale=False)
surfaces.append(surface)
fig = go.Figure(data=surfaces)
# Ustawienia osi i widoczności legendy
fig.update_layout(
scene=dict(
xaxis_title='Ta [°C]',
yaxis_title='Ugs [V]',
zaxis_title='Id [V]'
),
showlegend=True, # Włączenie legendy
title="Tranzystory",
width=750,
height=550
)
fig.write_html('_3tra.html')
fig.show()
Przykład analizy matematycznej i operacji symbolicznych¶
In [13]:
import sympy as sp
a, b, c, x = sp.symbols('a b c x')
fy = a*x**3+b*x**2+c
display(sp.Eq(sp.Derivative(fy,x), sp.Derivative(fy,x, evaluate=True), evaluate=False))
display(sp.Eq(sp.Derivative(fy,x,x), sp.Derivative(fy,x,x, evaluate=True), evaluate=False))
$\displaystyle \frac{\partial}{\partial x} \left(a x^{3} + b x^{2} + c\right) = 3 a x^{2} + 2 b x$
$\displaystyle \frac{\partial^{2}}{\partial x^{2}} \left(a x^{3} + b x^{2} + c\right) = 2 \left(3 a x + b\right)$
Przykład obliczeń numerycznych na podstawie poprzedniej funkcji¶
wykres interaktywnyIn [14]:
import numpy as np
import plotly.express as px
vx = np.linspace(-4, 4, 100)
fy = fy.subs({(a,2), (b,3), (c,4)})
dfy = sp.Derivative(fy,x, evaluate=True)
vy = []
vdy = []
for x_ in vx:
vy.append(float(fy.subs(x, x_).evalf()))
vdy.append(float(dfy.subs(x, x_).evalf()))
import pandas as pd
data = {fy: vy,
dfy: vdy}
df = pd.DataFrame(data=data, index=vx)
fig = px.line(df, width=750, height=550)
fig.update_layout(
title=r'Wykres funkcji i pochodnej',
xaxis_title=r'X',
yaxis_title=r'Y',
)
fig.write_html('_poch.html')
fig.show()
Całki¶
In [15]:
y = (x**2+5*x)*sp.exp(x)
integ = sp.Integral(y, x)
display(sp.Eq(integ, integ.doit(), evaluate=False))
integ = sp.Integral(y, (x, 0,2))
display(sp.Eq(integ, integ.doit(), evaluate=False))
y = sp.exp(-x)
integ = sp.Integral(y, (x, 0, sp.oo))
display(sp.Eq(integ, integ.doit(), evaluate=False))
$\displaystyle \int \left(x^{2} + 5 x\right) e^{x}\, dx = \left(x^{2} + 3 x - 3\right) e^{x}$
$\displaystyle \int\limits_{0}^{2} \left(x^{2} + 5 x\right) e^{x}\, dx = 3 + 7 e^{2}$
$\displaystyle \int\limits_{0}^{\infty} e^{- x}\, dx = 1$
Macierze, tensory¶
'Einstein tensor'
$\displaystyle \left[\begin{matrix}- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}} - \left(\frac{2 M}{r} - 1\right) \left(- \frac{r \left(- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}}\right)}{2 \left(- 2 M + r\right)} + \frac{\left(- 2 M + r\right) \left(- \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}}\right)}{2 r} + \frac{- \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2} \sin^{2}{\left(\theta \right)}} + \frac{\frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2}}\right) & 0 & 0 & 0\\0 & - \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} - \frac{- \frac{r \left(- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}}\right)}{2 \left(- 2 M + r\right)} + \frac{\left(- 2 M + r\right) \left(- \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}}\right)}{2 r} + \frac{- \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2} \sin^{2}{\left(\theta \right)}} + \frac{\frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2}}}{- \frac{2 M}{r} + 1} & 0 & 0\\0 & 0 & \frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}} - r^{2} \left(- \frac{r \left(- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}}\right)}{2 \left(- 2 M + r\right)} + \frac{\left(- 2 M + r\right) \left(- \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}}\right)}{2 r} + \frac{- \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2} \sin^{2}{\left(\theta \right)}} + \frac{\frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2}}\right) & 0\\0 & 0 & 0 & - \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}} - r^{2} \left(- \frac{r \left(- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}}\right)}{2 \left(- 2 M + r\right)} + \frac{\left(- 2 M + r\right) \left(- \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}}\right)}{2 r} + \frac{- \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2} \sin^{2}{\left(\theta \right)}} + \frac{\frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2}}\right) \sin^{2}{\left(\theta \right)}\end{matrix}\right]$
Podsumowanie¶
Wszystko pod kontrolą jednego środowiska¶
Umożliwa szybkie wykonanie prezentacji z bieżących danych¶
Praktycznie nieograniczone i darmowe możliwości¶
Wszystko na zasadach otwartego oprogramowania (Open Source)¶
Naturalnym systemem dla tego środowiska jest Linux¶