summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Luka Šijanec <anton@sijanec.eu>2022-05-04 11:52:18 +0200
committerAnton Luka Šijanec <anton@sijanec.eu>2022-05-04 11:52:18 +0200
commit36ae37696718185a6ac6ed3b863a7941bd03d21b (patch)
treef3519e2afc5e3406d650eed6933801dec9fe2021
parentniçle (diff)
downloadsola-gimb-3-36ae37696718185a6ac6ed3b863a7941bd03d21b.tar
sola-gimb-3-36ae37696718185a6ac6ed3b863a7941bd03d21b.tar.gz
sola-gimb-3-36ae37696718185a6ac6ed3b863a7941bd03d21b.tar.bz2
sola-gimb-3-36ae37696718185a6ac6ed3b863a7941bd03d21b.tar.lz
sola-gimb-3-36ae37696718185a6ac6ed3b863a7941bd03d21b.tar.xz
sola-gimb-3-36ae37696718185a6ac6ed3b863a7941bd03d21b.tar.zst
sola-gimb-3-36ae37696718185a6ac6ed3b863a7941bd03d21b.zip
-rw-r--r--.gitignore2
-rw-r--r--fiz/naloga/dokument.tex68
-rw-r--r--mat/programčki/ničle.singlethreaded16bit.c37
3 files changed, 82 insertions, 25 deletions
diff --git a/.gitignore b/.gitignore
index ab3e9d2..b6d7d03 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,5 +17,7 @@
*.jpg
*.idx
*.markdown.in
+*.gnuplot
+*.table
core
# datoteke .jpeg so trackane, .jpg pa ne
diff --git a/fiz/naloga/dokument.tex b/fiz/naloga/dokument.tex
index 8ff4153..c8d882b 100644
--- a/fiz/naloga/dokument.tex
+++ b/fiz/naloga/dokument.tex
@@ -14,6 +14,9 @@
\usepackage{xcolor}
\usepackage{csquotes}
\usepackage[makeroom]{cancel}
+\usepackage{pgfplots}
+\usepackage{tkz-euclide}
+\newcommand{\functionSamples}{100} % fix to fancier value upon release, keep low during development
\sisetup{output-decimal-marker = {,}, quotient-mode=fraction, output-exponent-marker=\ensuremath{\mathrm{e}}} % per-mode=fraction/symbol
\settimeformat{hhmmsstime}
\makeatletter
@@ -61,9 +64,9 @@
\newcommand{\kvcm}[1]{
\SI[parse-numbers=false]{#1}{\centi\meter\squared}
}
-\title{Projektna naloga: Magnetno polje Helmholtzove tuljave}
+\title{Projektna naloga: Magnetno polje Helmholtzove tuljave (23. naloga)}
\author{Anton Luka Šijanec, 3. a}
-\date{V osmek, 32. februarja 201}
+\date{V torek, 3. maja 2022}
\newcommand\vektor{\overrightarrow}
\begin{document}
\maketitle
@@ -74,7 +77,7 @@
\section{Uvod}
Helmholtzova tuljava oziroma Helmholtzov par je poimenovana po nemškemu fiziku devetnajstega stoletja Hermannu Ludwigu Ferdinandu von Helmholtzu in predstavlja pripravo za izdelavo umetnega lahko dostopnega homogenega magnetnega polja visoke kvalitete. Solenoidi, torej dolge in ozke tuljave, pod električnim poljem sicer delajo kvalitetno, z vstavljenim feromagnetom tudi močno magnetno polje, vendar je le-to težko dostopno, saj se nahaja znotraj navojev. Helmholtzova tuljava pa je sestavljena iz dveh tokovnih zank oziroma magnetnih dipolov, to sta dve ravninsko vzporedni enaki kratki in široki med seboj za polmer oddaljeni tuljavi. Ob prisotnosti enako velikega in enako usmerjenega električnega toka v vodnikih se v sredini med njima pojavi veliko območje s homogenim magnetnim poljem, kar je uporabno za mnoge elektrotehnične probleme, denimo natančno kalibracijo merilnikov in nasprotovanje vplivu Zemljinega magnetnega polja na instrumente.
-Maxwellova tuljava škotskega fizika James Clerk Maxwell je dodatek Helmholtzovi tuljavi. Z dodatnimi pravilno postavljenimi navitji za ceno dodatnega materiala in kompleksnosti dodatno poveča območje in homogenost magnetnega polja.
+Maxwellova tuljava škotskega fizika Jamesa Clerka Maxwella je dodatek Helmholtzovi tuljavi. Z dodatnimi pravilno postavljenimi navitji za ceno dodatnega materiala in kompleksnosti dodatno poveča območje in homogenost magnetnega polja.
\section{Teorija}
Navodilo zahteva meritev in teoretično napoved vrednosti magnetnega polja na oseh tuljave. Če je radij $R$, število navojev $n$ in tok $I$, je jakost magnetnega polja $B$ na sredini
$$B=\left(\frac{4}{5}\right)^{3/2}\frac{\mu_0nI}{R}\text{,}$$
@@ -83,12 +86,12 @@ kjer je $\mu_0$ indukcijska/magnetna konstanta.
\subsection{Razlaga enačbe}
\subsubsection{Biot-Savartov zakon}
Z Biot-Savartovim zakonom predstavimo vektor $B$ magnetnega polja, ki se pojavi zaradi stalnega električnega polja $I$ v vodniku na poti $C$. Predstavi relacijo magnetnega polja na jakost, smer, dolžino in bližino električnega toka z enačbo
-$$B(r)=\frac{\mu_0}{4\pi}\int_C\frac{Id\ell\times\hat{r}^\prime}{{|r^\prime|}^2}\text{,}$$
-kjer je $d\ell$ vektor na poti elektronov $C$, čigar velikost je infinitezimalno majhen del vodnika v smeri električnega toka, $\ell$ je torej točka na $C$, $\hat{r}^\prime$ je enotski vektor (množen z obratno vrednostjo svoje velikosti --- $\hat{r}^\prime=r^\prime\cdot{|r^\prime|}^{-1}$) vektorja $r^\prime=r-\ell$ --- vektorja premika od vodnika ($d\ell$ oz. $\ell$) do točke $r$, katere vektor magnetnega polja želimo izračunati. Od prej je $\mu_0$ še vedno indukcijska/magnetna konstanta.
+$$B(r)=\frac{\mu_0}{4\pi}\oint_C\frac{Id\ell\times\hat{r}^\prime}{{|r^\prime|}^2}\text{,}$$
+kjer je $d\ell$ vektor na poti elektronov $C$ (krožnica), čigar velikost je infinitezimalno majhen del vodnika v smeri električnega toka, $\ell$ je torej točka na $C$, $\hat{r}^\prime$ je enotski vektor (množen z obratno vrednostjo svoje velikosti --- $\hat{r}^\prime=r^\prime\cdot{|r^\prime|}^{-1}$) vektorja $r^\prime=r-\ell$ --- vektorja premika od vodnika ($d\ell$ oz. $\ell$) do točke $r$, katere vektor magnetnega polja želimo izračunati. Od prej je $\mu_0$ še vedno indukcijska/magnetna konstanta.
Čeprav se zakon povečini, kot v našem primeru, uporablja na zankah, v katerih teče električni tok, velja tudi za neskončno dolge vodnike. Na tak način je bil z Biot-Savartovim in Lorentzovim zakonom na primer do leta 2019 SI amper definiran kot konstantani tok, ki v vakuumu, ko teče po dveh eden od drugega za en meter oddaljenih vzporednih vodnikih neskončne dolžine z zanemarljivim premerom, povzroči nastanek sile $\SI{2e-7}{\newton}$ na vsak meter dolžine vodnika.
% \subsection{Polje v središču zanke} % TODO
-\subsubsection{Polje na osi zanke}
+\subsection{Polje na osi zanke skozi obe navitji}
% http://hyperphysics.phy-astr.gsu.edu/hbase/magnetic/curloo.html#c4
Biot-Savartov zakon poenostavimo in izračunamo vektorja $B$ za na osi zanke s polmerom $R$ vodnika, po katerem teče tok $I$, poljubno točko $T$, oddaljeno $z$ od središča zanke $S$.
@@ -117,6 +120,51 @@ $$I=\left(\frac{5}{4}\right)^{3/2}\left(\frac{BR}{\mu_0n}\right)\text{,}$$
kjer je $\mu_0$ malo drugače zapisana ista indukcijska/magnetna konstanta ($=\SI{\pi4e-7}{\tesla\meter\per\ampere}$), in s tem izračunamo potreben tok za stalno homogeno magnetno polje v središču tuljave.
% \subsection{Izmenična napetost} % TODO
% Napajanje tuljave za dosego željenega stalnega magnetnega polja je torej preprosto, saj bo magnetno polje v vseh točkah linearno raslo s tokom skozi obe tuljavi, malo težje pa je izdelati nihajoče magnetno polje, saj je tuljava induktor, čigar impedanca se z višanjem frekvence veča, torej je za dosego enake jakosti magnetnega polja na dvakrat višji frekvenci potrebna dvakrat višja napetost na navitjih.
+\subsection{Polje na simetrijski osi}
+% Polje na simetrijski osi je bilo težko izračunati, zato sem uporabil vnaprej integrirano enačbo iz dopolnila k projektni nalogi:
+% $$
+% B\left(z\right)=\frac{\mu_0NIR^2}{2}\left[
+% \left(R^2+\left(z-\frac{R}{2}\right)^2\right)^{\displaystyle-\frac{3}{2}}
+% +
+% \left(R^2+\left(z+\frac{R}{2}\right)^2\right)^{\displaystyle-\frac{3}{2}}
+% \right]
+% $$
+Druge osi nisem znal izračunati, zato bom teoretično napoved izračunal numerično - predstavljal si bom, da je namesto okrogle zanke tam mnogokotnik in uporabil Biot-Savartov zakon v iteraciji z računalnikom.
+\subsection{Grafi}
+Kot primer vzemimo šolsko Helmholzovo tuljavo s 320 navoji na vsakem navitju, katerega radij je enak $\SI{6,8}{\centi\meter}$, skozi katera teče stalen enosmerni tok \SI{250}{\milli\ampere}.
+
+\begin{tikzpicture}
+\begin{axis}[legend style={at={(1.2,1)}}, anchor=north west,
+ylabel = {jakost magnetnega polja},
+xlabel = {razdalja na osi},
+x = 21cm
+]
+\addplot gnuplot [raw gnuplot, id=test, mark=none]{
+m = pi*4e-7;
+R = 0.068;
+N = 320;
+I = 0.25;
+plot [-3*R:3*R] N*m*R**2*I/(2*((x-R/2)**2+R**2)**(3/2));
+};
+\addlegendentry{os skozi središči navitij (L)}
+\addplot gnuplot [raw gnuplot, id=test, mark=none]{
+m = pi*4e-7;
+R = 0.068;
+N = 320;
+I = 0.25;
+plot [-3*R:3*R] N*m*R**2*I/(2*((x+R/2)**2+R**2)**(3/2));
+};
+\addlegendentry{os skozi središči navitij (D)}
+\addplot gnuplot [raw gnuplot, id=test, mark=none]{
+m = pi*4e-7;
+R = 0.068;
+N = 320;
+I = 0.25;
+plot [-3*R:3*R] N*m*R**2*I/(2*((x-R/2)**2+R**2)**(3/2)) + N*m*R**2*I/(2*((x+R/2)**2+R**2)**(3/2));
+};
+\addlegendentry{os skozi središči navitij (L+D)}
+\end{axis}
+\end{tikzpicture}
\section{Koncept poizkusa}
% https://sl.wikipedia.org/wiki/Hallov_pojav
% https://en.wikipedia.org/wiki/Hall_effect
@@ -132,7 +180,7 @@ Glavni omejevalni pogoj je žica oziroma električni vodnik, ki bo uporabljen za
% R = o/(n2\pi)
Če torej za $n$ vzamemo 300 navojev, bo polmer vsakega navitja $R=\SI{109}{\meter}/(300\cdot2\pi)\widetilde=\SI{5,8}{\centi\meter}$, jakost homogenega magnetnega polja pa bo ob toku $\SI{0,6}{\ampere}$ (maksimalen tok je $\SI{0,7}{\ampere}$) približno $\SI{2,8}{\milli\tesla}=\SI{28}{\gauss}$. To je več od magnetnega polja Zemlje, ki je nekje $\SI{30}{\micro\tesla}=\SI{3e-5}{\tesla}=\SI{0,3}{\gauss}$.
-Ustrezen merilnik je na primer MPU 9250 podjetja TDK InvenSense, ki poleg gostote magnetnega polja meri tudi pospešek in kotno hitrost v treh razsežnostih. Za tak projekt je idealen, ker ga ne proizvajajo več in je zato cenejši. Sicer točno take integrirane merilnike najdemo tudi v pametnih telefonih, vendar bi bilo s telefonom merjenje težje, saj je v telefonu na neznanem mestu. Podprta hitrost vzorčenja je vse od 8000 do 3,9 vzorcev na sekundo, verjetno bom izvajal okoli 100 meritev na sekundo, torej bom imel za procesiranje vsakega vzorca imel 10 milisekund časa, kar je največ 1,6 milijona ciklov procesorja na \SI{160}{\mega\hertz}.
+Ustrezen merilnik je na primer MPU 9250 podjetja TDK InvenSense, ki poleg gostote magnetnega polja meri tudi pospešek in kotno hitrost v treh razsežnostih. Za tak projekt je idealen, ker ga ne proizvajajo več in je zato cenejši. Sicer točno take integrirane merilnike najdemo tudi v pametnih telefonih, vendar bi bilo s telefonom merjenje težje, saj je v telefonu na neznanem mestu. Podprta hitrost vzorčenja je vse od 8000 do 3,9 vzorcev na sekundo, verjetno bom izvajal okoli 100 meritev na sekundo.
% https://invensense.tdk.com/download-pdf/invensense-motion-sensor-universal-evaluation-board-uevb-user-guide/
% https://invensense.tdk.com/wp-content/uploads/2015/02/PS-MPU-9250A-01-v1.1.pdf
\begin{itemize}
@@ -148,10 +196,12 @@ Ustrezen merilnik je na primer MPU 9250 podjetja TDK InvenSense, ki poleg gostot
$\pm16g$.
\item Magnetomer: 14-bitna ločljivost, merilno območje: $\SI{\pm4,8}{\milli\tesla}$.
\end{itemize}
-Merilnik nameravam uporabiti za določanje pozicije s stalnim merjenjem podatkov žiroskopa in pospeškometra. V kolikor ti dve komponenti merilnika nista dovolj natančni, bom pozicijo določil z videoanalizo z uporabo knjižnice CCTag.
+Merilnik nameravam uporabiti za določanje pozicije s stalnim merjenjem podatkov žiroskopa in pospeškometra. V kolikor ti dve komponenti merilnika nista dovolj natančni, bom pozicijo določil z videoanalizo z uporabo knjižnice CCTag. V kolikor bo še to pretežko, bom meril samo velikost vektorja magnetnega polja (jakost) na omenjenih dveh dimenzijah.
+
+Edina neodvisna količina bo razdalja na obeh dveh oseh, spreminjala se bo v območju $\left(-3R; 3R\right)$. Toka, radija tuljave in števila navojev ne bom spreminjal.
% http://github.com/alicevision/CCTag
-Za generiranje toka bom uporabil napajalnik računalnika s stalno napetostjo in regulator napetosti.
+Za generiranje toka bom uporabil napajalnik računalnika ali pa Iskrin Šolski malonapetostni izvir s stalno napetostjo in regulator napetosti.
\section{Zaključek}
Bo napisan, ko bom vrednosti praktično tudi izmeril.
% https://en.wikipedia.org/wiki/Helmholtz_coil
diff --git a/mat/programčki/ničle.singlethreaded16bit.c b/mat/programčki/ničle.singlethreaded16bit.c
index 2412a1a..49d53a6 100644
--- a/mat/programčki/ničle.singlethreaded16bit.c
+++ b/mat/programčki/ničle.singlethreaded16bit.c
@@ -8,8 +8,8 @@
#include <string.h>
#include <unistd.h>
#include <gsl/gsl_errno.h>
-void pripravi_koeficiente (double * izhod, int številka) {
- while (številka) {
+void pripravi_koeficiente (double * izhod, int številka, int koeficientov) {
+ while (koeficientov--) {
*izhod++ = številka & 1 ? 1 : -1;
številka >>= 1;
}
@@ -21,7 +21,7 @@ int main (int argc, char ** argv) {
fprintf(stderr, "uporaba: %s stopnja ime širina\n", argv[0] ? argv[0] : "ničle");
return 1;
}
- int šir = atoi(argv[3]);
+ long long int šir = atoi(argv[3]);
int fd;
if ((fd = open(argv[2], O_CREAT | O_RDWR, 00664)) == -1) {
perror("open");
@@ -42,19 +42,20 @@ int main (int argc, char ** argv) {
}
unsigned char * slika = (unsigned char *) p + 128;
memset(p, 0, 128 + šir*šir*2);
- sprintf(p, "P5\n\n%58d\n%58d\n65535\n", šir, šir); // precisely calculated with dc(1) (:
- int stopnja = atoi(argv[1]);
- double koeficienti[stopnja+1]; // kako prikladno! polinom nte stopnje ima n+1 členov
- double ničle[2*stopnja]; // ima pa n ničer, 2n+0 so realni deli, 2n+1 pa imaginarni
+ sprintf(p, "P5\n\n%58lld\n%58lld\n65535\n", šir, šir); // precisely calculated with dc(1) (:
+ long long int stopnja = atoi(argv[1]);
+ double koeficienti[stopnja+1]; // kako prikladno! polinom nte stopnje ima n+1 členov
+ double ničle[2*stopnja]; // ima pa n ničel, 2n so realni deli, 2n+1 pa imagin
gsl_set_error_handler_off();
gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc(stopnja+1);
int prej_izpisano = 6969;
- for (int i = 0; i < 1 << (stopnja+1); i++) {
- if (prej_izpisano != i*1000/(1 << (stopnja+1))) {
- prej_izpisano = i*1000/(1 << (stopnja+1));
+ unsigned int over = 0;
+ for (long long int i = 0; i < 1LL << (stopnja+1); i++) {
+ if (prej_izpisano != i*1000/(1LL << (stopnja+1))) {
+ prej_izpisano = i*1000/(1LL << (stopnja+1));
fprintf(stderr, "\rRačunam in rišem ničle: %d promilov", prej_izpisano);
- }
- pripravi_koeficiente(koeficienti, i); // noben člen ni 0, vsi so bodisi 1 bodisi -1
+ } // noben člen ni 0, vsi so bodisi 1 bodisi -1
+ pripravi_koeficiente(koeficienti, i, stopnja+1);
if (gsl_poly_complex_solve(koeficienti, stopnja+1, w, ničle) != GSL_SUCCESS)
nekonvergiranih++; // uuu, lahko bi recimo narisali tiste, ki ne konver.
for (int j = 0; j < 2*stopnja; j += 2) {
@@ -66,8 +67,12 @@ int main (int argc, char ** argv) {
continue;
}
slika[2*šir*višina_na_sliki+širina_na_sliki*2+1]++;
- if (!slika[1*šir*višina_na_sliki+širina_na_sliki*2+1])
- slika[2*šir*višina_na_sliki+širina_na_sliki*2]++;
+ if (!slika[2*šir*višina_na_sliki+širina_na_sliki*2+1]) {
+ if (slika[2*šir*višina_na_sliki+širina_na_sliki*2] != 255)
+ slika[2*šir*višina_na_sliki+širina_na_sliki*2]++;
+ else
+ over++;
+ }
}
}
fprintf(stderr, "\r KONČANO \n");
@@ -76,7 +81,7 @@ int main (int argc, char ** argv) {
perror("munmap"); // nima smisla ukinjat programa, sistem si je sam kriv >:)
if (close(fd) == -1)
perror("close");
- printf("%d ničel je izven 2+2i (izven slike)\n%d polinomov ni konvergiralo\n",
- izven_slike, nekonvergiranih);
+ printf("%u ničel je izven 2+2i (izven slike)\n%u polinomov ni konvergiralo\n"
+ "%d overflowov na sliki\n", izven_slike, nekonvergiranih, over);
return 0;
}