• No results found

Ventilatorstyring i tunnel : frisk luft hele veien

N/A
N/A
Protected

Academic year: 2022

Share "Ventilatorstyring i tunnel : frisk luft hele veien"

Copied!
80
0
0

Laster.... (Se fulltekst nå)

Fulltekst

(1)

Vedlegg 2

Testprosedyre miniatyrmodell

Testprosedyren er laget for å ha en plan å følge når gruppen skal gjennomføre tester.

Dette er nødvendig for å utføre grundige tester som kan brukes senere i prosjektet.

Uten en testprosedyre kan forsøkene ta mye lengre tid og det kan bli dårligere kvalitet på resultatene. Det er også god HMS å analysere sikkerhetsrisiko for testingen av den fysiske modellen.

Sikkerhet

Sikkerhetsaspektene i vårt projekt er hovedsakelig sikkerhet innenfor det materielle.

Personskader som kan forekomme er små kutt på skarpe kanter. Dette er litt sannsynlig i monteringsfasen, men konsekvensene er små. Siden testene utføres på fysikklaben, er det allerede en vask der og plaster i en boks på veggen. Derfor er det ikke nødvendig å utføre tiltak for denne risikoen.

Materielle skader som kan skje er hovedsaklig skade på komponenter som benyttes under oppkobling og testing. Elektroniske komponenter kan bli ødelagt ved feilkobling for eksempel. Det er lav spenning, så det er ikke store skader som kan skje, men kun å da erstatte skadet komponent. Tiltak for å minimere risikoen for dette er å være nøye med oppkobling og dobbeltsjekke at det er riktig før man skrur på spenning.

Gjennomføring

I virkelige tunneler er det vanlig med 6 ventilatorer i en ventilatorgruppe. Antallet ventilatorgrupper og avstanden mellom dem varierer ut ifra tunnellengden og tunnel- klassen. I den fysiske modellen er det kun 3 ventilatorer per ventilatorgruppe, og i den simulerte er det 2 per ventilatorgruppe.

Test 1:

1 vifte på.

2 vifter på.

3 vifter på.

4 vifter på.

5 vifter på.

6 vifter på.

7 vifter på.

8 vifter på.

9 vifter på.

Test 2:

Gruppe 1, 2, 3 på.

Gruppe 1,2 på og 3 av.

Gruppe 1 på, 2 og 3 av.

iii

(2)

Gruppe 1 av, 2 på, 3 av.

Test 3:

1 vifte på i hver viftegruppe.

2 vifte på i hver viftegruppe.

3 vifte på i hver viftegruppe.

Test 4:

Med 6 impulsvifter på:

PWM-vifte 20% på i hver viftegruppe.

PWM-vifte 40% på i hver viftegruppe.

PWM-vifte 60% på i hver viftegruppe.

PWM-vifte 80% på i hver viftegruppe.

Med 6 impulsvifter av:

PWM-vifte 20% på i hver viftegruppe.

PWM-vifte 40% på i hver viftegruppe.

PWM-vifte 60% på i hver viftegruppe.

PWM-vifte 80% på i hver viftegruppe.

Figur 0.1 viser et bildeutsnitt av et Excel ark der det ble notert ned målinger av lufthastigheten til miniatyrmodellen

iv

(3)

Figur 0.1: Figuren viser et bildeutsnitt fra Excelarket der det ble notert verdier på målinger av lufthastigheten i miniatyrmodellen

v

(4)

Vedlegg 3

Veiledningsoppsett til simulering

Dette vedlegget beskriver oppsettet som er gjort av Khawaja, Hassan - førsteamanuen- sis for Ingeniørvitenskapog sikkerhet IVT, UiT og hvor simuleringene fra rapporten ba- serer seg på denne. I dette oppsettet er det brukt en lisens som ikke har begrensninger på antall elementer i tilknytning mesh-generering og løsningsmetodenCFX er brukt.

Det er brukt en annen, mer kraftfull datamaskin for simulering av dette oppsettet.

Oppsettet bruker samme design av 3D-modell som er beskrevet i rapporten.

Geometry

Modellen er konstruert med bruk av det innebygde modelleringsverkøyetDesignMo- deler, der Large Model Support er aktivert. Her er også de forskjellige overflatene til modellen definert som grenseverdier med bruk avName selection:

Tunnel-innløp -tunnel_inlet Tunnel-utløp -tunnel_outlet Tunnel vegger -tunnel_surface Tunnel vegdekke -road_surface Ventilator deksel -fan_1-6_cowling Ventilator innløp -fan_1-6_inlet Ventilator utløp -fan_1-6_outlet

Fra figur 0.2 er ventilatorene representert som en sylinder med diameter på 1 meter og lengde på 0.25 meter. Den består av et tomrom som er ekstrudert fra domenet.

Figur 0.2:Figuren viser hvordan ventilatorene er representert

vi

(5)

For å kunne representere de faktiske inn -og utløpene til ventilatorene er grenseverdi- ene til disse definert på en noe spesiell måte:

De faktiske innløpene til ventilatorene er definert som utløp med bruk av (fan_1- 6_inlet) og de faktiske utløpene til ventilatorene er definert som innløp med bruk av (fan_1-6_outlet) til sylinderene.

Figur 0.3: Figuren viser hvordan grenseverdiene er definert. Overflaten markert i grønn er i dette tilfellet fan_1-6_outlet

vii

(6)

Mesh

Til generering av meshgrid til modellen er det bruktProximity and Curvatureskalering med fin-innstilling. Følgende spesielle innstilinger er brukt:

Max Face Size 0,750 m

Mesh defeaturing yes

Defeature Size 7,5e-002 m

Span Angle Center Fine

Min Size 0,150 m

Proximity Min Size 0,150 m

Figur 0.4: Figuren viser resultatet av Generering av Meshgrid. Med de spesifikke parameterne ga genereringen: 143216 noder og 710853 elementer.

viii

(7)

Setup

I CFX-solver er det brukt Steady-state. De forskjellige grenseverdiene er definert på følgende måte:

fan_1-6_inlet Outlet

fan_1-6_outlet Inlet

fan_1-6_cowling Wall

tunnel_inlet Opening

tunnel_outlet Opening

tunnel_surface Wall

road_surface Wall

Strømningene gjennomfan_1-6_inletogfan_1-6_outleter satt til subsonisk og med en startverdi på 20.16 m/s. Relativ trykk til innløpet og utløpet til tunnelen (tunnel_inlet ogtunnel_outlet) er satt til 0 Pa.

Tunnelveggen (tunnel_surface) er definert somRough Wallmed en ruhet på 0.005 m.

Det samme gjelder vegdekket til tunnelen (road_surface), men har en ruhet på 0.01m.

Ruheten til vegdekket er estimert av Khawaja, Hassan.

Til løsningen er det brukt standard SI-enheter for strømningsvariablene. I Solver Controler følgende innstillinger satt:

Advection Scheme High Reselution Turbulence Numerics High Reselution

Convergence Control

Min. Iterations 1

Max .Iterations 2000

Convergence Criteria

Residual Type RMS

Residual Target 1.E-4

Til simuleringer av dette oppsettet ble det bruk en datamaskin med en 16-kjerner Intel-Xeon prosessor, der løsningen konvergerte etter ca. 800 iterasjoner og med en oppetid på rundt 40 minutter.

ix

(8)

Vedlegg 4

Vedlegg 4 viser MATLAB kodene som er brukt for behandle data fra simuleringene og måledata fra miniatyrmodellen.

x

(9)

MATLAB KODE:

Følger samme kronologiske rekkefølge som kapittel 3.3 Analyse fra tester og simuleringer.

Miniatyrmodell: gjennomsnittlig lufthastighet og antall vifter

xi

(10)

Simulering: gjennomsnitt lufthastighet og antall vifter

clear all

%Laste inn mat-filene som inneholder rå-data fra simuleringene load D:\Simuleringsdata\1_fan_act\Pressure_1fan.mat; load D:\Simuleringsdata\1_fan_act\Velocity_1fan.mat; load D:\Simuleringsdata\1_fan_act\Zm_1fan.mat;

load D:\Simuleringsdata\2_fan_act\Pressure_2fan.mat; load D:\Simuleringsdata\2_fan_act\Velocity_2fan.mat; load D:\Simuleringsdata\2_fan_act\Zm_2fan.mat;

load D:\Simuleringsdata\3_fan_act\Pressure_3fan.mat; load D:\Simuleringsdata\3_fan_act\Velocity_3fan.mat; load D:\Simuleringsdata\3_fan_act\Zm_3fan.mat;

load D:\Simuleringsdata\4_fan_act\Pressure_4fan.mat; load D:\Simuleringsdata\4_fan_act\Velocity_4fan.mat; load D:\Simuleringsdata\4_fan_act\Zm_4fan.mat;

load D:\Simuleringsdata\5_fan_act\Pressure_5fan.mat; load D:\Simuleringsdata\5_fan_act\Velocity_5fan.mat; load D:\Simuleringsdata\5_fan_act\Zm_5fan.mat;

load D:\Simuleringsdata\6_fan_act\Pressure_6fan.mat; load D:\Simuleringsdata\6_fan_act\Velocity_6fan.mat; load D:\Simuleringsdata\6_fan_act\Zm_6fan.mat;

%{

k = 6;

Zm_fan = eval(sprintf('Zm_%dfan',k));

Velocity = eval(sprintf('Velocity_%dfan',k)); Pressure

= eval(sprintf('Pressure_%dfan',k));

hold on

title('\fontname{Times New Roman} 6 Ventilatorer i drift') xlabel('\fontname{Times New Roman} Tunnel lengde [m]') ylabel('\fontname{Times New Roman} Lufthastighet [m/s]') plot(Zm_fan(20000:21000), Pressure(20000:21000)), grid minor

%plot(Zm_fan(100:4000), Velocity(100:4000),Zm_fan(10000:22000), Velocity(10000:22000), 'Color', 'b'), grid minor hold

off

%}

avgVel = zeros([6 800]); %Matrise som inneholder gjennomsnittlig lufthastighet for 800 samplinger og der hver rad representerer tallet på antall ventilatorer i drift.

smp_lenght = linspace(1,800,800);

%Metode for å sample rå-dataene for p = 1:1:799

for k

= 1:6 Zm_fan =

xii

(11)

eval(sprintf('Z m_%dfan',k));

Velocity = eval(sprintf('Velocity_%dfan',k));

smp_fan = find((Zm_fan > p) & Zm_fan < (p + 1));

temp_vel = zeros([1 length(smp_fan)]);

for n = 1:length(smp_fan) temp_vel(n) = Velocity(smp_fan(n));

end

temp_avg = mean(temp_vel);

avgVel(k,p) = temp_avg; end end

%{

figure(1);

hold on

plot(smp_lenght, avgVel(1,1:800));

plot(smp_lenght, avgVel(2,1:800));

plot(smp_lenght, avgVel(3,1:800));

plot(smp_lenght, avgVel(4,1:800));

plot(smp_lenght, avgVel(5,1:800));

plot(smp_lenght, avgVel(6,1:800));

hold off

%}

%filter

%Metode for å filtrere dataene windowSize

= 7;

b = (1/windowSize)*ones(1,windowSize);

a = 1;

filter_avgVel_1 = filter(b, a, avgVel(1, 1:800));

filter_avgVel_2 = filter(b, a, avgVel(2, 1:800));

filter_avgVel_3 = filter(b, a, avgVel(3, 1:800));

filter_avgVel_4 = filter(b, a, avgVel(4, 1:800));

filter_avgVel_5 = filter(b, a, avgVel(5, 1:800));

filter_avgVel_6 = filter(b, a, avgVel(6, 1:800));

%Beregner gjennomsntlig line til lufthastighet

%Vifte 1

fan1_in_line = mean(filter_avgVel_1(1:250))*ones(1, 800);

fan1_out_line = mean(filter_avgVel_1(350:800))*ones(1, 800);

%Vifte 2

fan2_in_line = mean(filter_avgVel_2(1:250))*ones(1, 800);

fan2_out_line = mean(filter_avgVel_2(350:800))*ones(1, 800);

%Vifte 3

fan3_in_line = mean(filter_avgVel_3(1:250))*ones(1, 800);

fan3_out_line = mean(filter_avgVel_3(450:800))*ones(1, 800);

%Vifte 4

xiii

(12)

fan4_in_line = mean(filter_avgVel_4(1:250))*ones(1, 800);

fan4_out_line = mean(filter_avgVel_4(450:800))*ones(1, 800);

%Vifte 5 fan5_in_line = mean(filter_avgVel_5(1:250))*ones(1, 800); fan5_out_line =

mean(filter_avgVel_5(550:800))*ones(1, 800);

%Vifte 6

fan6_in_line = mean(filter_avgVel_6(1:250))*ones(1, 800);

fan6_out_line = mean(filter_avgVel_6(550:800))*ones(1, 800);

%{

figure(1);

title('\fontname{Times New Roman} Gjennomsnittlig lufthastighet for 1-6 Ventilatorer i drift');

xlabel('\fontname{Times New Roman} Tunnel lengde [m]');

ylabel('\fontname{Times New Roman} Lufthastighet [m/s]');

hold on

plot(smp_lenght, filter_avgVel_1(1:800));

%plot(smp_lenght, fan1_out_line,'--');

plot(smp_lenght, filter_avgVel_2(1:800));

%plot(smp_lenght, fan2_out_line,'--');

plot(smp_lenght, filter_avgVel_3(1:800));

%plot(smp_lenght, fan3_out_line,'--');

plot(smp_lenght, filter_avgVel_4(1:800));

%plot(smp_lenght, fan4_out_line,'--');

plot(smp_lenght, filter_avgVel_5(1:800));

%plot(smp_lenght, fan5_out_line,'--');

plot(smp_lenght, filter_avgVel_6(1:800)), grid minor

%plot(smp_lenght, fan6_out_line,'--'); hold off

%}

Y = [0,fan1_out_line(1),fan2_out_line(1), fan3_out_line(1), fan4_out_line(1), fan5_out_line(1), fan6_out_line(1)]; %Datapunktene for gjennomsnittlig

lufthastighet.

x = linspace(0,6,7);

[p,S] = polyfit(x,Y,4) %Tilpasset polynom til grafen x1 = linspace(0,6); f1 = polyval(p,x1);

k = (fan6_out_line(1))./(6);

x_line = linspace(0,6,100); y_line

= k*(x_line);

k2 = (fan1_out_line(1));

x_line2 = linspace(0,6,100);

y_line2 = k2*(x_line2);

hold on

xiv

(13)

title('\fontname{Futura} Simulering: Lufthastighet og antall ventilatorer i drift')

xlabel('\fontname{Futura} Antall ventilatorer [n]') ylabel('\fontname{Futura} Lufthastighet [m/s]') plot(x, Y, 'o', 'Color','r'); plot(x_line2, y_line2,'Color',[0.22,0.14,0.4]); plot(x_line, y_line,'Color',[0.97,0.596,0.0]);

plot(linspace(0,6,100), f1,'Color',[0.0549,0.352,0.584]), grid on;

hold off

legend('Datapunkter: gjennomsnittlig lufthastighet','lineær linje fra 0 til 1 ventilatorer i drift','lineær linje fra 0 til 6 ventilatorer i drift',

'4.grads polynom');

Simulering og miniatyrmodell: sammenligning prosent lufthastighet og antall vifter

pro_FMT95 =

zeros(1,10); pro_sim = zeros(1,7);

pro_antFMT95 =

zeros(1,10); pro_antSim = zeros(1,7);

pro_FMT95max =

FMT95_avgVel(10); pro_SIMmax = Sim_avgVel(7);

antV_FMT95 =

linspace(0,9,10); anV_Sim = linspace(0,6,7);

for n = 2:1:10 pro_FMT95(n) = (FMT95_avgVel(n)*100)./pro_FMT95max;

pro_antFMT95(n) = (antV_FMT95(n)*100)./9; end for p

= 2:1:7 pro_sim(p) =

(Sim_avgVel(p)*100)./pro_SIMmax; pro_antSim(p) = (anV_Sim(p)*100)./6; end hold on

title('\fontname{Futura} Sammenligning lufthastighet mellom miniatyrmodell og simuleringer') xlabel('\fontname{Futura} Antall Ventilatorer [%]')

ylabel('\fontname{Futura} Lufthastighet [%]') plot(pro_antFMT95, pro_FMT95);

plot(pro_antSim, pro_sim), grid on; hold off

legend('Målinger fra miniatyrmodellen', 'Resultater fra simuleringene');

%{ pro_sim = zeros(1,7); pro_SIMmax = Sim_avgVel(7); anV_Sim = linspace(0,6,7);

for p = 2:1:7 pro_sim(p) = (Sim_avgVel(p)*100)./pro_SIMmax;

%pro_antSim(p) = (anV_Sim(p)*100)./6; end hold on

title('\fontname{Futura} Simulering: Hvor mye av total lufthastighet ventilatorene gir i prosent')

xlabel('\fontname{Futura} Antall Ventilatorer [n]') ylabel('\fontname{Futura} Lufthastighet [%]')

plot(anV_Sim, pro_sim,'o'); plot(anV_Sim, pro_sim), grid on; hold off

legend('Datapunkter: gjennomsnittlig lufthastighet', 'Tilhørende linje for datapunktene');

%}

xv

(14)

Simulering: lufthastighetsprofil i forhold til tunnelhøyde

clear all

%Laste inn mat-filene som inneholder rå-data fra simuleringene load D:\Simuleringsdata\1_fanGrad\Xm1fan.mat; load

D:\Simuleringsdata\1_fanGrad\Ym1fan.mat; load D:\Simuleringsdata\1_fanGrad\Velocity1fan.mat;

load D:\Simuleringsdata\6_fanGrad\X.mat; load D:\Simuleringsdata\6_fanGrad\Y.mat; load D:\Simuleringsdata\6_fanGrad\Velocity.mat;

%Samplingsmetode for p = 1:1:205 smp_x1 = find((Xm1fan > - 0.5) & Xm1fan < 0.5); smp_x6

= find((xm > - 0.5) & xm < 0.5);

temp_x1 = zeros([1 length(smp_x1)]);

temp_y1 = zeros([1 length(smp_x1)]);

temp_x6 = zeros([1 length(smp_x6)]);

temp_y6 = zeros([1 length(smp_x6)]);

for n = 1:length(smp_x6) temp_x6(n) = xm(smp_x6(n));

temp_y6(n) = ym(smp_x6(n));

temp_vel6(n) = Velocityms1(smp_x6(n));

end

for m = 1:length(smp_x1) temp_x1(m) = Xm1fan(smp_x1(m));

temp_y1(m) = Ym1fan(smp_x1(m));

temp_vel1(m) = Velocity1fan(smp_x1(m));

end end

tmp_sortY1 = sort(temp_y1); tmp_vel1

= zeros([1 24]);

tmp_sortY6 = sort(temp_y6); tmp_vel6

= zeros([1 24]);

%Metode for å sortere elementene for i = 1:1:24 for j = 1:1:24

if (tmp_sortY6(i) == temp_y6(j)) tmp_vel6(i) = temp_vel6(j); end

end for k = 1:1:24 if (tmp_sortY1(i) == temp_y1(k)) tmp_vel1(i) = temp_vel1(k); end end

end hold on

xvi

(15)

title('Simulering: lufthastighetsprofil i forhold til tunnelhøyde') xlabel('\fontname{Futura} Tunnelhøyde ved senterlinje h [m]')

ylabel('\fontname{Futura} Lufthastighet [m/s]')

plot(tmp_sortY1(2:24), tmp_vel1(2:24)); plot(tmp_sortY1(2:24), tmp_vel1(2:24),'o');

plot(tmp_sortY6(2:24), tmp_vel6(2:24));

plot(tmp_sortY6(2:24), tmp_vel6(2:24),'o'), grid on;

hold off

legend('1 ventilator i drift','Datapunkter - 1 ventilator i drift', '6 ventilator i drift','Datapunkter - 6 ventilator i drift');

Miniatyrmodell: prosentandel av lufthastighet og antall vifter

xvii

(16)

Simulering: prosentandel av lufthastighet og antall vifter

pro_sim = zeros(1,6);

pro_SIMmax = Sim_avgVel(7);

anV_Sim = linspace(1,6,6);

temp_vel = Sim_avgVel(2:7);

for p = 1:1:6

pro_sim(p) = (temp_vel(p)*100)./pro_SIMmax;

%pro_antSim(p) = (anV_Sim(p)*100)./6;

end

x = linspace(1,6,6);

[p,S] = polyfit(x,pro_sim,4) %Tilpasset polynom til grafen x1 = linspace(1,6);

f1 = polyval(p,x1);

hold on

title('\fontname{Futura} Simulering: Hvor mye av total lufthastighet ventilatorene gir i prosent')

xlabel('\fontname{Futura} Antall ventilatorer [n]') ylabel('\fontname{Futura} Lufthastighet [%]')

plot(linspace(1,6,100), f1,'Color',[0.0549,0.352,0.584]), grid on;

plot(anV_Sim, pro_sim,'o'), grid on;

hold off

legend('Datapunkter: gjennomsnittlig lufthastighet', '4. grads polynom');

xviii

(17)

Miniatyrmodell: lufthastighet og plassering av viftene

v_fan1 = [0, 0.025, 0.05, 0.20, 0.25, 0.29, 0.30, 0.35, 0.40, 0.425, 0.40, 0.37, 0.325, 0.30, 0.325, 0.35, 0.35, 0.37, 0.39, 0.395, 0.40, 0.425 ,0.40, 0.39, 0.39, 0.35]; v_fan2 = [0, 0.07, 0.15, 0.20, 0.23, 0.27, 0.325, 0.34, 0.35, 0.36, 0.36, 0.38, 0.40, 0.40, 0.40, 0.40, 0.35, 0.33, 0.32, 0.32, 0.33, 0.33, 0.33, 0.30, 0.30, 0.30];

v_fan3 = [0, 0.025, 0.05, 0.25, 0.26, 0.30, 0.30, 0.325, 0.35, 0.37, 0.40, 0.40, 0.37, 0.35, 0.36, 0.37, 0.39, 0.40, 0.41, 0.41, 0.40, 0.40, 0.41, 0.41, 0.40, 0.40]; v_fan4 = [0, 0.10, 0.15, 0.25, 0.30, 0.45, 0.43, 0.43, 0.45, 0.42, 0.40, 0.44, 0.45, 0.42, 0.42, 0.40, 0.40, 0.45, 0.45, 0.44, 0.40, 0.37, 0.35, 0.36, 0.40, 0.40];

v_fan5 = [0, 0.025, 0.15, 0.20, 0.21, 0.27, 0.33, 0.30, 0.30, 0.25, 0.26, 0.30, 0.35, 0.30, 0.34, 0.30, 0.30, 0.35, 0.35, 0.34, 0.33, 0.31, 0.30, 0.30, 0.30, 0.30]; v_fan6 = [0, 0.025, 0.10, 0.17, 0.25, 0.30, 0.29, 0.31, 0.32, 0.30, 0.325, 0.325, 0.30, 0.29, 0.27 0.26, 0.25, 0.30, 0.27, 0.25, 0.22, 0.20, 0.25, 0.27 ,0.30, 0.30]; t = linspace(0,120,26);

figure(1);

hold on

title('\fontname{Futura} Miniatyrmodell: Lufthastighet for aktivering av en enkel impulsvifte');

xlabel('\fontname{Futura} Tid [s]')

ylabel('\fontname{Futura} Lufthastighet [m/s]') plot(t, v_fan1); plot(t, v_fan3); plot(t, v_fan5), grid on; hold off legend('Vifte 1','Vifte 3','Vifte 5');

figure(2);

hold on

title('\fontname{Futura} Miniatyr-modell: Lufthastighet for aktivering av en enkel impulsvifte');

xlabel('\fontname{Futura} Tid [s]');

ylabel('\fontname{Futura} Lufthastighet [m/s]');

plot(t, v_fan2); plot(t, v_fan4); plot(t, v_fan6), grid on; hold off legend('Vifte 2','Vifte 4','Vifte 6');

figure(3);

hold on

title('\fontname{Futura} Miniatyr-modell: Lufthastighet for aktivering av en enkel impulsvifte');

xlabel('\fontname{Futura} Tid [s]');

ylabel('\fontname{Futura} Lufthastighet [m/s]');

plot(t, v_fan1); plot(t, v_fan2);

plot(t, v_fan3); plot(t, v_fan4); plot(t, v_fan5); plot(t, v_fan6), grid on; hold off legend('Vifte 1','Vifte 2','Vifte 3','Vifte 4','Vifte 5','Vifte 6');

xix

(18)

Vedlegg 5

Vedlegg 5 viser kildekoden for styringsystemet som er implementert med bruk av CodeSys.

xx

(19)

STYRINGSPROGRAM KODE:

PLS-kode for styringsystemet

xxi

(20)

xxii

(21)

xxiii

(22)

xxiv

(23)

xxv

(24)

Topp_styring (SFC)

xxvi

(25)

xxvii

(26)

xxviii

(27)

xxix

(28)

Aksjoner Topp_styring ALL_FAN_OFF

AntiWindUp

xxx

(29)

Auto_FanControl

xxxi

(30)

Handle_error

Handle_I2C_ERROR_entry

Init_entry

xxxii

(31)

MAN_FanControl

xxxiii

(32)

ON_ERROR_entry

ON_Fire

ON_STOP_entry

ON_trinn0

xxxiv

(33)

ON_trinn1

ON_trinn2

ON_trinn3

ON_trinn4

OP_KLAR_entry

xxxv

(34)

PI_reg

xxxvi

(35)

sensor_AirVel

CountCompute

xxxvii

(36)

xxxviii

(37)

xxxix

(38)

Set_GP_Trinn

xl

(39)

xli

(40)

Sort_6FanTime

Test_I2C_COM

Time_Hysterese

xlii

(41)

Track_FanTime

xliii

(42)

xliv

(43)

xlv

(44)

xlvi

(45)

Funksjonsblokker Check_Atmega

xlvii

(46)

Counter

xlviii

(47)

Sorter

xlix

(48)

l

(49)

li

(50)

Selector

lii

(51)

FanControl

liii

(52)

liv

(53)

RealToUsint

Sample

Scale

lv

(54)

serialCom

lvi

(55)

lvii

(56)

lviii

(57)

Library Atmega Atmega

lix

(58)

Method Atmega: BeforeWriteOuputs

lx

(59)

lxi

(60)

lxii

(61)

Vedlegg 6

Link til datablader

4-pins PWM-vifte:

https://www.sanyodenki.com/archive/document/product/cooling/catalog_

E_pdf/San_Ace_40GA20_E.pdf 3-pins vifte:

http://www.nmbtc.com/content/pdfs/04015SS_Sleeve.pdf ATmega328p:

http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_

Datasheet.pdf Raspberry PI 3B:

https://www.raspberrypi.org/documentation/hardware/raspberrypi/README.

md

GILL Windobserver:

http://www.gillinstruments.com/data/datasheets/1390-0030%20Iss%204%

20WindObserver%20II.pdfCROSSFLOW:

http://instrumentcompaniet.no.108.bysant.com/files/Tunnelsensors/CROSSFLOWV1_

0.pdf PI_tFL-US:

http://wpstatic.idium.no/www.houm.no/2016/09/DatabladPI_tFL-US_EN.

pdf

lxiii

(62)

Vedlegg 7

Navier-Stokes likningene

Dette vedlegget gir en mer detaljert beskrivelese på Navier-Stokes likningene og hvordan man utleder disse likningene. Beskrivelse av bevaring av energi er ikke tatt med, da dette ikke er brukt i simuleringene. Til innformasjonen som står her er (Anderson 1995) brukt som kilde og hentet fra s. 39 til s. 80.

Begrepsforklaringer rettet mot forståelse av CDF og utledning av ligninger:

Del-operator - ∇= xi+ yj + zk

Enhetsvektor - En vektor med lengde lik 1 og betegnes vanligvis som: î+ˆj+ˆk

Kartesisk koordinatersystem - Spesifiserer et punkt (x,y,z) som ligger i et tre- dimensjonal rom

Vektorfelt - Knytter en vektor til hvert punkt i rommet og beskrives vanligvis med fet skrift Substantial derivative - D/Dt

Local derivative - ∂ /∂t

Convective derivative - V· ∇

CFD baserer seg på tre grunnleggende fysiske naturlover som omhandler bevegelses- mengde og bevaring av masse og energi. (Anderson 1995):

1. Masse er bevart

2. Newtons andre lov, F =ma 3. Energi er bevart

Disse tre naturlovene danner basisen for et med sett partielle differensialligninger som kalles Navier-Stokes ligningene, - fra engelskmannen G. Stokes og M. Navier som separat utleddet disse ligningen på begynnelsen av 19-hundrettallet (Anderson 1995).

Disse partielle differensialligningene kan beskrive bevaring av masse og moment i x, y, z-retning for en ujevn, tre-dimensjonal, kompressibel strømning.

Væsker og gasser er ikke solide legemer som både kan deformeres og ha forskjellig hastighet, temperatur og trykk fra en plass til en annen. Et eksempel er ventilasjon i tunneler der luft drass inn gjennom tunnelåpningen med bruk av ventilatorene og blir påvirket av blant annet av selve ventilatorene, trafikk og andre gjenstander. For å beskrive strømningsegenskapene til væsker og gasser bruker man et fluidelement som er uendeliglite, men stort nok til at det inneholder et større antall molekyler. Dette fluidelementet er avgrenset til et kontrollvolum med en kontrolloverflate S. Denne overflaten er en lukket flate som omgir volumetV. og hvor figur 0.5 viser en skisse av´ dette fluidelementet. (Anderson 1995)

Fluidelementet består av lengdene dx, dy, dz og har et differensialvolumd´V. Vektorfelt beskrives med fet skrift. For et fluidelement som beveger seg med strømningen

lxiv

(63)

Figur 0.5:Figuren viser en skisse av et fluidelement som har differensiallengdene dx, dy og dz. Tegnet av T. Myrvang 14. mars 2018.Kilde:(Anderson 1995)

gjennom kartesiske rom-koordinater beskriver man hastigheten som et vektorfelt:

V=ui+vj+wk der:

u=u(x,y,z,t) v=v(x,y,z,t) w =w(x,y,z,t)

De tre naturlovene anvendes til ligninger som er utredet fra enten fluider som strømmer gjennom kontrollvolumet og over kontrolloverflaten S, eller direkte på det uendelig lite fluidelementet med differensialvolumetd´V. Man bruker to begreper for hvordan man utreder disse ligningene; Conservation-form og Non-conservation- form.(Anderson 1995)

Conservation- ligninger for fluider i et stasjonær kontrollvolum/fluidelement Non-conservation- ligninger for et kontrollvolum/fluidelement som beve- ger seg med strømningen

Basert på disse to begrepene kan man utlede ligningene på fire forskjellige måter.

• Se på strømninger gjennom et endelig stasjonær kontrollvolum

• Se på et stasjonær uendelig lite fluidelement

• Se på et kontrollvolum med en bestemt masse som beveger seg med strømmin- gen

lxv

(64)

• Et uendelig lite fluidelement som beveger seg med strømningen

Om man utreder ligningene via et kontrollvolum vil disse være på integralform og hvis ligningene er utredet gjennom fluidelementet vil de være på differensialform. Innenfor CFD er det tre fysiske begreper som går igjen;D/Dt,∂ /∂t,V· ∇

D/Dt - substantial derivativeog er momentane endringen over tid for en

vilkårlig strømningsvariabel, for eksempel temperatur DT/Dt eller trykk Dp/Dt.

∂ /∂t - local derivativeog er endring av en vilkårlig strømningsvariabel over tid ved et gitt punkt.

V· ∇ - convective derivativeog er fysisk relatert til

endringen av bevegelsen og egenskapene til ett strømningselement som beveger seg fra et strømningsfelt til et annet.

Ut fra disse tre utrykkene kan man beskrive den momentane endringen av en vilkårlig strømningsvariabelFsom:

DF Dt = ∂F

∂t +V· ∇

Figur 0.6:Figuren viser en visualisering av D/Dt -substantial derivativeog beskriver at den momentane endringen av egenskapene til et legeme er lik den lokale endring av egneskapene til legemet ved et gitt tidspunkt, pluss endring av egenskapene til legemet når det beveger seg fra et punkt til et annet. Tegnet av T. Myrvang 14. mars 2018.Kilde:(Anderson 1995)

lxvi

(65)

Kontinuitetslikning for bevaring av masse

Netto massestrømming ut av et elementet er lik endringen av masse i elementet.

Massestrømming er gitt som:

(massetetthet)×(Areal av overflate)×(Hastighetsvektor vinkelrett på overflaten) Massestrømning gjennom den ene overflaten til fluidelementet parallelt med x-aksen er gitt som: (ρu)d y dz. På grunn av at både hastighetskomponenten og tetthet er funksjoner av både tid og rom vil massestrømningen på den andre siden vær ulik den andre. Differansen til massestrømningen gjennom disse to overflatene vil være:

∂ ρu

x

Massen til et fluidelement er gitt som

ρd x d y dz

Endringen av masse i et stasjonært fluidelement er da gitt som:

∂ ρ

∂td x d y dz

Dette resulterer i at minkingen av masse i fluidelementet er gitt som:

•∂ ρu

∂x +∂ ρu

∂y +∂ ρu

∂z

˜

d x d y dz=−∂ ρ

∂t d x d y dz

Venstre siden av likningen blir det samme som∇·(ρV)og man kan uttrykke minkingen av masse som:

∂ ρ

∂t +∇ ·(ρV) =0

Denne likningen er en partiell differensiallikning av et stasjonær fluidelement og er på Conservation-form. For et fluidelement som beveger seg med strømningen vil likningen være på ikke-konservert form og er gitt som:

Dt +ρ∇ ·V=0

(Anderson 1995)

lxvii

(66)

Bevegelseslikning: Newtons 2.lov

F=ma

Summen av alle krefter som virker på et fluidelement er lik massen til fluidelementet multiplisert med akselrasjon. Massen til et fluidelement er gitt som:

m=ρd x d y dz

For et fluidelementet som akselerer i en bestemt retning n, er akselrasjonen an er lik den momentane endringen av hastighetskomponentenVn:

an= DVn Dt En kraft i retning n er da gitt som:

Fn= DVn

DTρd x d y dz

Man pleier vanligvis å dele inn kreftene som virker på fluidelementet inn i to typer kraftkilder:

Tiltrekningskrefter

Dette kan for eksempel være gravitasjonskraft eller et elektromagnetisk felt.

Overflatekrefter

Dette er krefter som virker direkte på overflaten til fluidelementet. Dette kan for eksempel være statisk trykk som er gitt som:Kraft=trykk×areal

For et fluidelement tilsvarer en slik overflatekraft i x-retning over overflaten dydz:

Fxt r y kk=pd y dz

To andre overflatekrefter som virker på fluidelementet er skjærspenning τi j og normalspenning τii. Leger inn et bilde som ilustrerer dette Skjærspenning er relatert til endringen av deformasjonen av et fluidelement. Dette betyr at en skjærspenning i j-retning virker på et plan vinkelrett til i-retningen. For eksempel er skjærspenningen τx y en spenning som er parallell til x-aksen som virker på et plan vinkelrett til y- aksen. Normalspenning til et fluidelement er relatert til endringen av volumet til fluidelementet.τx x

lxviii

(67)

Summen av alle krefter i x-retning:

Fx =

∂p

∂x +∂ τx x

∂x +∂ τy x

∂y +∂ τz x

∂z

d x d y dz+p fxd x d y dz

Der summen av alle kontaktkrefter er:

∂p

∂x +∂ τx x

∂x +∂ τy x

∂y +∂ τz x

∂z

d x d y dz Og tiltrekningskrefter er:

p fxd x d y dz

For et fluidelement som beveger seg med strømningen vil summen av alle krefter i x-retning være påNon-conservationform og være gitt med bruk avax = DTDu:

Du

DTρd x d y dz=

∂p

∂x +∂ τx x

∂x +∂ τy x

∂y +∂ τz x

∂z

d x d y dz+p fxd x d y dz

ρDu

DT =−∂p

∂x +∂ τx x

∂x +∂ τy x

∂y +∂ τz x

∂z +p fx Akselrasjonen i y-retning blir:

ρDv

DT =−∂p

∂y +∂ τx y

∂x +∂ τy y

∂y +∂ τz y

∂z +p fy Akselrasjonen i z-retning blir:

ρDw

DT =−∂p

∂z +∂ τxz

∂x +∂ τyz

∂y +∂ τzz

∂z +p fz (Anderson 1995)

lxix

(68)

Basert på hvordan man utreder disse ligningene vil deler av Navier-Stokes ligningene som beskriver bevaring av masse og moment i x, y, z-retning for en ujevn, tre- dimensjonal strømning være gitt som: (Anderson 1995)

Kontinuitetsligning for bevaring av masse:

Conservation:

∂ ρ

∂t +∇ ·(ρV) =0

Non-conservation:

Dt +ρ∇ ·V=0

Bevegelsesligningen:

Non-conservation:

Akselrasjonen i x-retning:

ρDu

DT =−∂p

∂x +∂ τx x

∂x +∂ τy x

∂y +∂ τz x

∂z +ρfx Akselrasjonen i y-retning:

ρDv

DT =−∂p

∂y +∂ τx y

∂x +∂ τy y

∂y +∂ τz y

∂z +ρfy Akselrasjonen i z-retning:

ρDw

DT =−∂p

∂z +∂ τxz

∂x +∂ τyz

∂y +∂ τzz

∂z +ρfz

lxx

(69)

Vedlegg 8

I2C

Dette vedlegget gir en detaljert beskriver I2C protokollen. Innformasjonen som er beskrevet her er hentet fra databladet til mikrokontrolleren Atmega328p.

I2C eller TWI - Two-Wire Serial Interface er en kommunikasjonsprotokoll som brukes blant annet til å koble sammen lavhastighets enheter som sånn mikrokontrollere og sensorer. Protokollen støtter tilkobling av opptil 128 forskjellige enheter med bruk av to retningsbestemte databus-linjer, den ene for klokkesignal (SCL) og den andre for data (SDA).Atmel 2018

Figur 0.7:Figur viser hvordan enheter er koblet til I2C-databusen

Bus-driverne til alle enheter som støtter I2C er entenopen-drainelleropen-collectorog gjør at bus-linjen har en AND-funksjonalitet. Av eksterne komponenter trenger bus- linjen kun to eksterne pull-up motstandere, der begge linjene er koplet til en positiv spenning gjennom pull-up motstanderne. For logiske spenningsignaler gjelder:

Logisk 0 er når en eller flere enheter trekker utgangen lav.

Logisk 1 er når alle enheter trekke sine utganger høy.

Protokollen bruker Slave-Master kommunikasjon, hvor det er enheten som er satt til Master som styrer dataoverføringen og er ansvarlig for generering av klokkesignalet.

Overføringen skjer med bruk av datapakker og en dataramme til en slik pakke er generelt 9-bit lang og består av et start-bit og et stopp-bit.Atmel 2018

En bit med data overføres med bruk av SDA-linjen og er ledsaget av en klokkepuls på SCL-linjen og hvor SDA-linjen må være stabil når SCL-linjen er logisk høy. Ett unntak til dette er når en Masterenhet vil starte eller stoppe en overføring. Atmel 2018 En dataoverføring starter når en Masterenhet genererer en start-betingelse(START) på bus-linjen og blir avsluttet når Masterenhet genererer en stopp-betingelse(STOP).Atmel 2018

Start-betingelsen skjer når SDA-linjen går fra logisk 1 til logisk 0 når klokkepulsen trekker SCL-linjen høy og lignede brukes for stopp-betingelsen der SDA-linjen gjør det

lxxi

(70)

Figur 0.8:Overføring av en bit

motsatte og går fra logisk 0 til logisk 1. Mellom START og STOP er bus-linjen betraktet som opptatt.Atmel 2018

En særskilt tilstand skjer når en ny START blir sendt mellom en tidligere START og STOP. Dette er referert som en gjentagende start-betingelse (REPEATED START) og brukes når Masterenheten vil starte en ny overføring uten å miste kontroll over bus- linjen. Når en REPEATED START blir sendt er bus-linjen betraktet som opptatt til en ny STOP genereres.Atmel 2018

Figur 0.9:Betingelser for overføring av data

Generelt består dataoverføringen av to pakkeformater; en adresse-pakke og en data- pakke. Begge pakkene er 9-bit lang og hvor den siste biten (MSB) brukes som et kvitteringsbit (ACK -acknowledge).Atmel 2018

En Adresse-pakke består av 7 adresse bits, 1 READ/WRITE bit og 1 ACK- bit.

En data-pakke består av 1 databyte og 1 ACK-bit.

Kvitteringsbitet brukes av Slaveenheter for å kvittere på at de har blitt adressert av en Masterenhet og kvittering på at Slaveenheten har motatt eller sendt data.

Slaveenheten signaliserer en slik kvittering med å trekke SDA-linjen på den niende klokkesyklusen. Et NACK signal genereres hvis Slaveenheten holder SDA-linjen høy etter den niende klokkesyklusen. Dette brukes for å informere Masterenheten at Slaveenheten, av enn eller annen grunn, ikke kan motta flere bytes.Atmel 2018 READ/WRITE bitet til en adresse-pakke brukes til å signalisere om en Slaveenhet skal lese eller skrive data. Når dette bitet er satt vil enheten utføre en lese-operasjon

lxxii

(71)

og ellers vil den utføre en skrive-operasjon.En typisk data-overføring inkluderer en adresse-pakke etterfulgt av en data-pakke.Atmel 2018 Figur 0.10 viser formatet til en slik dataoverføring.

Figur 0.10:Formatet til en dataoverføring

lxxiii

(72)

Både Raspberry PI 3 og Atmega328P støtter I2C. Mikrokontrolleren Atmega328p kan operere i fire forskjellige overføringsmoduser; Master avsender, Master mottaker, Slave avsender og Slave mottaker.

Atmega-kontrolleren har innebygd fire forskjellige moduler for bruk til I2C- kommunikasjon;

Bus Interface Unit.

Bit Rate Generator.

Address Match Unit.

Control Unit.

Den har fem dataregistrere for styring og status til I2C-kommunikasjon;

TWBR - TWI Bit Rate.

TWCR - TWI Control Register.

TWDR - TWI Status Register.

TWAR - TWI Adress Register.

lxxiv

(73)

Vedlegg 9

Vedlegg 9 viser budsjettet for innkjøp av deler til miniatyrmodellen.

lxxv

(74)

2 000 kr

800 kr

400 kr

300 kr

3 500 kr

Skruer, muttere og div Totalt

Budsjett miniatyrmodell

Rør og nippler PC-vifter

Gjengestang og andre deler til montering av viftegrupper

lxxvi

(75)

Vedlegg 10

Vedlegg 10 viser kildekoden for viftestyringen. Koden er for mikrokontrolleren Atmega328p og implementert med bruk av AVR C-kode.

lxxvii

(76)

#include <stdlib.h>

#include <stdint.h>

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

#include <util/twi.h>

#include <compat/twi.h>

#define F_CPU 16000000

#define SLAVE_ADDRESS 0x04 //TWBR - TWI Bit Rate

//TWCR - TWI Control Register //TWSR - TWI Status Register

//TWDR - TWI Data Register, contains the last byte present on the bus //TWAR - TWI Adress Register

//TW_SR_DATA_ACK: data received, ACK returned //TW_ST_SLA_ACK: SLA+R received, ACK returned //TW_ST_DATA_ACK: data transmitted, ACK received // TW_BUS_ERROR: illegal start or stop condition uint8_t data_byte; //1 byte of data

uint8_t data_buffer [22];

volatile unsigned char bufcntr = 0;

volatile bool start_buff = 0;

volatile bool end_buff = 0;

volatile bool start_pros = 0;

volatile bool I2C_op = 0;

int In_7,In_8,In_9, Out;

int counter = 0;

void TC0_Timer() {

TCCR0A = 0x00; //WGM02,01,00 = 0;

TCCR0B = 0x03; //Prescale = 64

TIMSK0 = 0x01; //Overflow interrupt enabe

TCNT0 = 0x05; //start count at 5 to 255 => f_top = 1000 Hz => count = 1000 => 1 s

}

void T1_fastPWM(){

//fast PWM

TCCR1A = 0b10100010; //WGM11-10 = 10, non-invrt

TCCR1B = 0b10011001; //0b10011010; prescale 1 WGM13-12 = 11

ICR1 = 625; //Periode mellom hver puls: 40 us }

void T2_fastPWM() {

TCCR2A = 0b10000011; //WGM21 - WGM20 = 11 TCCR2B = 0b00000010;

lxxviii

(77)

}

void TWI_init() {

TWAR = (SLAVE_ADDRESS<<1); //slave address 0x04 TWCR = TWCR|0b01000101;

} /*

ISR(TIMER0_OVF_vect) {

if(I2C_op == 0) {

counter++;

}

if (counter > 10000){reset_OP();}//Timeout = 10s

}

*/

ISR(TWI_vect) {

switch(TW_STATUS) {

case TW_SR_DATA_ACK: //data received, ACK returned I2C_op = 1;

data_byte = TWDR;

read_to_buffer(data_byte);

TWCR = TWCR|0b01000000; //TWI enable Acknowledge break;

case TW_ST_SLA_ACK: //SLA+R received, ACK returned I2C_op = 1;

TWDR = data_byte;

TWCR = TWCR|0b01000000;

break;

case TW_ST_DATA_ACK: //data transmitted, ACK received I2C_op = 1;

TWDR = data_byte;

TWCR = TWCR|0b01000000;

break;

case TW_BUS_ERROR: //illegal start or stop condition I2C_op = 0;

TWI_error(); //Go to error TWCR = TWCR|0b01010000;

break;

default:

I2C_op = 0;

TWCR = TWCR|0b01000000;

break;

} }

uint8_t read_to_buffer(uint8_t data_byte) //Lagring av data i array

lxxix

(78)

{

if (data_byte == 142){ // starte lagring av data start_buff = 1;

end_buff = 0;

}

else if (data_byte == 169){ //stoppe lagring av data start_buff = 0;

end_buff = 1;

bufcntr = 0;

}

if(start_buff == 1 && end_buff == 0 && data_byte != 142 && data_byte !=

185){

data_buffer[bufcntr] = data_byte; //Lagring av hvert byte.

bufcntr++;

}

else if((start_buff == 0 && end_buff == 1 && data_byte == 169) ||

data_byte == 185){

bufcntr = 0;

} }

void TWI_error() // Ved case TW_BUS_ERROR - håndtering av feil {

TWCR = TWCR&0b00000000;

TWCR = TWCR|0b01000101;

TWDR = 113;

reset_OP();

}

int Scale(int In, int MaxOut, int MinOut, int MaxIn, int MinIn)

//Skaleringsfunksjon. Brukt for skalere 0 - 100 til respektive OCRnA/B verdier

{

float K;

K = float(MaxOut-MinOut)/float(MaxIn-MinIn);

Out= int(K*In-K*MinIn+MinOut);

return Out;

}

void reset_OP() //Funksjon som brukes for å resete viftene.

{

data_buffer[1] = 110;

data_buffer[3] = 120;

data_buffer[5] = 130;

data_buffer[7] = 140;

data_buffer[9] = 150;

data_buffer[11] = 160;

data_buffer[13] = 170;

data_buffer[16] = 180;

data_buffer[19] = 190;

TCCR1A = TCCR1A&0b01111111; //OC1A disconnected TCCR1A = TCCR1A&0b11011111; //OC1B disconnected TCCR2A = TCCR2A & 0b01111111; //OC2A disconnected //counter = 0;

}

lxxx

(79)

int main(void) {

DDRD = DDRD|0b11111100; //PD0 - PD7 Impuls vifte

DDRB = DDRB|0b00111111; // PB0, PB4, PB5 PWM vifte, PWM: PB1, PB2, PB3 TC0_Timer();

T1_fastPWM();

T2_fastPWM();

TWI_init();

reset_OP();

sei();

while(1) {

if ((data_buffer[0] == 101) && (data_buffer[1] == 110)){PORTD = PORTD

& 0b11111011;} //PD0 -vifte 1 AV

if ((data_buffer[0] == 101) && (data_buffer[1] == 111)){PORTD = PORTD|0b00000100;} //PD0 -vifte 1 PÅ

if ((data_buffer[2] == 102) && (data_buffer[3] == 120)){PORTD = PORTD

& (0b11110111);} //PD1 -vifte 2 AV

if ((data_buffer[2] == 102) && (data_buffer[3] == 121)){PORTD = PORTD|0b00001000;} //PD1 -vifte 2 PÅ

if ((data_buffer[4] == 103) && (data_buffer[5] == 130)){PORTD = PORTD

& 0b11101111;} //PD2 -vifte 3 AV

if ((data_buffer[4] == 103) && (data_buffer[5] == 131)){PORTD = PORTD|0b00010000;} //PD2 -vifte 3 PÅ

if ((data_buffer[6] == 104) && (data_buffer[7] == 140)){PORTD = PORTD

& 0b11011111;} //PD3 -vifte 4 AV

if ((data_buffer[6] == 104) && (data_buffer[7] == 141)){PORTD = PORTD|0b00100000;} //PD3 -vifte 4 PÅ

if ((data_buffer[8] == 105) && (data_buffer[9] == 150)){PORTD = PORTD

& 0b10111111;} //PD4 -vifte 5 AV

if ((data_buffer[8] == 105) && (data_buffer[9] == 151)){PORTD = PORTD|0b01000000;} //PD4 -vifte 5 PÅ

if ((data_buffer[10] == 106) && (data_buffer[11] == 160)){PORTD = PORTD & 0b01111111;} //PD5 -vifte 6 AV

if ((data_buffer[10] == 106) && (data_buffer[11] == 161)){PORTD = PORTD|0b10000000;} //PD5 -vifte 6 PÅ

if ((data_buffer[12] == 107) && (data_buffer[13] == 170))//PB0 -vifte 7 AV

{

PORTB = PORTB & 0b11111110;

TCCR1A = TCCR1A&0b01111111; //OC1A disconnected In_7 = 0;

}

if ((data_buffer[12] == 107) && (data_buffer[13] == 171))//PB0 -vifte 7 PÅ

{

PORTB = PORTB|0b00000001;

TCCR1A = TCCR1A|0b10000000; //OC1A Activated, OC1A compare macth In_7 = data_buffer[14];

}

if ((data_buffer[15] == 108) && (data_buffer[16] == 180))//PB4 -vifte 8 AV

{

lxxxi

(80)

PORTB = PORTB & 0b11101111;

TCCR1A = TCCR1A & 0b11011111; //OC1B disconnected In_8 = 0;

}

if ((data_buffer[15] == 108) && (data_buffer[16] == 181))//PB4 -vifte 8 PÅ

{

PORTB = PORTB|0b00010000;

TCCR1A = TCCR1A|0b00100000; //OC1B Activated, OC1B compare macth In_8 = data_buffer[17];

}

if ((data_buffer[18] == 109) && (data_buffer[19] == 190))//PB5 -vifte 9 AV

{

PORTB = PORTB & 0b11011111;

TCCR2A = TCCR2A & 0b01111111; //OC2A disconnected In_9 = 0;

}

if ((data_buffer[18] == 109) && (data_buffer[19] == 191)) //PB5 - vifte 9 PÅ

{

PORTB = PORTB|0b00100000;

TCCR2A = TCCR2A|0b10000000; //OC2A Activated, OC2A compare macth In_9 = data_buffer[20];

}

OCR1A = Scale(In_7,600,10,100,0); //PWM styring vifte 7 OCR1B = Scale(In_8,600,10,100,0); //PWM styring vifte 8 OCR2A = Scale(In_9,250,10,100,0);

if(data_byte == 185){reset_OP();}

//if(I2C_op == 1){counter = 0;}

} }

lxxxii

Referanser

RELATERTE DOKUMENTER