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
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
Figur 0.1: Figuren viser et bildeutsnitt fra Excelarket der det ble notert verdier på målinger av lufthastigheten i miniatyrmodellen
v
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
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
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
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
Vedlegg 4
Vedlegg 4 viser MATLAB kodene som er brukt for behandle data fra simuleringene og måledata fra miniatyrmodellen.
x
MATLAB KODE:
Følger samme kronologiske rekkefølge som kapittel 3.3 Analyse fra tester og simuleringer.
Miniatyrmodell: gjennomsnittlig lufthastighet og antall vifter
xi
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
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
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
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
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
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
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
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
Vedlegg 5
Vedlegg 5 viser kildekoden for styringsystemet som er implementert med bruk av CodeSys.
xx
STYRINGSPROGRAM KODE:
PLS-kode for styringsystemet
xxi
xxii
xxiii
xxiv
xxv
Topp_styring (SFC)
xxvi
xxvii
xxviii
xxix
Aksjoner Topp_styring ALL_FAN_OFF
AntiWindUp
xxx
Auto_FanControl
xxxi
Handle_error
Handle_I2C_ERROR_entry
Init_entry
xxxii
MAN_FanControl
xxxiii
ON_ERROR_entry
ON_Fire
ON_STOP_entry
ON_trinn0
xxxiv
ON_trinn1
ON_trinn2
ON_trinn3
ON_trinn4
OP_KLAR_entry
xxxv
PI_reg
xxxvi
sensor_AirVel
CountCompute
xxxvii
xxxviii
xxxix
Set_GP_Trinn
xl
xli
Sort_6FanTime
Test_I2C_COM
Time_Hysterese
xlii
Track_FanTime
xliii
xliv
xlv
xlvi
Funksjonsblokker Check_Atmega
xlvii
Counter
xlviii
Sorter
xlix
l
li
Selector
lii
FanControl
liii
liv
RealToUsint
Sample
Scale
lv
serialCom
lvi
lvii
lviii
Library Atmega Atmega
lix
Method Atmega: BeforeWriteOuputs
lx
lxi
lxii
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.
lxiii
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 kontrollvolumV´ 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
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 V´ 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
• 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
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:
Dρ
Dt +ρ∇ ·V=0
(Anderson 1995)
lxvii
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:
Fx−t 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
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
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:
Dρ
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
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
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
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
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
Vedlegg 9
Vedlegg 9 viser budsjettet for innkjøp av deler til miniatyrmodellen.
lxxv
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
Vedlegg 10
Vedlegg 10 viser kildekoden for viftestyringen. Koden er for mikrokontrolleren Atmega328p og implementert med bruk av AVR C-kode.
lxxvii
#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
}
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
{
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
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
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