From 75bed2051120d4d25fcf1da9351e5e4222a91b45 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Thu, 13 Nov 2025 09:38:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BC=D0=BE=D0=BD=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=D0=B0=20=D1=81=D0=B5=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MATLAB/MCU_Wrapper/run_mex.bat | 26 ++-- MATLAB/app_wrapper/app_includes.h | 1 + MATLAB/app_wrapper/app_io.c | 27 ++--- MATLAB/upp_r2023.slx | Bin 68022 -> 67893 bytes UPP/Core/Configs/upp_config.h | 5 +- UPP/Core/PowerMonitor/adc_tools.c | 30 +++-- UPP/Core/PowerMonitor/adc_tools.h | 56 ++++++--- UPP/Core/PowerMonitor/power_monitor.c | 63 ++++++++++ UPP/Core/PowerMonitor/power_monitor.h | 32 +++++ UPP/Core/Src/tim.c | 2 +- UPP/Core/UPP/upp_main.c | 42 +------ UPP/Core/UPP/upp_main.h | 4 +- UPP/MDK-ARM/UPP.uvoptx | 164 +++++++++++++++----------- UPP/MDK-ARM/UPP.uvprojx | 16 +++ UPP/UPP.ioc | 2 +- 15 files changed, 306 insertions(+), 164 deletions(-) create mode 100644 UPP/Core/PowerMonitor/power_monitor.c create mode 100644 UPP/Core/PowerMonitor/power_monitor.h diff --git a/MATLAB/MCU_Wrapper/run_mex.bat b/MATLAB/MCU_Wrapper/run_mex.bat index fcf8cd9..c30c29f 100644 --- a/MATLAB/MCU_Wrapper/run_mex.bat +++ b/MATLAB/MCU_Wrapper/run_mex.bat @@ -1,16 +1,16 @@ @echo off -:: Получаем аргументы из командной строки +:: :: %1 - includes_USER :: %2 - code_USER -:: %3 - режим (например, debug) +:: %3 - (, debug) -:: Аргументы: -:: %1 — includes строка (в кавычках) -:: %2 — sources строка -:: %3 — defines строка -:: %4 — режим компиляции (debug/release) +:: : +:: %1 includes ( ) +:: %2 sources +:: %3 defines +:: %4 (debug/release) -:: Сохраняем как переменные +:: set filename=%~1 set includes_USER=%~2 set code_USER=%~3 @@ -18,7 +18,7 @@ set defines_USER=%~4 set defines_CONFIG=%~5 set compil_mode=%~6 -:: Заменяем __EQ__ на = +:: __EQ__ = set defines_USER=%defines_USER:__EQ__==% set defines_CONFIG=%defines_CONFIG:__EQ__==% @@ -29,7 +29,7 @@ set defines_WRAPPER=-D"MATLAB"^ -D"__sizeof_ptr=8" :: -------------------------WRAPPER PATHS AND CODE--------------------------- -:: оболочка, которая будет моделировать работу МК в симулинке +:: , :: WRAPPER BAT START set code_WRAPPER=.\MCU_Wrapper\MCU.c^ .\MCU_Wrapper\mcu_wrapper.c @@ -88,7 +88,7 @@ set defines= %defines_WRAPPER% %defines_CONFIG% %defines_USER% :: -------OUTPUT FOLDER-------- set output= -outdir "." -output %filename% -:: если нужен дебаг, до запускаем run_mex с припиской debug +:: , run_mex debug IF %compil_mode%==debug (set debug= -g) ::------------------------------------------------------------------------- @@ -145,9 +145,9 @@ if "%7"=="echo_enable" ( echo =========================== echo MODE: %compil_mode% echo =========================== -:: 1. ПРЕЖДЕ ЧЕМ КОМПИЛИРОВАТЬ - ВЫГРУЗИТЬ СТАРЫЙ ФАЙЛ +:: 1. - -:: 2. Компиляция с флагами для MSVC +:: 2. MSVC :: set LINK_EMBEDDED=/BASE:0x00000000 /FIXED:NO /FILEALIGN:0x1000 /FORCE:MULTIPLE /DYNAMICBASE:NO set C_EMBEDDED="-w" mex %output% %defines% %includes% %codes% %debug% CFLAGS="$CFLAGS %C_EMBEDDED%" LINKFLAGS="$LINKFLAGS %LINK_EMBEDDED%" diff --git a/MATLAB/app_wrapper/app_includes.h b/MATLAB/app_wrapper/app_includes.h index fed3040..7f49c25 100644 --- a/MATLAB/app_wrapper/app_includes.h +++ b/MATLAB/app_wrapper/app_includes.h @@ -15,6 +15,7 @@ #include "adc.h" #include "upp_main.h" #include "adc_tools.h" +#include "power_monitor.h" // INCLUDES END #endif //_APP_INCLUDES_H_ \ No newline at end of file diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index b7453ab..170e597 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -32,15 +32,12 @@ void ThyristorWrite(real_T* Buffer) */ void app_readInputs(const real_T* Buffer) { // USER APP INPUT START -ADC_Set_Channel_Value(ADC3, 4, ReadInputArray(0,0)); -ADC_Set_Channel_Value(ADC3, 5, ReadInputArray(0,1)); -ADC_Set_Channel_Value(ADC3, 6, ReadInputArray(0,2)); -ADC_Set_Channel_Value(ADC3, 7, ReadInputArray(0,3)); -ADC_Set_Channel_Value(ADC3, 8, ReadInputArray(0,4)); -ADC_Set_Channel_Value(ADC3, 10, ReadInputArray(0,5)); - - -__HAL_TIM_SET_AUTORELOAD(&adc_tim, ReadInputArray(1, 0)); + ADC_Set_Channel_Value(ADC3, 4, ReadInputArray(0,0)); + ADC_Set_Channel_Value(ADC3, 5, ReadInputArray(0,1)); + ADC_Set_Channel_Value(ADC3, 6, ReadInputArray(0,2)); + ADC_Set_Channel_Value(ADC3, 7, ReadInputArray(0,3)); + ADC_Set_Channel_Value(ADC3, 8, ReadInputArray(0,4)); + ADC_Set_Channel_Value(ADC3, 10, ReadInputArray(0,5)); // USER APP INPUT END } @@ -55,14 +52,14 @@ void app_writeOutputBuffer(real_T* Buffer) { //ThyristorWrite(Buffer); for (int i = 0; i < 2; i++) { - WriteOutputArray(ZC_Detected[i], 0, i); + WriteOutputArray(pm.ZC_Detected[i], 0, i); } - extern ADC_Periodic_t adc; - for(int i = 0; i < 6; i++) - { - WriteOutputArray(adc.Data[i], 1, i); - } + extern ADC_Periodic_t adc; + for(int i = 0; i < 6; i++) + { + WriteOutputArray(pm.adc.Data[i], 1, i); + } // USER APP OUTPUT END } \ No newline at end of file diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index e5540e57a0d995d79786ff908bc829251c0c6c34..f6f01faff4219018aabb14b460ce6523fb7300da 100644 GIT binary patch delta 41879 zcmV)8K*qnelLWPr1Q$?C0|YGq000O8001EXw%hAOtzQ5DQ;`=ke|+^ikwz1LoI z&QGj0w-Ji+Qs^ioC=dt){e!fGG6Vv54*Pk52tFB{T8;$2knN>EIYA%@-(f#+ntVgF z5Xei&2MJMC_soMue>Znk(|qBRQ1{%?l;fY zS5~yRx%n;adomA}g-h2`!BaCBl_Y!>d6^V1FFk7FdGo+N63>w)EB57se0$FJDi!ax z;C3r+xA%7IHZyg`uo(h2HnxkEk)4KrczC!iIYL%=xHN=le@8+>0=`p(o|+m5g2;!B zod97QiwF;Y<{uz0Awdg4bEc-IhBL^;#l}X4{LfeZ=PUp7mH#(iiT7-QmypOZUGI-M zIXkne)iE`FHC3&@jQoz;QWzY9^W*pLkC}WfC@Mv=0m`Ml-%SU#1kC0eY_b$N^Dp~E z=)1}*EBk&Wf6`MCoFS_ys46Q5ZVsjxuk}V~em6me80=3~YPNfOBz_;Zq2I$G+M#vd z9?c2UVUZFO3xt-7>E$Xiuz8+;7Pvd8D=903_cs&IFqB^;M#y@mz(hbJAVAjUdGXIx z?I&t?PtR%2(>>DN)v=U;K`yjhe8O-B@qB-I`pY}^6~ z(!ofS-dJgAX^?}_-?|pI{7P=H+34bT+Cn>OyV4s<<3xhwgiF0Vp7JQpF69n ztLIl$Vbs^xOMm<*CMpUC<|Xg%uA-V+NKz7>e@=@l`orCo)Q1nqvUIrTo`Q68>A{Kg z3SyP&>zx4z@zS(JZ$D$jlJTyc!m~knWG-}~?FS#E4^_Y4dm0mLpT zEfxLri8wMU%3)`W%Ea8fz;3yn$6@W+@4-QA9GpOq6+0K6Ny*7w;CR?2Ei7J-WD7>2 ze-g5+9L&~@+^j@2lL(2^cdc`tXAhXwiPGZmKDqw<`BTKwlCeU)-07mN-;~5p-%tBt zJ-nIZ(F`YHg$KULfvvcx2wo&e(N?GE^y&i2K2-W<-H!hMx2nRLwdNv)%vf`g33=m@ z$YnwIB@Sit6b-tAYq6r{pUyJmi={koe+@O6rd);Hyqerkso~)#!oznq56ct@X_G&) z*)9+<;6=LfE;l)CD=8{Yux#fa4K6QZ8uv% z8ZGAdLHru6O7QR4XUo;~b<`kHOiD`qiK!_OmXsbdgm22PA*2%2*bos~oF22fE`u?U zCYXpp6of1$;2j~ve)ISHoeREaf6qfiN>x{HFN}tAIx7C^c`GQXyONvLHHnYdaAmN2 zUo#A)*Ar<}Z$Tio9X7;aZnN=C}K~bzNH2o!FH)4vVcz~m#G6W-L^SwXM@mtn%y*)>Me})uB&Bc`` z?u$6l)^;|sY{;cOcj#?Y`wYw>QG<;aWx0lMG_&?n54l@K=&W_9n4ur$#g&G5L21ax zO@vxawDL*#pe{(04o2N9e3~o@cwegtU#N`SriWRoijw&2MVf4=)AoqLN~hu2zRSp! z%AS^^<4Bj0MaS|Rg|{A3f6-Agy;sY}AzI}AK}a0|T?P=y&rL^KIyxE}8ggXh4?hQ6 zg4=!W3V!?`a%_U1uF?(FB7foM_byrzp}WURwD>PPR$gNxL`kVO^{oXR8ls@3l@%6c zPWZQPc&Zv2tNk(isceRPzSpbs+PVjyq^W9z?@qlh?6Xp=s^0(Eat_X!&}(f|IweC+dEB4J+?7Tw>W z64YI3oWh2k{!}FuOamvY1%_N1il06OywPx6Ij-)Hz}-#dbEz6Il;2>cOGGvwF%c>J z*H@fl8z`v~<*;5ve@(N_c6)gkCzCQl#p{8!wuWPW!_NGjgmAt+y z&r`lx+4yCwSdL%_MuCS1Uoak?p8j!SLe=XUCge6W z5EvR_hsVYuKr}14&Uc-(!xq`qRg+d@xF4hIt)}^)K94us*L|$M0e43&qfN}*+=PTI z8|-8AA5>MDFeo1}v?>W8SY%{@>FJgLAWJ3#h}aAmE{~s3e0?n?-uH=>s)`o=3sKh& z134j5KAB%se}v<6cNvtEL!xy!+)j3S+NPwY23M#Y0f!K}`ls*=z`R4lGi;alzkVUu zZ^W1jG#Mt87vBlkk(cmq8Le#Xm%Yse|zxh&ze;kdxp|bsc<6LTo3Rd zB4%43(1_UZs1sgrWejhUS~$&<9=AMPIt+i!U^CRp(3kcBB;mf5W}dlhZf*`8^eFX+ zh=As~9e*=>vN=0*Vz-|8+&e(e2fa92oW5}}G!)7&FxI6YB~00Ip>g3%@bfURNe zaUFcykr_TwI!}v@nJqTMDV@qk|7i7^X+XY`922%0z*A-*kME zqVx%FIc{(1Y59~LT!hn6lc^Ye{PTb2cb(Mgvqzb~^VzwXHlFY&;~ z-{kSSq>mf)I~z{9-WJyHD^tTX`17rHrpbwZYc%Kh`$3AnZ^Uy{f*%@cy97V@f5ybc zdmQes<6sv-34!nHdmbJmCt_;K3+`7*Nh$RDTH<^UKjz>-7IK;P8)N|@I?2|*ObZJO z%@$YYC9mT)y1TdO>FRO#gb@;B`xhg}a&)*2wu_NNLqmw0MGE?}WoLgX?;h_K$9CTy zddf%j1yYGiQqj@n>5j@w=*5!re}_j#D#!iSVj_s96vl;v6FqeG0gztLH@5!oV|2e;PQOFh;Y+A0Zew@C5HhoD-+Ta+nvMhr@ z6oeo02QE<2(Fc641OpD|uXv%uSza26j%Ibpr>8ywLage}qi|Or2>u z!$Qbvu854Jj`KTaCO~bldqPt$N5Q2Zv2a2C)@KwjX&E5v>hzshSojIiN#w`Ik{4w+ zO`HHagn@b3V)Ejb*WASG5nUCxhZR@v#VNJ+i9Hd4+Z}{TKFPv=U75U@C<)=s*-?b7 zKoAyau-^Ulo1LBA0Rk|He*-7t*&FqRfc$)F@5@;)A|Y?ba$BLY@;B^GTlNB{y?#^z z3ui6=ZiODsX}nMS2m~%BDCeC8JfsMZH|50&$3L%ZZ*Mn5>s3E_?5(h++{H*5OR2_` z^mt!PYK-kVGqAD_B)`!(`6I(>`0L9nU^RMtt`@^A{@RW(O_yu1e+Gvkt*>+mzCd$+ z@ax2nDIx$VaDCJwn99*7G;gk_$I^c9SU#}b=(tHelKHC>@MYi0D#C&g{Wj-$RnMCM zy-%Man6Iadyhp1rL;(B5<`kk}Ti9Czgzr?fRK;G>|e+Xx`K> z@-(~D=EZLD=bJiZvGQxGls7B;`;WGy5DZG8NTq^)8ct4JqgtZE!onArcI`a{noN?0 zhEygT#I_5Ke{iJ}?cYq))d>QFg7U^c8vylXIl;hyhjM*Ws+&EqtdCAfc~yRl?Lu3w z7L6%%Vl9N4_zO(MGbY{UhRtpk2E5|vCb zB6*7Lf2w+n$;P+N)7+#>Q-uf*KNEu3GUU*|zO;_Y;&(GTT4=I4vQZFJv9ZBF>gc$L z^O=h(mir-bXtOuLJ5qgi7A1JAdw%Nh@UvVnRhCY(k|1vI4c^DNK?1xDquX;O3aBE8 z`~XExOP$NE$mnmr=jD?ql?@m`Y%sij9oT2|eLxv(%f zf0f69f|@#?ztK!rCdHQ<1vRSk{$}v>5ZVF>w|~6<1jLd!UE(@muz2ZjJAdhkd3k4d zCf}6Jiui3LNS(|W%lW;=M=6{i(LusE=zq8p-c!=e@wvnnIO)XwIXc<}qrRh-3^=wi z(z;n|00&{S)~@qZRrTBFhy!6V8N==2fAKmjcB?P)N8VXY{c+{j5bb)my$p~tFAtl6 z@%I3rDPT0_ZKoXyHL9gS);0d(dHnI??YF|hcdza0W>5ME^;df%#8U;mh-q;?Byv1m z4-5kOMz80CKn&Q3a#gwf%sZ@SIjk4=JcOUw?feO7x6kvjoFe8t_=|x-&WH2qe^YU$ zAP>3R4m0z}caJl(l=+@+>V>5Mem-T80we@cvo^YJ2Q$G6LN}NcUI$RyK^OWbP~lia zJHAGdIlg=$_xH-)j~;`=isE5(FNK8(`Q45rfOXIII%;w)EuOS|KGvWJ)nuBfUH1v^ zGg@#MAc0&y4^R4?(L>?Fr<-UPe=k`uenV%-)$+8+mN5)7SkkmC%bMZM2m>`^-Q5D3 zmFm|wy5iE(3?n(hK@$@rO&&Lgc7CV{(!s^qo+y5I^UG}RH9pUqA|p}o2nmfl{ox=7 ziP_9rZz%!JU$0a8g(T3>bMa1N3Lo@XRSU+|TT%AajS2-A_JlUI@isc|e<}~Ombgw7 zBDArCa|R$}j36zKN7cD=TmVl`Uu(N)%;U5r9X3_S84?<5G|O={8vk$)AD`y&Jc_`B ztI||<$n>YlrQQWeOi|yeiCG=+VlQwadWkb*&1|Fk;3Fj9%O@inmcC^S)3x6J<2<>z za6!DizcFU>x}>J1n=Aeef56V|bf*Aa+Y-PMaCS@tsOO%7CLEvYrtK%%s;V%2eSNVa zBu0$;jM%>^m(H(8GzWh9LjBW(!+da8L*Hg#qST51qV_M4MyS9cpp$a(EMro5?oa`J z59XVEL_X3}1U!`}by?WI*^JCZS z&C1V&0(QrZ&kzyiFAq<}>QAw8*M^#=pEw88ocdsx|qA19Sx; zPSvf|8wdDN~^1 z=wwqTY3LJibaJ7^b8{pI3%j$LD~I#Ky7L~Qt|MB4t;qzimy^zmsr)52N93ehFm{Z^lAE7!q zTVl|vs)kw5ST?(Xv1{ml^Fc6nJ@ zC*W;h(1XSc616j>x=lD-ZpIk`QJo>FoaPN-<(0`U$}#C~t73GHj_Hrzn~XTpe?Zzf zOGrq#+E*@+3b@xe@n~CxRx)cj)3@LM6DH!^+De^lSkUF3THsZ$YVDXc27)WB<9^cy z&`j&YrGD1M+4%y5th=7D)u+-|I+2Jb)fY#E|@}!^i*q}Su zgNWBLd(b$)V4cm~o^d3rPB{JUf8p5g_;Rk}X4vjz)bH_ZN>2m{*Cf}g=WJ9s7Ky^W zRc#=X$KeG>+Q_=O_^Vg1fFu4gjqsq(!`D|&f5&q^6|$VhN&IuTE!yJmR`cu4_NrJq zXUGVKSL}z_1vyt$znv^EG-ql^&1`RY+;Lb>n8NDGYG}cywe>qHp{1pSe|OZ>a0F4r zqM`{z{8JAkFMGnct+QZjF^gZ1_Y5(dYek;6GFX8D-*#nQMkV~7J3f(Xx9t1k#fyJC zt(Cf&n;CYl&4)~zzo#mny0(Uox#nMw7>sdivaPIiRbx|9296haO^r3hqBv_bSl@7a z`{;7-K3%WF9n91sztLFQf4*EeO7ABZpWM5eFDWf`c+9@JY06fg`8z#I>P+2onc1!W zvspDaN6-r=BI4KeUio3otTiYKabI7S3Cnk~bev{Gsc}(+qg`foYyUQ*VD?rw3$ea_ z@&#(tXIHg`Edq0kSoQK#_btw_uY7%NC*9S#)BFGN08ZN+ApBV8f5$n2ZC+PKTSI9S zy6fB>H|XkB-i>M(d!Br(V?I6)?0)V0X-Cd{%wL(BNY@7x`bv~eSq6WculA@72-Iq# z)oL!R)n?zL&1}eW!%LTKFcX%Q$v-MHyXELS$k>CTU^8 zPA8uk3r3w+alnU$e~19?0kcUb_WoX{x3{;Txf!Lfu#YV*+BSo&yu4gje#v2P!eL`` zlWUeG#jAnE*5`JyLp9A z&v*Z3>9guK;{i`Ew}pEgOGZA7f`WoYN{U*k4ih+k{wPaGe@b$>OR9hRgj}dRd$8|% zU^j>qyg8_W;6L~^RXps{c%kt%4zW@98uf}+QpXi+>qLC4f&R1T~b0joUS1^?)MG z>*ydu>Gdzvf6ME;x|z&JAA`GsR5AqZ#Kho*ZZ;C>=EE?^Bf5eX-LkF90lIGwnWm-D zpN@%lh+6J_X2APM6oc4$v*o2(XZ8vh(f{m;!E&g9dg6%$;(9O>pjNK#BCX5+(ZKaZCZuj4ah zWMts5Pp+<{%*^PLKE4tY6MKmh0q{LEIQSU|RPMKLCBI}HTwLnq_MBJ62!_lOadG!t z{<|08%&TrTxKQRec+%2|;;CGJ5eX>fI&;?Ug(h74^Btw$zCJ2m-lndm3iUS<)Co@g z+yg{Tf2FD@b+g`s<<+McS*^Q+tlZ)(SN9kiELQ_budDcT>%&s?JdsC*p9GfN*U@2H zUE|~93@j}D+IDRrUdL^OcI`JsXY3j}I%E_+&Vm5t!+h@AdrOoO(=(4dp6=dnY-A4T zx>fe|U@p%aUL47S#3bM2PULB?>Zp9IvrmxTf8ZM8msyv0Fshxo8S=h8_t;tF|1}%= zGUZK;Q6FoK$Jt#fw_T*ujd1<#R(jt>hwJse{!^s!K=WgyFvi`LUkq&ZrbF2Knn5y_ z3?V`yFf)@3=q_NR$jnExLsS{x8yOh|wP2;v2YW6U*yebmR7p#>T-3eIKO`{1hRm8o*`r--?R3n$}&t zS#csrhDgjg(&jcXvI69nXpjnEh#Y@ z8)j8Td}ls#@B#@7xTnG94h>9=%-0I5OWs>;JDUJmy6rV4-K<&b%g-@;{ca+nqEy4K z`Ia9f`wc6!uXw(HkA?0vrg3^{e;vzd2W=18jJLQQYiGY6Ax}FnQ)y~(k||U+uWKpy zSOi2J15{ykzT5E&W8J7f|KNAi!5W`CSLhwoc5yDxB|KsmH9{gbPH1k{ z=o9cM?8auIm9D~f+7D0LVpNSHn8?UIOKrk{#o?iwvUIp~vL_X8P4tf^e@J&5w3X=R z*<1fM2WQ&m>z2y0|Li)yK$Wqcc7o4#v9=PR^m^FToP8Zj(&G4v)bD=1POhQj@pj*R zue6xNdcM(t=J%kJ{p~sSP^O1e@sM)S^ga;LD5a&`+VI?VO9z*8vGr(te>wwt*zH$N zFnFO_dVRDe`QJw|Bz^A)Q@(Dt{_86+kER>!u&ycXWrzrf9U9=eZUd3P1Ny$a4r_JwDX%w=$vb?V?Y@TWeZ3ln-mvJgoplW~ zY9?w->*bsk8xb1B-*`Y?q!2~oqAP0o+9Calw9NS_ErMY||;p$^53+0xW- z-rlyp`ihG1rK;OxQdQ%P9s2@4x6f{`CpEc>g0rXQ-!v~Uk_grCoyz}H0I$rX*Gd#cI3IS%XZG@be}4HfG(Mi;TakQM;Byte zLSOZAd?d{5FbV3eX?k;v=$ zazi-d61VCiwtZr{30n3R*>D-a7WW2~c1ox7Q3obc%^92URd(T_A>pLWo>giP=)-@aB z?Y1Nqe*?E@r>8*aQ!){7mX(zOe`~{L^7BQefCrkPA$E->)0pMHZ?@iK z_)=S ze`@9UIPTzp>H4l57;AtSiaJeS5cKth8Il=wTHP_O7S3`9_k~Y;aU0J@id2ZW^fLSE z-jy9XI*!o1*~j~)d>0?1AT%2;m$7s-p0x(KBftI1tbMW;#mWb5d$^n@;xt41C=+mh zU#?i{t)x*b3S`Sj7Jty#nEkhJXraGMf4WcCg~jL+0pQNVmJTz8{Rqa#Yr(+|>-{cC zUtw)MIDLK3+0tYiJ>Maj)s+rD^Yj^((~zCW`hhovc2-pYZl8k#5q5jPUP#*5yqnk) z`CL!3!+_)-f7l!( zOvuWL=I@cY{|O0Hh57b8XK^W)d0_NUCk+!YeDAx((Bz87l^F8!Zc*F$3- zKcND-ZQL)(Z#421a)e-;R%;i^C(r&abJVT#3 zH4^|LB*pG`EZy&0CohD~q}O$D5ClZDzD!=3%rmnVFXQD_52u!P3XMO19uXm9yL%@` zE!x<`v$eP)&ThjGUJ-pp=lk3>T~`-zr5$mG@{4j}VrWNA19b_UTp8#9e;I=k=`oF` zD)@C+;1-tv62OAB+9Tz1U0?FxVp-hyRb8ok^i=ZbNUo*O$z9y>p9n2Irgc*;WY*f> z808^PT*_ca(Q7}@>3vM z)|b4F`~2Y$uyAk!FZQROe*{z(o~Yiwg&Q9~CD-cM+xy6*Cjh5XG}QmYA~P(nWi?39 zlA8|KeqHj+Z_Wc9Ki}5kVs8?NTKBaG`j;t#4i|fBkj@_#e<6_L)-#NAPr;++!AJMK zo$+-=MuhlG0W721#-1kt`oVos$6^u^-==*fC%6Jh8@AThqZV5_e|keun`{TwG&Brn zYKo$kaIszR>Sm)OaOwH@SK812$c*?{P0b95%FyC`D=b`HXmXl?9wS8)vE!o>${!}( zUTmbT1&i1RPyk)0R!(u|`Yt>?Jv{PbH^8V;DN`SxNzH}>(Gff;3S6CBaB{WG*RgzG zR^WBZD}iFj5zA9-e`Yp+OTup0E&B{9%vE_fJUpB)b_Kqz^&U|&dS`oejj0LNI7CQI zy>`0fH7~%DlR8t4U?rXn7(wOAVfT;6#)e7#UTR~b1R4=rYmlXc1V&F-+^H*mNixyS z#=8_2Q^P~8QMy@s9$x_jAjpDwozxpF%k-!%KRs;v73AB>f5)n+CdHMMXiiM17L=92 zJ2(upnjbL8WL3{UZ>C3Wo48sHqofuRqL`eVOcnO?MVgM~oBNqiDlISHT_i^ev?eDH zGo2E@Bh!<%W@??+JO zRPNU0=I49=+#Ghx{=56*P|MA7Z=zJi{cM<<-DOYpV5yB1y6nq;c{q<$uNC9>bhqpd z^aSZp(Q}ApJqf08D+ZW^m;xzG>Q|;E1Ji#$Tk`D{e`2|K#cukQm%mX`O~Oq6jYOUB zqRsPtmjPRD4I3pW6#!B{M@A$7+yLNxDbPwdlKD$SM~9l4#@K+3sP#eF^P4TKPU}c^Kf_ludn)P5cVYTKIB}YTJvpQK@W( z@Rvu6e^DCxKKOT+hX@AxuaA2$g(X~FU4x8&4-O_|X#3}h(|4J0czRc+aS}FIEk*?Q zPX6l{u1q%MNQ+N!AS#ejcxIrlAB0Nhp#ep89uQ;YG@Hp7C69svfbBQEIh= zCQbBJRjq^igi6kcV#b)Wma5>f6AWH(jJX}%qi9rZG&8HHs)lcDjAyA(0W*X_ zf7d7y7bDjxj``3vKlzfH8U#{F0@gJb*dks$f{%?I3ku4w*6+y{)^9n?XVvDA9}ASl z=;&x4p?+&vQqrUCAU;06QK$bY5tp?p{iJNFWUOr8Qk%YK3yFk;VD<_;IfQ^&YiHHc z$}~%r23$0@&-_0vdt;`@V|8_$AoOvyf5!CUrK;~{iYKS?nwxR3v6XDiQRZQ-2_so| zXFA7{WP+Y}K;G}{lwC0p6Vsm_)Un$4bL}+%de!rLP(z~_`b1Oewf{Z9cUPIqY*a5= zx5f1(C;~#(Z1EhSUkuF5AU%YrX$r8h?4Og!F~3cRH5YMxS~Op1bkJbJivm#@LzCl>Y ztK;@N%%mh8^IR3^v?&4%p8^o{e`!Ff$CB}e&&^rNW^fVe`!?Zsb-~)XkRUo8dJ6}8 zLI4!vKOVBO^YM{j3Z7%R9xd!HpCWpx3Ro(`&>oONW4mf?rl%9-roc z0~ByTfG8Ni*gkqmd3oPNsgsh1Mih+{1~s@MAR=on5ys@a{Cu>81SOy&e?$9>B)z?< zfetY~-}&(KCl6Y!W;CcSFn3*+^_?ah;w&k!R=2^gm7yOu*AFQXTvV)esq=Qe2ecdY zk!(*xmxY#Ya*mp|^=wWk#}@a50Qp1_>ipF#eK<=b4&X^4NYon98yJ3)m8isp)f&1=Q5k zKy9N$^}&aTAt(NN*2(VIfp1hx^!OM6qCm7GF|qD4D^gwU>(Bl8c6idKITSee#)YFj zgy|9`ZjH~342_6DkUe`I^44pp)x%BXKTS?(XcU=q2ObgOp5JY;e|IK)>hYS{*-x1% z)~}bax3V)+!b^%*duaaCU%Eizi;T- zX#|Cbm#FX}=rShf=f1?WYj5hxxX8nZPfUDps&=wuoo{#`_4O_Lin;_}Fdi6!s^PNp zE?k-?^Z4KRxRU$Lf9BhX$w`kop$Rxp8qvNFU)prhMPaQyNh!&l{g%0TT&kJrG0)z!N;E3WJpN9~;Bm`d$8T(8WKzjErcSf32yNh!VQk^M(;xqI8L? zrNxioeh>TaLCs(^H8s7!#FWz2C9l$JLrIejU0E@JwLx=b49`#6fU3lPqrn1nP3skf zHhOq7BO;&D8^BpBP20W^{Kq;G*ff$a-@Tih{h`;9=5u?#yHr7keIbJ8oUaaq{q^zF zBe#6k?b40Ue}m6rfMh{HPEHQAoJx}`<2g_wZVY%jZ%gRkyngLk_3FM* z4ipp=5R!l2J%Z0ZCequK`r zU0r4lP6gwQpS5fx=)%?gruy@9)?Ba_^69pQf7yz7>2EcfLnCVSWTuc#12%vmT?S(S z(E)otwh}-wKq2BpOw5Y@`aIDyFi_ofs$TwZ&!-?~;5Ea;aBqJg-xGZPvjf-D_w ze@sST7C#hteoQ#HE*_uTXI~OkUJ}Sqe*xXZm7%1oi`=C1=+v13>t*T+Qb|a5K~Ykw zEvcxm7m{iP-WMJoK5x>p)|%Kntzc`h(P42t@AKudKJJDi?+>lYGmrFPv%4GdZ*9M{ zSyH%ps@@=)YgFK3zuWkiRSJ}%&+P(Yh!|XuD9nk6hf9~Jwu7h;z5Ps7R>lZ{e^61a zj?`B?+~2RPuZPXeX#po-Vr~wqv}<~r5;2Itv1x6ao99)uBm%(A3U$)ozdur?4Cbmb z8nW%=sUwM$s)C@Zmm^>i5y69NfGa^pI6^`^PA)D&G?_%LD||Lt+VoHh{~$3YvqJ8& zngA)HA<}erQv>a_E$}#3|3+F?e>U*rCMqRmRjJ(3?ggK~?T#QAA_b)}N16e6y(Iy( zgOvDd!2m2{kxCC`?-z)e=-naCxOa0n7K8#dL zO?o{O_B@x^roW4i&&Wc^FEAc2*P#9WUEcU)Mb(^Fqt0q_nSgM5{^kNOe_Q$i5~No1 zkBN_s#`gX^loDcae{C`RXdg}z1tiZP>yvQn*+>q%=Q&$aaBZ&c?7`7vGMYv>4LA~eAd|7H|Yh$U<_~uQ5bk@E$|L-Qo9dADBMUY%*-~pBf=`Ue zd{_U~n;=b#vwe2q@9*!qZS|D4<;+L^QAP%v^7t{xZrzw|tt8FBnO5d;MV$$_Z@tk_ki=A@{n7kYl4J?*Wbs~d8E z?|psKl+9BNf@Wc10gAQH2Kp{D==R^{AWNKsH7g5?f24;8v7?i23T}S#o8pxvuW4#} zdZd9k$^l)s#Yuw>n#@Y|H$!GlK?d9;F~SN`OaWqfBJbaaIH^l?3duhNVG4DEb2&WT ze*&~vUF&lv3cYA@2yzS3jd~F$@DJ_(el#Nz|EkA;ZRK||YU5!899vp6FrB%RQ=*0c zR_(Pce-oc>tM$1W9q^rV^?@)jt0M+?1Zc=_oJ1}r#cJ{fVAI~-o}$Y7ZM}wu1`wIR zAeV^}2X(FdOTC?U;bTTa^ohG|+S=YmsG)lE1{DI!ir|pNgN@zKmLRk>noQ_Lt~LU_ z!$SP|ZQCuljL-{We?d=W{&qe~*8lSuM7s|^Fn3gmAK+%R zT>;Repj55K@~ew7+VD{ameeuqhU!r#~}O(1#`q&LXciqy+%Z5R0*XB(K{9z01A2RDKi9iJDo(C2{U)XRr|NkaAgfw)@-}aAlnS z8)P*eN@ZWFQjXi)-=8l#6pU$+cNi8Ff3DZ695LUbPT1K_hA$k>EPntr8qOnd(&?Eg z;DN)DhQ^nL;d6I+u`>g%uhZoC95}H~B+AwhAdx;~@+3^#y5N?bt{1;c)tWoCJG#yt zFmtuEgOcqm`?jF+>Gt%!0=#5@wTSuS7Gq_iR0Y<<#AUk>j!Q4U5<;lgNvQALfAy)X zWYEHPCfz4z_)us-*1@c9mN#_q0t-4dy$^fRBRIH7lpGfqNP9F&O3IDxZEkmoF&wY6 zj&))`=E%r@wNB=DtcNI&=_=iRR==AT3|=U-DPt|YL~y|owuC>Fvuv-kceI$pdn}=~ z{&2NCkpDgk3m-ou1eFlBq&c9WfA14wI>_g?@J2~S3*~U@l2=_%g#iz!Ke?jFHnrMX zWVuIScvuT&jrr(+w7k5eqoZT_hzCdq{*I#^haK_@(SQ=(%}s6twjFGI{QbkSh3_mE zSTOj*Ql4xUDGQZ%$r|WV1`XMWe{v@+b-%VH z?;1q>bTrzx;^Ot<9A7bI zWgMV9=e%P;h)O2+F3UI`Dw><;=GAs^$o}SqhH_<^FD#Nb8+S<4ikX_iHuy|9K5=dm z??{l#F%cLqwekYa?mb%ce@e*qB{v=z5p#F1mT!98{W}n! zb{*(`ety6p5O>^fk`TqfJbgX6evCan9^T5%cmWHg+uLmE!eZige`Vb2)$N#GSC)#3 ziv9o!r_nFxt+}?z8;sj8Zvl^j7vLX7Rn=!fU1KlDbeZ@5P*_^-)i|sVK%FuC{8+w- zb<+|=vAZ2vYgVdzKV0aM3F*K#4_!ak6c-WudTs;^*jSPl~>6+XdmwFo^bghTY}bTAy`X+|B*jXsye>IvS-= z>o01Wo12@N=E+B=p`Sbv_xFD&E}RbMq1;1eG$tkoRN?>Ke+$4tJYo6nhn7uHY{td$ zn6Ar?YN_hU=_%|6f++`t9DjciHhJr2Ia&!Go&}m;A0?HOEU2 z=opks^DJH2DQ@_{gT6pVM}izIwjdxNT}oP7-l5+d#*0wC{mg@iPIBb93`=jT>4A~> zc8B#)r=0(Kf4sQH@5vWt;9#^fmM4BXYo4>H>_Zk+cRt~;^XZeYVSjX*?LZ!PgY&NP z{h^(oxVyW1qE7~wO*h~RI0$1hB?o7i2KQYTc*$>1-*zCAA7256au~Pq7_O563fg=9uk|w^oo?{>x7z22X2InCuQ~t%&7s z8u|ke^w;|cbNYR*9&p&%$2Dt>gt+V;f12jn&D6jt2tPO{9%2fdK>DLCd;+)21a7~1ocH)xbaN5g95BcF1 zy*E!hOi@=i2B>yOXBee#xYtn=l7Abkx}hQRf9(||VpLyrSy?2Pu0ru&>Q|;%z=pt6 zQsT4dHwZt<$;k9%xh+NbKHTyS($UdTGc%(n(#eS_DPezQ(T%*=pN3u==1&H&B*Vu# z$!GDwVPij*JV{@uFYT|duO}oV1i+B6GXUZG;n**3sm%-e5IjL8CMMRZ`@GtT8)H$0 ze;}%`OM+&C69{vL;91GpAV){WK3r?egpgIPQ7Vogh$bvl1)R+I=!+rSh+I=UlICI(DG^=;E?$gY7 zQ>Vo5gI}3@K#>Nfok)oC_+Q{eiR?}<4+{?Z9 zHD{cgIZN1+S-|plM}s@D-9YRe;zy%Ic7YRSKsS66EX!L$;q2AeWi}{lJg9Yn#LG1 zgGELb85zj|M80Toxwwc3);HzXCLFxLZ;wIkI?VRhUi@2GAsWi*C{i&ykBX8B&dDJG z_n{OOw?}4Vlx|mVtCHJsHo`w*KF^hb4n%~#Z?k6IR$4m{*)^xs>Ha7(rQWlWL;BqX2G(KZQGgH$pjN)V%xUu{IPA@#>BR5+qRRNbKcIn zPrbT(Rj=-*fYz0{!nL{UV6?ixHx`3FfRafq5x>r#^})iY4rC$LA`MtJmplT(T;stF`M| zMgz(#MZ=Fi49gs}8h~W{sndY3Q9Jh(g{(}e5BY#GXjF>bP8#{rC_jO--9`RuShr}I z(28avW4xgCCAswZ&_AtR^PwTz3Nn-iwlzHie#J|xt0$1pi?O)5S#5u^>rD{0#Kn13 z>GoT?24iO?1rM6oMro)?fRT-*hF%}c-wH8PoQ-{%W&S0KKLEU;!XqSke4ptnjgJxm{IMdC|O@)DbDAB$$uNNxvx=bUz|{+O-8` zWrD(tdD3jl8E#?GAo@hx)3&h<%k8O?W4^&@25xRG@-eHBm97C34zo}aB#F))=(l_P zj<5|0l)*Ovk%h-uTUU$Ggww~k&n20d2;ypyA}Ip2djoK=bEwz+z?Oksa@6%kShsfn z&W`BzGxl1>e##*hlk6Uun5eYpIT$%`7A$<=b+;8QLvQ9AaNGh)fZ_Cskq+{5Z8Fjq ztq9hKgfvU@D%Q7y3eDQzm$*F``Axrhgl88K-t>ecjEB2wB3Bf{ERTSgZ90swcCC#` z6H#-5S_n9v$>hS!?&=K4=Q`YqyU__8V~8*`(0lmFIUgP#e*aVXtay7n>5ZSt>g?=H zN5z2nriPW88u~}sUI?4UX9M~#iu4_Vv6t7zXRZrSeQYByM2e=O5QM?j^0MjmPVM{S zNP+b8m)UqE`AsctmeHYwmaqXy@$1GRJ~9pzKnU<)AZg&16E_j<7yzrtLx2!H8`PuK ztnNzPURO2abMjiuqw2V%H+DjS;u_H$Zv>J)($_bzz`C|5Df*jVHAJ6YHL|WYeOTY} zdi~f0FQG)S>7Ujk6yFkxD?)}u3$dM}qRCz67=Mh1hevp0-uOUIWlt$OmOW7Z?EC!U zxi27L)AqMwsU3+7P&M{u_O%I5w5+A|@;?|X1lI$Z>-C&#DMEU5@7R> zp04q)x|DI*1+R& z@Z!u+J|)5{&cqg#eZNI0NTlu)90tHkkRA@W@Cu-}<_ok73mrloZ*m)l+h1DpIIuv+ zF+Mp_#R!3=g`lAo+^Xd+&H6E~y}KM-efcD&6NuM+O@E9BcXf4bsu#ZX)nJ-L90l*A z)DN@VCuMh&1FtIfbd^{xwoVP^W# z-JIKSCMg{n!c!0&JJ#QpV!&3AeIG;xl^>j(8o86E5D=0+WDo+Dvg(?PK%&K(GpL&! zhSU?bUs2=YX3>*URG;vW6YyGWWgL7w?TwxkA;nZi%yrwf36VS-2Ldx{dm8wDz&N%J zF02GouXO{FE1mzfd~*d#zX8V0kHn+qcSq9_WL73L?_t=*9n^VwmnJ3_J0n2p%s(ZU zt4!b5`@MiK?&=rR7PxVy+FYh4Rz*}VQ4ROmN3}MWw&OtxzYSovGeX!q&H&d^l=SpdNDUOW z!v?@*89EmRRM~7Eo45?@5r25p4&zfy?`=(BIo7Ox1Re45rL9@;)^Gz#&^OM~5z?`> zDc%VDHLXT)@jkeDF|MlGV?b3u$I^I>78PY2`n}7|Ie4$}=S4w|VKACsPvql?j{tkI z>3Ae7!mXw|uQ^BWCuLl9sw(L(-?b-k`ui&jo0{U`;o&Y^qv7--DhO&VWzdyc8_!Bc zK1|-!(}*xM>ig>7YtzXul*6ORXh1q+m*-N3(`?{%O43suNm4C zx#E-W%*heFn&QJ-w*jw-OUp%bkWoMJNSF=xq2{&GiC({wCFiACM9?n4lF9RelECrt z&NzR{w5D{H=lCXpr(~9kci{`iTZhw~D#dU7tSpsfRRB2L9)dA=A3BhKXxZONV!7|Ubb+1783XQcUW3*U zRQeK(fnaE=WUQ`>l@NS|&iN&l+ID(={1`djkB?$}zvsuV)60E~+$^UUeDn7M;_Job zyi%u5_5o??t%H}BDL#$>@!~~;D82I<2pea#(( z2=oX3_1ekT%$yqYBJG{SBkJqu6W;i{&BKu&r-e^r{wL2nu(X-bI29BDiEn}*Vuvwb zETHOP5BzyzBC>X$5)p1KO=aA+U^b~!|HoQLPF)L`WA{~&h3zv=5^GWN%5hwGcY(A= z&CeesGozJErViTN%L+Gebt02P!EKt1Ka0a%mi1$c-c?sW3mYB;%LBWxt?hwn`NpPa z?U>4qd`)9qQ~n5CUE0bPl8KgwQslG11cZU1PBJN*?n!vCj$E~0m#Ets#1H?(b5oa> zyWua9_?tx4tdnevSW9X6AA*2_=Hcm|3}4IW4RR^7it@NM-UY?NR0S9$-PUn$e#0;J z=+nnYy-ebm19OJ~2|td&peU&VYB#;`Ow4xwtw~{0qjvo zIeBc1>K5^XQRU1x&EXVr@ryoh^z+8SJ(<*v6NoRh@7|rtSY*gJ?6`D;`QY>x5-7w= zSBu+5lN$M;2~teijxM+)i0iWvY4^M{P0!F6JL=qs6&g za7H{#RZCu;;O&2XHa0|bE}4ev;CyZ9r;fW*vH3U`UeuWP5&3RoCFihl*qY&f6l*9Q z9GIa0*rS?q+7m?t@5q1$eo|PI3j> zo=V$les&dJK6*QwBOjBsZKWZ&Gn9*`LmMkEFaOp37A9Z-kB_RVqOjFs4~h{kw9~-x z_3_tywDejF3hrh3!67%=ncEf1mKg}yi(zT<6fc-Z~;TyYw+r;};Dqy2$T+&38WrZ?+Q zP~WD3t%f4ddq)O;MJBCDl#sZvWTnn&&MVw@7g@@Pm$^Bm$z;y=OQw(xviSV`w#VSG zt$s%@9@Eyy4gPbEdQ5_>);2XfGD0Ebgbc0^4^6pOqNMN(tYFM z<|fvoQBXrcp}rl-9$@-4bveFFr@A#=AqyF&Y06A(M?KL>1Ma4$N9ATL3y2eYwX!g` z<4fXs>5^yH1gvaC7I=qPn*4nV3lkrx(e(%n43vl=l>E3G*e~u9mFhrb1eK5t>%&B1 z<bmg$k#iT5m234Xy5Pyqt(;D`!^XQHnJNd~0lk ze*Kg7iQ=HaZvdwpiY`eUZNIXmgjqEEmNLGu0H<4w{NF{59n z%{PyW0iYTqCzd)H=TuiLs0$j=QFYYGd~{7*V90es5i zl~`d=zza+}9jCio(K`3s<|dDlF;;S$Paz`$;4d^n3W7}4HtM6RmMXb%atAgB#_jwA z*4Qm){GmqI_Z!>kIBB6GU!&&QzV|K?u$|6S|lb%uF83ZG*e!%Uf?pY3m6{O0+t z^pCZ+&MhRwyU_4{c{t^37drdni^}2Gzn-qIn&@6m@ldP8zuA+!YhN|n0GEh+)O%oi ze`y~zJUI)ST!Ua1D^@5JRd>IkI`k{23h>nY{Gi83PEO8hTiKkleBRd=Jm5mq2}N2E zb_vu@c$BcDsJI9dF%!2sx)r;jxV9e^t~rk}$W-)~m|l!EXLgzf`Fp$5hfxF(QN|)Y zxr*rt4+*4y52fb1k5)7yd?W)9iMK*5g$z}Gb8{onlTm0@4=0$4`l5ByDoGSd0+_9< z+ns({oS0C{J9Ut~-VQq2Z?!lUtY(IVX-Yely*lR;bl6kf4vFOXWE?9m6TkRqU@$X9 zpb(lHr02=)9XOge&s8A#OTIB8xaS?4)!E6+?XF*t4^H^hx1>^L0CM{0^70b?014ym zmh_n-q0OPnMieu!Ec+j}Udy^}H^2v7E`3ZZUgETuu43?EyOQTm0)*h8PzB3L3vuq* zU>no~jvDK>2X4Wb)RE=1zpuU9o6_(Lvq4*XMpnXnIov#WuqHLLt>J2lZzA!-IHrA7 zmNOK~zy+idUiimXxteCbzD`L-_t0c>RmGWfZSgF-yy2#OwEKtAOOjd=_^P;#LtLdq+-xdB6AYNH%Q0UdpGAtJ`x z%<>(m2SW{})du6aF&Y>3%+gE>l=|ZG5_4&IK!&>dbACp0Rs=ZmHqSah^-Gf^jgL-l zO5?_8d`gYW3=#zE=l;XitE;rB#;^Tg#Rf-`VKxyT-|j3UYI>s|-gfT=e;oj?wpU&+QYQ z=%JFaCqPAueMyCCU5R$BoABvO#uE-Yp`Wuw=)*7ClO~5CW-qJJr4_m|n;Uv|!+>_i z3bKOQ!Gromo<*S#R(gwH{_xR<$PmZly;{~;w?IzI-~T{Z zSeUz`BWD>q(jK>=K2`Ot;THx~qH^pvmo#@La0F3lf+~RkA1z*8I;ALx){g4mSH6d* zuFduLr}Y>@XC6_YUv6OF_`+m(v9q)7Gs!hm?=<kAr}qEtLKeL zB!IZLOGm=Vl7qPJtONPx)|L*o*C}FUZ>Sl}T8k8X?Xg?hDBw(lrt1oIT=#-nH*;Ed zIlA04Di7YAqU*sJdVoF)-@T&T>7}c-xp@PtrlG$3{cZ$NWR3sELYX(OQMn8p`wu>{ z(7bhHJ0Lb_^FtL9zrE`UYPF74^ZTgv5zW+by4@7HlZOX?#C@suA#CRKt}TUB>Ji=t zHi9y(U?Al_buA@@TnKwvCQJw+yu3UzyQUoTyJG@og%EO{b3>PdL~FlBbt4%tV!09$vH<|* z?O(2OJzE<+f8+E~)r_fmk{9cNOHwmpw!_os7K$!~B`@Q=Kf|Yio4?*TTu!z9t2F^> zTPf93lJ&2#NP6ePz6_R_N$ZsNzhd~lbduE-0vc0iXq^6`O(8u|_r)dA*iqsREkvVY z0M7SKy26e_Z5BXeuA^n1UP}BiW&Hdwnb`ye3*z;wHMi$uqDN$1ssqxf(CG1g#q!y1 zpd1|S9aCsurN2GbLX^g9fQ++Zx@3-S4VXKk5+*xuPdaD%i@YTJ?lefGO1ldF#6cvD z;5*vbT!GiV0If2LwK@XPN$RPJg_5-{0=AY#6-omjD$E`&*2jUkH>2bx{gM`WLl8#vI=I8b#@zi@Fab$z81J}e{ulA%r}JkTVejN7it_D%R0`L^j_3Q9-g;^6df35f{rY|KtU;p2IMG~((^s~bF47o2lP z<|AgX)TF*|rm)o?N{8t5`7H}yB2q2T2!Q-o^}_tBtQpxI3V3b1u{ z`vRp4P%tGezw5>W>hB_H0)Tw*_lR~{vEuOjj{nolo2|;n4n;_7DdrYKuh{ru_xAH9 z78XkfqYb{*gyf9vD!v3JCub{+>or6~%T7Zlj*Ss&9C}n}+~910ULok4VI^fvf+#vU zqbKrhqZJet9q#P)iDTBE_&;6Y=v2`!N~O}gze)Jrpm;f3ASRiY11M@K(Ffulx)#YE zSAgyN%r7K(dO1T+~08Xq(#zp5`js9K=Wv{Qy+mz#g?k|U&iV93j4BBs`5)gHdM(VGs zWhPd>93(#?pW8m*Jkx@`vv46vT0u!EyE;d0l1SQP7PiOEDf+f={x;QttM_-=BN#i& zP=iRozux7C6vfTdynnLU5mX^Uqv!5_(HrS!;FW^96pyQmz zAtOF-nP_1P0Pl>yIT;mb&zI{uo!124CtM7%1~qR>^?5V6sp1nw1VHUoFs8VE878f= z8pA^;se8AIii+4|S=hlLA+I!3vb`r*6c$Ah*91j8v}og>%@J~cgNGKJ?nmc4uE=Bt zcl0uM=0V;P|9HO430;`g#`@CK-6u4kl6+Ta zNfWC!Tm-uT&mf3s<%(*b5Y8RVA#@ zR8{{hDBY9AI;n;%h97Lh+r!Nv;phbi55vg*;iGMXFH#85ELMXH_=j1Y3utXZ0U_RwK6L2jU^0kBMEf>?OR50U zed7w(!sZ8~f)#q;`|f#!x3XS>*v$I`znOGX{9LeTBXAlUWz&RVp{1o8^m)xM%3BnM ziKMNasUao3j|iu{y}@BFBS_fi&R{8;v?B59}_ zT~Ci07;kAK*~1^JuvN7O084GJ8F|`_n?{(ELLlz1HeAEeds0xsHtozJ08fkdaBSR5$l680D!WdD7>IbqjQHE2+LU?dM z819Qrr;nVX&8#iY{L3;3ufAh9SVi(?jN0;-L$J8uRG$v|q%>jkk5{-+Ttl1mw@o}j z0m$_`cUS$z8kUv8_Sy&kpQ|j?MI7$5+L97T3=IpV-3BJPU;<%L+!Q6H3o9x|z`>~5 z0M!z9CQU!zc#*|k-uS2xu2rhO2HJaSZmw_D+eyCR^}X&#TwGkcsOb87Lt=x|5wSos zs@im#Ag%+n{`YAP_|}R@rC;os!a#;;?cv$Ps6gf@I}s5d!?nrG>h|~e0kSEHXTcEo zL}Nh#DL-U4N@Hk~%3ym=!YuO$05@P8r6{wETnxCIPsB#b(Jb>Tkm$cf2cC? z@CeT+4f31yD+d6Wb(9&=X4F0KATK5NBdqn0s-xxs%?$l}D11)(}z8??pvLobFm~hJmU; z{y`QJ!%Hq)K~Zr^^uD@-<6CE-lg2ASuZ7WLC(>!ZBuWe3V|op$(pJ@AeN_l^_4`B;m-uj#%!54)TBo3*GI zef*&_p$0{Id$viH@ssXCl6SvB|F;Z*qI96YYJ-FxI4}rnRD!%d18`P@pS~;>ln}%H z)bdkjX~L2_ALvk>SOS&@Gr&Fshbf>MCY5*+tK*A@GH`n5`ubOx|6;lT>AG;Ki5gDm zIy;g-?)Xzth3}LwDF1@TaKhMOkmZ*J~`TrgyPZ=?VSSq1kBn0@IFM=;HDC5 z9B!_yYst7njh41rkcil;aRbX%9MnntykD1^mvt;JVSitJjvor^XG^pZ zTb_N=HOXxlkU1Ad89xFpzLqAqH_L23$G56HKWX|Ce|a`z9qFWSqEXC!R)JcRrN>%Y zUI*a2WUQ9iuvoRi?Z207w6;Qx^ z@wB81wl#4rIysI{fp44K6m8pVZSO@~V2tfk{j0#Php!rdS%(9t0^1d#yeaMDndu;j zzNrZUQKLil&{zNYjj;qlTC0VImF?Vf<3)+pG*P{EnVJro}td5m8Jxy#8lV>>P#O}9wW<)tP)n9%l6`w%B5{7(67NxMAw>`5mSpm%{ zqVopQz+I&hC^k73Rv{XXJicW@SDECVk)^GHVEa9~yeYlWeI^r`xfCr%we4jR&46dA zh_IrEm9PBTnq@_Cp{(<0;O`{*qFFfegM2@i6iv#1F|4eaYg$go$L)(hPERq{tzEDg z&twMwJ4Zagn;L!alP@)4$u@+(gEbt3a6mZ>0%bIMp8&GQTzfvV5RP17?>MKMq&``) zFHdriF8V_rnv7l)Y_CS4;CQ>)II)>K!EJa{v+;LdYZbVoBzV(-e^rogqckf?N9JOm)#}9Z>9KxIQf}6<5ye&{lvDNn5>HhQP|;7KR8wORwG=V zU$}t;VG-)!r5|~;L^6)TWBn$zAe9z|AX01)ZNwJU%t#+BQ3Q}YVa$XKTfX+o<49k7 zo*tDTMibsIxX?aFype{<#8!(`O0t459|nH|ZQeiZLIcL**%?4h6_$$P?8c*N9Q-X4 zYRr}Z$_;BFe!DOudj(qMuEyumbzTdMP8lambQEP0OnH)w7Gd6eVS4+pqEM9A0dg2* z@??}0wP;FtF)ah~`~inOlnP{Wm7k#q%DVIx;U+A3BRcmu`OaYJE$fvLpM;M6T6vxj z=`H7#(ysnr*W6Z0*ZK*rgulzbYX$H}-Yx*_dC=ZsqmRV$UyK_e7j`0ew)RskYNbJ* zD1tMM#My;OtrX_QSK=CJp7AP2|G(S$GkYzrVR=JV#pV{jgu^Xv37=iq2q8N+HkH7g ziVd%gG7HwE4PTx+)pk{gav(FN$#kT?N=A@)jQ?CHCoAGhhd^{Qu5 z9;hfNQ(g}%O}NXEY_sBBXbe+KbnT*BuNzO-406;gl31kvQ+arBn+ax-Y~a>_RN5^* zIX70WP7qdq_8aQUia{_?reP0Sh4nT#S=L3+bfbktKNxBGpDOJ@de0dHQj>`5P!j7l zs%adUbT~k1qfG6jZ&$G{ur(X9-t6Ugo11+zDX@y?3RCeF6GVS+{Es1_<=pIe&xkS6 zB{Q;tucPTmP$;wmh>rzG+i^Z{{dF!_I~ZtMW^Pspi*q3Pzlal70+!)6jv${Mq@i12 zjNk~Csv(0xKPE8Kw67UrFim1{=W1;=p467yBQby;Iq(PAmhe9WBZ;zg=IYEl@XY+cMl7B*#fX0J*}l9IXkmU*-o5E ze~SUEO{zF)?-QDPN-S40&gLO>Xp&3K?ae+@6W<=6>#s5QHOCA)*Uk5)6CaQ-&Y!D~ zn9JYz)!r_joEt*VIlWOS_m~qOwl~MN_t!hmF?RRhMjoS1e;Ytw50Xi8h+a3(D#x?O ze&SJb?o*a?1pKy{<$9i%0h!-DJ&mSvuML3LXSv;Dj7&|%1*_5@kIMT3b$(viFDwCZ z)A6MsYm?VtB)fnH#}A19m;G=kwJS`umsj@tV>|fSn{S_YKJ3gJQL@8F+nR1)+-;Wo z8i7DenwFYwqn&-07RWGL>0I|18D5A7Z&NyqMz>ulX4{-7nX8RXXGvaTBcXJu$qK+a z=JDOh#}njlKZFneJS~kJ-Zn?bYUyIv+nQ3Vgt|SG_8{d0rFm@Z+FIKmy{&LVXU22b zIqix~thwd83@$To-G+*(fI_T>)WY~tFtaJr`3AU!vH4Vy%F8O_XW=rYiT zm{d_Ummq_DAe>Vq)kxRS4Y}ivKg3te zIYXTbPjlsI#H*v;`rCu+IxwIUZ1A7;x#~SYO$Y0p#tc*|a?=QZAMT8$xUDk1MCLut zYeTa;+x%!V2X{#~ew>C#Phe{DHgJdb8`zaQdNvHHx|^1R&f=XcLrb(3BlHqC*a*RX zpS0wJgAvLRPCBl#RlkH^S4EtOEb%kSaoz2>X-?Ko!DIU`EqjYqL<|7e`e0@{%FY^_ zm2o8hEI}U276C8wR>cuo&n;(zZjlGZWnTGc;qjbrS#=QC|ZEb?f~SV1`I|btU^L zaZ&?DG~*v%ZTY6g={N!2q9DYbkcxWgP^LyvRAMnaUXc9*VFEA>O%cuSNAI;kQpMs`XF84j}{^`!I1zvJM;B{8|t3!tUoW6qnDd|~rI|@A1?IVW3oqwZJ!3TVM8c$9U#=}< zLf>wwTiPtXo#d`O_J%@)FuctK^`*6;Hv8qyc-dG;VJ=Czst=%7> zJxaDvuoWe&rYU}(XyNbx<4O<>MF-m5@$=5isatU8#sc6E#f9H<$^C3v*}$FdwNeJ`_bm#=h7>e4 zj;O`nGkTi!Efh@x@0n-v;ZSC436}UR%u?rA)dV}Vb7-|29%TS_3;4gcZ1MiR^@oUd z5~H+iT>=!uET|@d#v`&x!&EZ2qy|Z(g|TU2Nh>0u0&EsqrNZh$VV5ZW>D19`3n?X{ z+CLaghl$}!HU+|`G37vu{=M9)&hSpF+1eKpo~l)}B}5?P<+Xx?eD7506rWU4j8`s% zjZ;#GuIo%n4f~yp_Lp0vh;D({XF0-Ttel=odJ>@WUdv;)jJVcq0e_ANS+!NWeI*x5 zRuR%L8YUFOl%&l3hZ5arP6oR}VLBJQS8sk|umBWOAys-fHwsG2>$gX~$FEE89*mi( zPY{jR#_B=?z0jq*;0w8^Yd*Tuv&kV1aA}I6AZ{HFHo*uDUuc(CbkgH^cK&xe(4x>` zzIK59$g9{F_Mhx-&Z^!7O;SN5mwPVJQ;HRiq8y2RD8AkyWE+otGZq$eGebJg&p-p* z9U^BtmK8vEvv`!dVm~gXNBGOp$*mshVN0DfKmMMTQNYFv(Qr~A*VyXFQ|qmLG!3+K zZbRIqwEST%q-nmwD&pE- z@`hjJs*0QIz1CzU{k8D2yPx>-Pki*v5?d-ufm#6))!LoWFZ;q4u_hT;dlmY4mx zY5n5YlL;4Vl@3QUFT*y=q4*4)JvU4nTfi2U3bhe_dU`RI0Ce#QclEAtfXjjt1@h!x z7B5b2lbz{|X>ggel$UwXgKQShNe}>$(6yZ~zcC;2{q01Ec6LPP4PMMJ6*c=0owg3b zw1_bWQ?WcYQUtR2RB=50zWB|p1%3q^pBAf+7{WvE zB8fv=TRz?h#ZZV_d+a-89%mBzzat#nS&H~-c+obKf$2R}xj&fq8DPbm@}q#l2ns}F zaBQ3KMwGE?pea%U@w_TrFGo9{qH$kwcK>-+)<-2?QVOE;pa?E`QcfdsYcjOn8P>Up z*oR^#iuSZuX1NVv=k(xJ58stms@SSVCN- z^RG4+dpxG}X5-<}8Cq;3=m$XCM|rSYNy7@srdRTN);>yIYll=$wal0D0(2F3r-w26 zvF0DAMTo7B?s_f4#-svg=%Uj6KDAf!qu(B-Dof-6egxcKYJXli+)5<+q7V>9*x(Li zOv4Rwl5q?bkwzk;RT~4|!S=}g4m@#4)8vg2ib~?QFmv7rt+mDU*i`^TckjJ?&0M0B zOY0L@m!WOw$ydEnDl@@o=NBsPqe|-DPFnPS^-{%1s3#Mb!JWqKb`|p;G1%rO<`zyI z6->BMWc~b?4$3Wqci_o%b|Nx*scY+a?=E4RCPA8M5A0XU&Q4e8PEH1w86f%vc2)$b z@FIx}l}q}cy#f(C#Uucewu`7tB(st&$ssl5BJ^R*%o~&)&M+HILm$}u$JZ%sPd;b2 zi>Us|5c2R7+!QDiiSsdRaq)XrYRyy+Xp6eGzs&%x{v>z17Jh8VsvNj< zsxj|XyFQ;poZ^guCPe#d(DlH-42Gsyte)1cn>^4ias_>l7O25q<8YYpt+`>LgBte6 zf^kDC3TatAu3gK__`!wmkl0it1;NVg=%f}9PeV%ykH&>Q?dVwlowR`;Os51ddAtqE z+s=5zL_=!{Xa5HDmD}@}_$$zOa9WDk(rL_A&d&n9Iu-$+X~M#1apA*fd1P;blxsr5 zR`v3t!^ZNd8vDL23H0{|c;rMwX$e*iOca}N~ zoF^*tmFcwL&&Qb=o?@1iSib2Nl>cnI6GB@J`t{xjxLgw!7E}TQ;uT_9Zkx;OWF9-% zr^^M9*NxFIb2?K7axk3)UTVuzK2zaJ*$6B#qE4JU)EGNkCKOW;RkWdSM?P5QOgG?k zYEni7=rVFzW)@#8xuR)xO=5dY6v&AF*{vxD@M2X!(D2M*>5n81$`MQZ8X0Fxit}^+ zV1Ba2*-QOVcFufOTD;{dF2{kqhP%a%9|c6yh`eStP>@Dv|MOwa?+wZ@i$I~5Zlp6zXaeKo1f-SXqV*MT`A0CX#{^XYV6Q;T_Oy#B831&m zh#uFu4i^31^7u3-;8Er)4iWkn21|qjNV6sRGl~+QweI|lrkLToW)IO33+-^P`;=%g z1!Fh$h!>5f00!*V6^pT@XA2_2`X{Gdz;9j2&! z=08&?4$A*s$SSd1qCja8Z~vV-NJiPbiZeQnDzW{L&1(FR zl^>M8a$2Dba-wHbBNx355$XK!-)7RGsF6Y4_>#H$c+;$WiKN5hpz>`iQAwFCZ?N zaRS(+Pp8T(>+k!(8KEUUo%1|q@ScyrljaWZfIBzZvi@kwijz-#q2nNGpDll#&V4Je z!5~H%;)%T~THptC8#d?HvO?VUrMRLtMu0GW|-c$*R#_-4gvjeuI$$-g~IdO0fmPGZ_R zmwvLw1>jcrzfv%boV;+@22VzsBa_71SPv`zL1jh$r6J{=q%*{>3T4B^UdL-Z6ohO% zEON1~mPKsNA>7bOSex4mn05g5+VB#F$KrWN!`$gFAfVH6id3_)I}eez=s0Pq0dxRq zhG@RT=I4y-_8Mu6Yv5!po2`|)c-X}T) zY!wj{=Ap(o1Y`u+9F*Y%{ASak1dv!p#BA?pE$j&u!_o0_WrzH5vRF=sE^K-x@9)Mm z>YY7=VdH+skVPU7xjh54T5rF0fDXEzOnr56i&LuS-OFtPod>W zP)M?w^eEOY>~%O7ut&*lD(BMRX<`d#w9*@Y8*5e{VXosJIr!|KQf1TM0FG~)ul)~A zlP|BY%}2u2SHyeM8!fji0F0OPMlBY8$nqx&8yo+vgF=2T^rc-*jvYvwP>n-4%TPA265CXbC5;IskQ)63z)kD5s^ z{0CLVt=}x>&zqW7T+Ef3nUROEf0K49&CO%S+yu}sW+_Hnu!#ss`U$y^`|Bs$j zq%QskTDeV%QX=05%M5gc-Jd>zaxG-Ljif>rFB$Fi0LWXL?OOU$P?^8#LwsJW*-aE~0uh^wt^S$*(RSdkt;0=yeZLp>6Z*z zF0s-SQm6%`EJ%guP=4NNyyGvekQS;$f?)S*$-NePHig1Nf_)}^{+$2nr}KI6#VhI9 zKh6Zb=P>|QF)O^%iC-~QG52Q1w{GYfuaG|efcNe+P`8y+;!JVSuq(`J(h;8RuKp2fQs&^md`3kBTDDOM z;DEP+N`C_g8sawiqR||&31M7G7}D(g+kHXUhQ4Fm&OE3=7*+p2Vwzb~6PpET&;Tr& zTPXmdADWykfVzSLR>SDg?l&hi)AY%2q}(iKETDPtQomV;wopF*u0S6Jm5|UWVw{x9 z`qlvo3<`n_Cb%p`wg?)Eh08ic>x9-=^dQbSENy1i!!lMAsVHp8lAZmuX0-b&{myxh z^NEf>7X*(Ga!2;)IY=2o4LU#OEYqP(&m)A%Ir$%zNX?B)+R#;n-`__`-beX zR5~|D$dnBylT{y$aNFE-wq3}MyT>PyklKTrhyWa=yAdPEZ#!>v$IrpZu|(7xkeN%k6pnOX=u8*71djqF}Rdv0n{vL zRauqS&1I)o)PH}A9;CJX{gW}?4CIq{4O&fmZA`@4I;n%B?V!{eD`ZQq)=mvadUOA+ z(rQ@CO?Jp+NGdCF zW{A<)udSbw=oMTVPYq`EXMxQ4q;f5|GK_UD2?+n;SN%NT)NXdr1_0ReBInQ1z{$`!gXR3K#VLj()$Dl}qEpuq~f*3@N8hkyJFr8Mc#U;v{G8N}r<;Y9(2y>T&0sTXT+< z)8*g#{L-Y5Wm*!~FoW;3vjKQ-Wvb*x&I$H4uo7dN?=O?!RaE~5fDMRjX{fc>aAt+n zqu|gY8IGjsTO{~717%-QKg2!q=*1RH{3;h{JKnOcC`tb=;+k?ofs;J)r8(oFt2O68G(^t}(l9ZukN zm8a@&Cmq84TV=i#N!oU=tiF(|i`zs10YQRf@`1Ls_2i9GOg-kAU{{&L$?u}8N|~!T zLRKx&iHT@RnzKOxIudYzfzE}ycM0CVph!DqUP4u(im|%p{PJzO|}7St?`*P2C3Fyv!>5q?8e|64$SN@-m^du;$#nY40d z8ubU-;h`}lT19j2=AgQe`VsgV2p^JVjv{^lp;*>dG6jDSffXPs21cP~v|pI!_DAm& z4!H%6RWGgeezHmYfelcsY4^TJaM)*!bR@A6#hvy)CaMPumPw0>fXflX1*bbj6EE&t zKr|dz;M=g0*Qi5>$TG?(=-W{=Gc;_Ns@yay_WZxDt|}x zjz%NnZX0GU*fuj64T{TOH8rXTw%Cp`p?H(N~_d$>?7}*a6;#@LefuQR$=5l0xU zwrCO`wX!3+BW|{PiHAT<{iWtBoW@jR<2Dq#!5umiPY1 zkHpRXD^Q1G)`9({;o2$P>whTt4JE%JfAjv5$y1QzI2u4=%{y>Gx61w%E>2#1TaTyWHuE&hqA?kL)^8qqbHBX_ft^kR*zFFw zhCQuvchHuW1z4XFYmP5A_Cq|@*ndSmD-n)_|J#M>qHU)M#;G&uvf5ik#FGu9M3ef( zIR0i67t&QVKk@JdC8#pw*Ph^+Nc=CCLIMxcer1f1kM!w7KD(=>4dx?SJ7(WIL$^r*-U0rc{l3RV_3`oPrSv38G zrlWuR_mIjC-O$b?&(*^ZHYTlCg96l_Z$0NToCc;Ry|%c0W1+n#rcswa*!-S-0$N$G zq9fU#yk5pO7BMJjMUk{B+)h?Rmf~q?0fz$F$*f;*7L=5eAC!tRjpi|M3Mwe}(Cbo~ zd#1J}d4a+G80fSER)W^aP4;yA^qLodMb|Fc5++N7vl&Xfmr2lM7}Bic%aJmHG;JCcaREZgSdzMofBT#Meouh?Xdij z=q-M%-A4?D5`j(3Q}RJd05?s|Uc8$Emcfl^Al*U23J zaH+%u)(+aNmn;pt=KW<-CcpzH{PaKxlqp(l_40>=f{Z=|lXl5EpjU10RVrwl6`)1covqMdE=0 zUY&B0KN%b}GIx8?w9dEpiK7(?=qR^QPxPL|b9=DCp0NM5Ux{n_CFJ_0kBe$2`qReB zGdkP@%6G&ylx8f~G#cyf(#9a^USRXHs&VCSIq-qoRoI@e-mIVQ1$KnGWN7X5*D*W2 zr(5|q7bkDZ+~wfX@L)*Mm7)I@CEr_!>h1Kn$k!uH;$;U$TB4=}c-r0;j4n4x^_*rA zJH)Vu56H*V!>(Q*;L!OB=QZ3nxFPMW?x36D>M>uTWmwF2hf}{A6>JDm z+`75DEYvP+mx&^oZ2sjOR(NnO|xTJy~m_)64LHnjyx`bRm}|BboZ_1v+PH@ z;~}jw_@QBFB8WhwJ&O@(1eNkKt~(S(8x`vYE|tn`TugHu4CDRK1&{$y$#cxzaCumFul_b~{1}`3t@V%|f(VIW_ zwqG<&@OFu@A2WV2_riY}_+?NYs?>ugSMD*z#M;2Vf){lm-W>0^>>|v(+1Z%rMOnZt zSU>&E>yvy7qA2ApFmXXuZG=UoNSQ|^pqudZGP$egA8W6H?v6j`qJ%ls3K1e>Om&m$T$8FwmW_lZ&m zs>7xcERo5ogpMg9wcm*j4__CMNOPgLA?)lEQu@HZII*rg*5>ypkB3*0?2wh_FDQ_p zhKz^^{1=U6DemNYhI?_StcZ0>&$0@U{Zz^zI~mSmVNkX9_{-tMC%%%PK~!&hprxcN zDQGNknO4{hhkTq4DbXeTHuq+~=C+$LrdAeGPZA6#_lRQwNyFNWiYy4b`a)uGnT~B5Pv4~urk4$YD=kGVYmkhlb6K`dprJd?5}MLVrp1dgCAg_wSJM6F5{ zSgAT1C)KGqP{+C<}gYOXW~?h8~?l%Ha$ATP|;qwbZKY(>LA)|C)!*Hl#MONGtB)pZ;ZgiS*5+<<>;Y>z$_mW5sJq7 z#hUkuBr->H^2)rSpwgqkMEL4_^aQcj15z+kb_t?ma6h#w4Y%EmpwjuzF$IJ&H1x3C za~+?*cKYZJ2@37#GwftzI#=83t%Qi~kSzPU*j;A;cK6Uff|Gt*6q|Q{9n5*{xF_>T zTR#A~n+B&B58x3&G=TT$&rS?1ntbcfK)&^8qJ1I*A4>(=bft$-9MxE}shrw}$RJI&S82i0xiECAn?y z3|30aGP&J%1{M;zsqXheS2CKz3WA|*G?K(=Rg6#Al%RcWoVH1BRAC2v{}So1XX8pj zmSARz)>?E2m@3ERnD0=Nq6@)-xsePi<#ufSK`LxdfxIDThSm4lYhcBGRAxw5@4?X1}A}{H4)n&PpO8OX!$6`?<#(r7HQKCBO)az za&D#dBq>6tHnX`o3ic=V3$uv45blAESoQ~GLO5W2-)c6k4qWOysiV`c9;T&+rvapP zc36j)fYoK*I;;)LSRhP}x&D`LKmD`#*KLHh4>U^PE@d;)6bS3fERzPZO16mZ3Su)e zbY(kvmjOYeL%Ujjejk3#b)Yt-^ISyF1+s(RwTBjT~7cwP)Tn17CKH~;Lhz>)sV ze8IVKXqK@Gqk;QoPNDE>jnPi-#8xsU^LeNK$8)B_N}A%$lt1ty4K?#F=JL;H?;WCF z0qT=3*OF9!rYw5vhsUq4y8i64{=GE-q1Jl(wn<$t{C$5z_a!=7(M_Z)#JHIzL~A9K z=5i-t6$B=aruKNB?&>Xy_J=e(RBA%=-0>kHY%_#u`Y$_VdW&{kyin4KY2)15x$ZIwlOP&|d*DE--FYSRnM{`IK z7lketyRKLyi*697EFyT4%+Il<&=DDd&r%M43n!1(6_r&}h`o_Y6Zsz7D3+3oy&4|s zT8n)o8i29>q!lh8yK@T^q_8Pg7(8PhH_ns!9zUUaUh$wzVZPp4YG zXoln|*jfO^$7~~)A|)|1aG3z{(JAx6SXVx^>Pg1vk!G?DXG|ZGWk`oZ;5lfu*YU6h zX)sL0bO{(}6pCxGI-?bi+O?@>Q4Z0;n4)%^=#7<_DR|QvpQyyl%B@r(c=!&;ho`BS zcn)eRP@PJ)hQm)_OsqcDnSQp)gl3Vi4lN-O&AGsIIu^^&ejPFIQCf+9ow+ZU>P-EP zDKjK2R3G-LiX&TesIcUD{l-2?NU+U)!IEdPUCPZAI>65_MlUNZM%OlaUy&(vhM!NW z$(aR*N)isX64V^xX-~H%T|*)Im~7>zIV6&oZk;=ck|D;Z;!_*(KzWI)%w&sFDt|m6 zR-6EQlaioK)fdW9NsUU*qB?^{piR|LA!g%Pz^BDrab}8dWe1}{@96v8O;17nva|=! zKZ9Y-?BcMk@X;zp?j!QBlM_wXPM>5=8w<;O&zmi;+~}i&l_#;XvHD+Gs-#KPCtCTM zDGArI5vDiugnE9w4Nn~VHM%HpJt@JW{j|WW8;J%hjiZuYyo})GCC?LaOXR%?*?WO5a>6H>WvG0*%7?{%9fseC`@hO8%qR{?c-Dvmvmv zTY_%hJiCF;ViP-`pQvf0oVZsbXfrxG8ujE)(Sg3Y_JyRbXyd6z&~6|?Rri_!%85DZ zL`%0CN>7U6P?zPPNJsbkkxy9+Tx}Ml5p%1;aiN{%z$^z8}&4bho6Hg0f~$ zhwu`kQ}!A~3~H-Q)I1fLvBM_g;4$#!a{JR-eF!n81F}(K9IfG!WAuFm_q!XObjm1t zba^{|Vmksy)r0_n{eaL0oB@}vOEbP z+M8a{;sL@%(j`2VW;~|ce1y&TC!?6C)eqAjH;GT+0~<+t=az_ zVJjM5tNe>mKUMx48$Ro+rU9s;QxK@67|eznx_-~}bv@6lMuB7in^R6+*Vt8RTSw)L zFcDH%Y4UuJj~LPV;5qT~#(n1lno~+%12ixs>*l}3Tfz;isSo)^>O*Y)qIeB(q}3|R zXy)S(?o>|8^fHa4gh^L2PC{U|dFib_R;OAz*h#W;`Cj6t$blG2f zoV!)T_A~>`i0aX}!~8jU^2a&0gUxPBN9QTG31u-UD|?JEw;a@Q?^JuBIDRe?I+MM+ zA`~02TtTPKRVx0?P;#B2DjH`YtU^;TYk=hvFxk$0}J5e$+xg7d5LauHw z=<|f0_{8P&xQ(k%lU{+VtZ8wrqOq{9?Jy@TRu=Re`PHrSS^zBj^B$dDRj)XSsLe^Z zor$uImvhX(DO17q>hGqxKjD*61FZ`&^oxE>?=7Mq40?F}Vv{R=zv-I3@K>^FJJY9~ zOzQa$9bb4AF9*+xK&7HYdNsyJKESCmqyRfP|#br$2lq_9_jnUP|@D!6O@@BVKi|}cW`&N6|RLh6Lk@& zOl2)&?|^u=iAgOCW3dX}av_KQO;-r}bwM@xJ*WaB-lad_<=yRO> zgMbUmu%CD)*aj@6-R2fD#R$^}m_-<)UjLS=1Xf0&&=OCUbum`yq@5Skdan82DT@dx zs#9_N`Mo}oOVsGhk-=m*Zp?tKmbBs16PCzUr5;dO9k9-_Z^5U49xpeCvhXXWmpWQD zafI}*a=hEDb=kudLZ58#0M}64M=W@i9a>;H4+-sW_B-4-=?{dAYTn;0%o+6WA4b5&a%f|y< z0<^%ak;oKegfmdVGCMDJ8qqc9zeMXfyuky+b84dVD`3+$HK_6@IB5e!m1KhY07eOk zLJKuN2llyn32e#IC#}Jy>4@>gR8%cQH8Rpx0Y8}?Cln&x_^VG3yDh#occ`l57PEm@ zWjzAJmsv-S1lSYL`_TJ$BKoFIJ^H|uKWj!i=h`J?Fri)RfO36>nc7GdT$^0@fW!X8 zBByiJXmKD4ZUdNa-+PELCmxd{ka)z}it_zM^}{!51`bDjiwSGw)y>>w@3_d;4-stv zz1V%cvJOWI^vY3&DXJ~&b`{g#ke{ns1r}8&3rWD%*T~i; z5xrN$?^%Jgp}~JcdIclgSmZp#1qEESDOUp30I8=_Zr=;hnU;(7%1>Q;oHPB`i7WhS zPW(L#L3uOB?#s`HoV>3T1fX#5+t1B)1C0hAoNmN-V+5%)0b)O;$9sE$4G!zOXxd$-va;hP|o9Yg)uRkJ^yqWYGK`{aiM-_9SmeQiV|N)`9>>_km{y8+s_f3z8RSvhh*g@ z^YOeq39eTnv$4HnEV_kz{ zTU0?E$m`kkm!0swkA{y3qc_+iW#m=s9<(0Kv=6%2)Hq)Q8n`{X=#{11Jjwv|>MPXW zOY7qnt+E6?4=S;B)~`JI0yom2oZp|-=b%$g==HGq~B*R7q$FXUkl7bw6}(>7YCXu+wB z71o*`9G|xc-3fip%+(OZ4KM^clyUy>>y zT?Z)6mt~w$+zdWrNiNPb&xz~&+hCqdc>wV7PYq>=SE^9iyZcv9J_{hQ*H}NdwDoh= z!pcmeML+g%(eKmow7!zC^DO>i;~E+Dmg*%OwrwFQggaTEwbQTvx`YZm`}+5V)wK6 zBZP)7LT22qhisEswk~Fax%<)$06rc*hix9c*qjAkN!y6q!*x5!$^zbN1@Xopi6KdT zH5|)o#QM2vuav5tc*xr zEb}`n@+4kmO#AA1o=Z4Pu-w&)7-`Wl^*3XjEt+MXek=$}zir4T60At1qD(B~U>(|~ z8uyMGUUR;rNo=Z0Lf{LD*=#;P-pA3m*SVzS$PeS(Qdqwi4aIRQ(esHxad98ujmliG zW<=rhksxHF*$xd7z)VJ-AVlmQI{V|A#s{?Oct#5*B}q&B!)rmMlyXa!G9HhypjfuY zfn0;Zaaal@;g(ih0D{zVRFq&+j_|AbkYn>Wql-d-&nKxYEt9u$p7OO=BL&C~^ywFS z?8Oo<_5OSLd^!hTo|i(<`6U*5&ALGouBkbMVEh~hlG*VeKwDZ*+twcEN&(M#3~{j! zas+fqOJY9i)oV(n0x3{?d_#^eOd(i4Ozc6lt0tzwlK7y3GWi4w0#mjMJKJ#Qs0JH$ zQQRmEqeGre!!tw1mYrm9z_%VO!{I8UhVKODs}kg`72Fx+sBK@qnkJzn z;i_af1;V@J0(Gh4ioh%0jXP}p2#IF+h6vJ=NTa{IFcaq2u3x2LWTY5PwlS=6-2DV~zJZ2IHcDJB)*h1i8om=mX?l75#ip}|PDG2+PFawhky+CT*(j3Z_!U8@ zUiPCnSS)v8{M3Tw{^O`0-jiTpZBK8ki{1?%p$gp$Oc`)PgNa z9RiI8c1PLnzj7|OLsCOtMZU`LZ1qGcu+xoA`LC8@8gF{VFPk~5*8=LOpa;{aoV9>X zh>LW_Vo~or29&U3uGCP>IH|KbpfKbR7V&GE3N;k*fs1f?os<4lzl$ZOE!ZS6eDg(| z2NA=Ryi4aG$q6OC-3uvx=cLZU@Z_OkhSCQ}nIRmRqc|`XjPdOk^qyl#|09zD?I%x9 z*SIamEuUK8L9CQswMP@rg*}}l{T00%>s{21AaSTZX-v3{{2cdqy?=m9iI;1dw6@nP zfAEP)rRp9wE?>De8{ytbXBSq^-E?2R55=EA;mbk6E+B5qpOt{dpgbbIU4>p<_}wMo zt`60~Mm+H4m2luM`46~$f+nMUGcNk#f}0+F?`ZmX|0gT@V3;k>sWXf1DHp*>oKa2F zKczd z+}ByPWkKaz9JhSk!gTth;!3j_VqJPRE@eS#xX^V9(Y+bd&#h_9l=+bGM>H;=Gxf%P z<0{O9Zqus8T)WC?UMGdzoZ<>=u8TuScHrM4Sd#36^RrJk_seHgD~+*sbGAL66GtUQ zc00y3jeF09#GgFL%Zr1asV|P-H?D*$yDe*{noGZ=9-OniUs+CraJpZoEW;Y;k~|Vq zzEeS`o&Z_j1^B~XHH0lKh2A&=S$l+DAU^MW8-3k8t9E6_{7N3J_^oqD+N__A-DpI+ zunx-4gAYBCA55Yc%t92+r%B|kghEfiPmKxLWHn&Odh8~X8b1X$;mNvAqDBW*HS8-! zx8gEA#~o2CjvB^XcxlHITil)pmn&;`Hg}&Y%jdJ&sr_%9RXrF=M+SDlLF(&2{?~Ek`BNaC3>V%QZLr$*_WPj(V^(G90VyfS9qu*Xoz+VK%EDH>t^_B#ROJIbntF1E*ZzJXtPt_RP8Y&>P0Bq3-}u))~vH9$WQBG+7pf z>{IFKeDT@C;X1A_|#1B3L|s9+$= z#}btWFfb}s;2u~2AHsjc45@GcJlI@6bEm!-#);9|7`Dn zLrMM-96z`00y%EPVH|x u@xJLt`hRp2yN3a7+>?Q|kpY+p2LBGXU5D6iVR>vq=WruuKxk_iSN|_ delta 42040 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 diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 19180c0..38c29af 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -14,8 +14,9 @@ #define _UPP_CONFIG_H_ #include "stm32f4xx_hal.h" -///////////////////////////////////////////////////////////////////// -/////////////////////////---CALC DEFINES---////////////////////////// +#define PM_ADC_PERIOD 1800-1 +#define PM_ZERO_CROSS_HYSTERESIS_V 10 +#define PM_ZERO_CROSS_DEBOUNCE_10US 3 diff --git a/UPP/Core/PowerMonitor/adc_tools.c b/UPP/Core/PowerMonitor/adc_tools.c index 8603ffb..fc49b7a 100644 --- a/UPP/Core/PowerMonitor/adc_tools.c +++ b/UPP/Core/PowerMonitor/adc_tools.c @@ -25,11 +25,11 @@ static void ADC_InitAllFilters(ADC_Periodic_t *adc) Filter_Init(&adc->filter[i], Filter_Coef); } - FilterLUTInt_Init(&adc->temp_filter[0], + FilterLUTInt_Init(&adc->temp_map[0], (int32_t *)adc_temp_quants, (int32_t *)adc_temp_vals, sizeof(adc_temp_quants), 0); - FilterLUTInt_Init(&adc->temp_filter[1], + FilterLUTInt_Init(&adc->temp_map[1], (int32_t *)adc_temp_quants, (int32_t *)adc_temp_vals, sizeof(adc_temp_quants), 0); @@ -111,8 +111,8 @@ HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, uint16_t Period) } ADC_EnableAllFilters(adc); - Filter_Start(&adc->temp_filter[0]); - Filter_Start(&adc->temp_filter[1]); + Filter_Start(&adc->temp_map[0]); + Filter_Start(&adc->temp_map[1]); return res; } @@ -156,17 +156,20 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc) raw[i] = Filter_Process(&adc->filter[i], raw[i]); } } + // Перерасчеты Напряжений/Токов в единицы измерения - for(int i = 0; i < ADC_TEMP_CHANNELS_START; i++) + for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) { ADC_Coefs_t *coefs = &adc->Coefs[i]; data[i] = ((float)(raw[i])-coefs->lZero) * coefs->vMax / (coefs->lMax-coefs->lZero); + ADC_UpdateStatistics(adc, i, ADC_LEVEL_AC); } // Преобразования температуры по таблице for (int i = ADC_TEMP_CHANNELS_START; i < ADC_NUMB_OF_CHANNELS; i++) { - data[i] = FilterLUTInt_Process(&adc->temp_filter[i-ADC_TEMP_CHANNELS_START], raw[i]); + data[i] = FilterLUTInt_Process(&adc->temp_map[i-ADC_TEMP_CHANNELS_START], raw[i]); + ADC_UpdateStatistics(adc, i, ADC_LEVEL_BASE); } @@ -181,13 +184,18 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc) /** * @brief Сбор статистики. */ -void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, float value) +void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t level) { + if (level < ADC_LEVEL_BASE) + return; if(assert_adc(adc)) return; - if (channel >= ADC_NUMB_OF_REGULAR_CHANNELS) return; + if (channel >= ADC_NUMB_OF_REGULAR_CHANNELS) + return; + ADC_Statistics *stat = &adc->Stat[channel]; + float value = adc->Data[channel]; // Первая инициализация if (stat->SampleCount == 0) { @@ -201,6 +209,12 @@ void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, float value) if (value > stat->Max) stat->Max = value; if (value < stat->Min) stat->Min = value; + // если не выбраны характеристики переменного сигнала - уходим + if(level < ADC_LEVEL_AC) + { + return; + } + // Накопление для Avg/RMS stat->Sum += value; stat->SumSquares += value * value; diff --git a/UPP/Core/PowerMonitor/adc_tools.h b/UPP/Core/PowerMonitor/adc_tools.h index bd22553..47fa0f6 100644 --- a/UPP/Core/PowerMonitor/adc_tools.h +++ b/UPP/Core/PowerMonitor/adc_tools.h @@ -10,8 +10,19 @@ #define _ADC_TOOLS_H_ #include "main.h" +#define ADC_CHANNEL_UBA 0 +#define ADC_CHANNEL_UAC 1 +#define ADC_CHANNEL_IC 2 +#define ADC_CHANNEL_IA 3 +#define ADC_CHANNEL_TEMP1 4 +#define ADC_CHANNEL_TEMP2 5 + + #define ADC_NUMB_OF_CHANNELS 6 -#define ADC_NUMB_OF_REGULAR_CHANNELS 4 +#define ADC_NUMB_OF_U_CHANNELS 2 +#define ADC_NUMB_OF_I_CHANNELS 2 +#define ADC_NUMB_OF_T_CHANNELS 2 +#define ADC_NUMB_OF_REGULAR_CHANNELS (ADC_NUMB_OF_U_CHANNELS+ADC_NUMB_OF_I_CHANNELS) #define ADC_TEMP_CHANNELS_START ADC_NUMB_OF_REGULAR_CHANNELS #define ADC_TEMPERATURES_QUANTS \ @@ -40,10 +51,10 @@ static const int32_t adc_temp_vals[] = ADC_TEMPERATURES; static const int32_t adc_temp_quants[] = ADC_TEMPERATURES_QUANTS; -#define Filter_t FilterAverageInt_t -#define Filter_Init FilterAverageInt_Init -#define Filter_Process FilterAverageInt_Process -#define Filter_Coef 10, FILTER_MODE_DEFAULT +#define Filter_t FilterMedianInt_t +#define Filter_Init FilterMedianInt_Init +#define Filter_Process FilterMedianInt_Process +#define Filter_Coef 10 /** * @brief Коэфициенты канала АЦП для пересчета в единицы измерения @@ -55,6 +66,13 @@ typedef struct uint16_t lMax; ///< Максимальный уровень АЦП (в квантах АЦП) }ADC_Coefs_t; +typedef enum +{ + ADC_LEVEL_DISABLE=0, ///< Базовая статистика - Max/Min + ADC_LEVEL_BASE, ///< Базовая статистика - Max/Min + ADC_LEVEL_AC, ///< Статистика для переменных сигналов - AVG, RMS +}ADC_StatLevel_t; + /** * @brief Статистика АЦП */ @@ -70,6 +88,8 @@ typedef struct float SumSquares; ///< Накопитель для RMS }ADC_Statistics; + + /** * @brief Хендл АЦП */ @@ -80,19 +100,20 @@ typedef struct ADC_HandleTypeDef *hadc; ///< Хендл АЦП // Data and calculation - uint16_t RawData[ADC_NUMB_OF_CHANNELS]; ///< Сырые значения АЦП - ADC_Coefs_t Coefs[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t для регулярных каналов (не температуры) - Filter_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП - FilterLUTInt_t temp_filter[2]; ///< Коррекция нелинейности датчиков температуры + uint16_t RawData[ADC_NUMB_OF_CHANNELS]; ///< Сырые значения АЦП + ADC_Coefs_t Coefs[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t для регулярных каналов (не температуры) - float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах) - ADC_Statistics Stat[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Статистика для регулярных каналов (не температуры) + Filter_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП + FilterLUTInt_t temp_map[2]; ///< Коррекция нелинейности датчиков температуры + + float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах) + ADC_Statistics Stat[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Статистика для регулярных каналов (не температуры) struct { - unsigned Initialized:1; - unsigned AdcRunning:1; - unsigned DataReady:1; + unsigned Initialized:1; ///< Флаг инициализированности структуры + unsigned AdcRunning:1; ///< Флаг АЦП в работе + unsigned DataReady:1; ///< Флаг данные АЦП обработаны }f; ///< Флаги uint32_t LastTick; // Время последнего преобразования }ADC_Periodic_t; @@ -107,9 +128,12 @@ HAL_StatusTypeDef ADC_ConfigChannel(ADC_Periodic_t *adc, int ChNumb, uint16_t le HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, uint16_t Period); /* Остановка АЦП. */ HAL_StatusTypeDef ADC_Stop(ADC_Periodic_t *adc); - -/* Остановка АЦП . */ +/* Обработка АЦП после получения данных. */ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc); +/* Сбор статистики. */ +void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t level); +/* Сброс статистики. */ +void ADC_ResetStatistics(ADC_Periodic_t *adc, uint8_t channel); #endif //_ADC_TOOLS_H_ diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c new file mode 100644 index 0000000..d456648 --- /dev/null +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -0,0 +1,63 @@ +/** +****************************************************************************** +* @file power_monitor.c +* @brief Модуль мониторящий сеть: Напряжение, Токи, Температуры +****************************************************************************** +* @details +******************************************************************************/ +#include "power_monitor.h" +#include "adc.h" +#include "tim.h" + + +HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) +{ + if(ADC_Init(&hpm->adc, &adc_tim, &hadc3) != HAL_OK) + return HAL_ERROR; + + if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UBA, 2048, 1216, 4095) != HAL_OK) + return HAL_ERROR; + if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UAC, 2048, 1216, 4095) != HAL_OK) + return HAL_ERROR; + if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IC, 2048, 53, 4095) != HAL_OK) + return HAL_ERROR; + if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IA, 2048, 53, 4095) != HAL_OK) + return HAL_ERROR; + + + if(ZC_Init(&hpm->zc, ADC_NUMB_OF_U_CHANNELS, PM_ZERO_CROSS_HYSTERESIS_V, PM_ZERO_CROSS_DEBOUNCE_10US) != HAL_OK) + return HAL_ERROR; + + if(ZC_ConfigChannel(&hpm->zc, ADC_CHANNEL_UBA, ZC_BOTH_EDGES) != HAL_OK) + return HAL_ERROR; + if(ZC_ConfigChannel(&hpm->zc, ADC_CHANNEL_UAC, ZC_BOTH_EDGES) != HAL_OK) + return HAL_ERROR; + + return HAL_OK; +} + + +HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm) +{ + if(ADC_Start(&hpm->adc, PM_ADC_PERIOD) != HAL_OK) + return HAL_ERROR; + + return HAL_OK; +} + + + +void PowerMonitor_Handle(PowerMonitor_t *hpm) +{ + static uint32_t last_zc_cnt[ADC_NUMB_OF_U_CHANNELS] = {0}; + ADC_Handle(&hpm->adc); + ZC_ProcessAllChannels(&hpm->zc, hpm->adc.Data, uwTick); + for(int i = 0; i < ADC_NUMB_OF_U_CHANNELS; i++) + { + if(last_zc_cnt[i] != ZC_GetCrossCount(&hpm->zc, i)) + { + last_zc_cnt[i] = ZC_GetCrossCount(&hpm->zc, i); + hpm->ZC_Detected[i] = !hpm->ZC_Detected[i]; + } + } +} \ No newline at end of file diff --git a/UPP/Core/PowerMonitor/power_monitor.h b/UPP/Core/PowerMonitor/power_monitor.h new file mode 100644 index 0000000..ad34cf0 --- /dev/null +++ b/UPP/Core/PowerMonitor/power_monitor.h @@ -0,0 +1,32 @@ +/** +****************************************************************************** +* @file power_monitor.h +* @brief Модуль мониторящий сеть: Напряжение, Токи, Температуры +****************************************************************************** +*****************************************************************************/ +#ifndef _POWER_MONITOR_H_ +#define _POWER_MONITOR_H_ +#include "main.h" +#include "adc_tools.h" +#include "zero_cross.h" + +typedef struct +{ + ADC_Periodic_t adc; + ZeroCross_Handle_t zc; + uint32_t ZC_Detected[ADC_NUMB_OF_U_CHANNELS]; + + float U[3]; + float I[3]; + float T[3]; + +}PowerMonitor_t; +extern PowerMonitor_t pm; + + +HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm); +HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm); + +void PowerMonitor_Handle(PowerMonitor_t *hpm); + +#endif /* _POWER_MONITOR_H_ */ diff --git a/UPP/Core/Src/tim.c b/UPP/Core/Src/tim.c index d273fef..943d2fa 100644 --- a/UPP/Core/Src/tim.c +++ b/UPP/Core/Src/tim.c @@ -188,7 +188,7 @@ void MX_TIM8_Init(void) htim8.Instance = TIM8; htim8.Init.Prescaler = 0; htim8.Init.CounterMode = TIM_COUNTERMODE_UP; - htim8.Init.Period = 1000; + htim8.Init.Period = 1800-1; htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim8.Init.RepetitionCounter = 0; htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 47b7416..7f56710 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -5,22 +5,10 @@ ****************************************************************************** * @details ******************************************************************************/ -#include "main.h" // либы из AllLibs и вербальные имена из CubeMX #include "upp_main.h" // всё остальное по работе с УПП -#include "adc.h" -#include "tim.h" +#include "power_monitor.h" // статистика сети и АЦП -#include "adc_tools.h" -#include "zero_cross.h" -ADC_Periodic_t adc; -ZeroCross_Handle_t hzc; -uint32_t ZC_Detected[ZC_MAX_CHANNELS] = {0}; -#define ADC_CHANNEL_UBA 0 -#define ADC_CHANNEL_UAC 1 -#define ADC_CHANNEL_IC 2 -#define ADC_CHANNEL_IA 3 -#define ADC_CHANNEL_TEMP1 4 -#define ADC_CHANNEL_TEMP2 5 +PowerMonitor_t pm; /** * @brief Инициализация УПП. @@ -28,17 +16,7 @@ uint32_t ZC_Detected[ZC_MAX_CHANNELS] = {0}; */ int UPP_Init(void) { - ADC_Init(&adc, &adc_tim, &hadc3); - - ADC_ConfigChannel(&adc, ADC_CHANNEL_UBA, 2048, 1216, 4095); - ADC_ConfigChannel(&adc, ADC_CHANNEL_UAC, 2048, 1216, 4095); - ADC_ConfigChannel(&adc, ADC_CHANNEL_IC, 2048, 53, 4095); - ADC_ConfigChannel(&adc, ADC_CHANNEL_IA, 2048, 53, 4095); - - ZC_Init(&hzc, ZC_MAX_CHANNELS, 10, 3); - ZC_ConfigChannel(&hzc, 0, ZC_BOTH_EDGES); - ZC_ConfigChannel(&hzc, 1, ZC_BOTH_EDGES); - + PowerMonitor_Init(&pm); return 0; } @@ -48,7 +26,7 @@ int UPP_Init(void) */ int UPP_PreWhile(void) { - ADC_Start(&adc, 100); + PowerMonitor_Start(&pm); return 0; } @@ -64,15 +42,5 @@ int UPP_While(void) void UPP_ADC_Handle(void) { - static uint32_t last_zc_cnt[ZC_MAX_CHANNELS] = {0}; - ADC_Handle(&adc); - ZC_ProcessAllChannels(&hzc, adc.Data, uwTick); - for(int i = 0; i < ZC_MAX_CHANNELS; i++) - { - if(last_zc_cnt[i] != ZC_GetCrossCount(&hzc, i)) - { - last_zc_cnt[i] = ZC_GetCrossCount(&hzc, i); - ZC_Detected[i] = !ZC_Detected[i]; - } - } + PowerMonitor_Handle(&pm); } \ No newline at end of file diff --git a/UPP/Core/UPP/upp_main.h b/UPP/Core/UPP/upp_main.h index bc34d36..5ba7672 100644 --- a/UPP/Core/UPP/upp_main.h +++ b/UPP/Core/UPP/upp_main.h @@ -9,8 +9,11 @@ #ifndef _UPP_MAIN_H #define _UPP_MAIN_H +#include "main.h" // либы из AllLibs и вербальные имена из CubeMX #include "upp_config.h" + + /* Инициализация УПП */ int UPP_Init(void); /* Инициализация основного цикла УПП. */ @@ -19,5 +22,4 @@ int UPP_PreWhile(void); int UPP_While(void); void UPP_ADC_Handle(void); -extern uint32_t ZC_Detected[]; #endif //_UPP_MAIN_H \ No newline at end of file diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index 5a030cf..082976d 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -342,6 +342,30 @@ 0 0 0 + ..\Core\PowerMonitor\power_monitor.c + power_monitor.c + 0 + 0 + + + 3 + 13 + 5 + 0 + 0 + 0 + ..\Core\PowerMonitor\power_monitor.h + power_monitor.h + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 ..\Core\PowerMonitor\adc_tools.c adc_tools.c 0 @@ -349,7 +373,7 @@ 3 - 13 + 15 5 0 0 @@ -361,7 +385,7 @@ 3 - 14 + 16 1 0 0 @@ -373,7 +397,7 @@ 3 - 15 + 17 5 0 0 @@ -401,7 +425,7 @@ 0 5 - 16 + 18 1 0 0 @@ -413,7 +437,7 @@ 5 - 17 + 19 1 0 0 @@ -425,7 +449,7 @@ 5 - 18 + 20 1 0 0 @@ -437,7 +461,7 @@ 5 - 19 + 21 1 0 0 @@ -449,7 +473,7 @@ 5 - 20 + 22 1 0 0 @@ -461,7 +485,7 @@ 5 - 21 + 23 1 0 0 @@ -473,7 +497,7 @@ 5 - 22 + 24 1 0 0 @@ -485,7 +509,7 @@ 5 - 23 + 25 1 0 0 @@ -497,7 +521,7 @@ 5 - 24 + 26 1 0 0 @@ -509,7 +533,7 @@ 5 - 25 + 27 1 0 0 @@ -521,7 +545,7 @@ 5 - 26 + 28 1 0 0 @@ -533,7 +557,7 @@ 5 - 27 + 29 1 0 0 @@ -545,7 +569,7 @@ 5 - 28 + 30 1 0 0 @@ -565,7 +589,7 @@ 0 6 - 29 + 31 5 0 0 @@ -577,7 +601,7 @@ 6 - 30 + 32 5 0 0 @@ -589,7 +613,7 @@ 6 - 31 + 33 5 0 0 @@ -601,7 +625,7 @@ 6 - 32 + 34 5 0 0 @@ -613,7 +637,7 @@ 6 - 33 + 35 5 0 0 @@ -625,7 +649,7 @@ 6 - 34 + 36 5 0 0 @@ -637,7 +661,7 @@ 6 - 35 + 37 1 0 0 @@ -649,7 +673,7 @@ 6 - 36 + 38 5 0 0 @@ -669,7 +693,7 @@ 0 7 - 37 + 39 1 0 0 @@ -681,7 +705,7 @@ 7 - 38 + 40 1 0 0 @@ -693,7 +717,7 @@ 7 - 39 + 41 1 0 0 @@ -705,7 +729,7 @@ 7 - 40 + 42 1 0 0 @@ -717,7 +741,7 @@ 7 - 41 + 43 1 0 0 @@ -729,7 +753,7 @@ 7 - 42 + 44 1 0 0 @@ -741,7 +765,7 @@ 7 - 43 + 45 1 0 0 @@ -753,7 +777,7 @@ 7 - 44 + 46 1 0 0 @@ -765,7 +789,7 @@ 7 - 45 + 47 1 0 0 @@ -777,7 +801,7 @@ 7 - 46 + 48 1 0 0 @@ -789,7 +813,7 @@ 7 - 47 + 49 1 0 0 @@ -801,7 +825,7 @@ 7 - 48 + 50 1 0 0 @@ -821,7 +845,7 @@ 0 8 - 49 + 51 1 0 0 @@ -833,7 +857,7 @@ 8 - 50 + 52 1 0 0 @@ -853,7 +877,7 @@ 0 9 - 51 + 53 1 0 0 @@ -865,7 +889,7 @@ 9 - 52 + 54 1 0 0 @@ -877,7 +901,7 @@ 9 - 53 + 55 1 0 0 @@ -889,7 +913,7 @@ 9 - 54 + 56 1 0 0 @@ -901,7 +925,7 @@ 9 - 55 + 57 1 0 0 @@ -921,7 +945,7 @@ 0 10 - 56 + 58 1 0 0 @@ -933,7 +957,7 @@ 10 - 57 + 59 1 0 0 @@ -945,7 +969,7 @@ 10 - 58 + 60 1 0 0 @@ -957,7 +981,7 @@ 10 - 59 + 61 1 0 0 @@ -969,7 +993,7 @@ 10 - 60 + 62 1 0 0 @@ -981,7 +1005,7 @@ 10 - 61 + 63 1 0 0 @@ -993,7 +1017,7 @@ 10 - 62 + 64 1 0 0 @@ -1005,7 +1029,7 @@ 10 - 63 + 65 1 0 0 @@ -1017,7 +1041,7 @@ 10 - 64 + 66 1 0 0 @@ -1029,7 +1053,7 @@ 10 - 65 + 67 1 0 0 @@ -1041,7 +1065,7 @@ 10 - 66 + 68 1 0 0 @@ -1053,7 +1077,7 @@ 10 - 67 + 69 1 0 0 @@ -1065,7 +1089,7 @@ 10 - 68 + 70 1 0 0 @@ -1077,7 +1101,7 @@ 10 - 69 + 71 1 0 0 @@ -1089,7 +1113,7 @@ 10 - 70 + 72 1 0 0 @@ -1101,7 +1125,7 @@ 10 - 71 + 73 1 0 0 @@ -1113,7 +1137,7 @@ 10 - 72 + 74 1 0 0 @@ -1125,7 +1149,7 @@ 10 - 73 + 75 1 0 0 @@ -1137,7 +1161,7 @@ 10 - 74 + 76 1 0 0 @@ -1149,7 +1173,7 @@ 10 - 75 + 77 1 0 0 @@ -1161,7 +1185,7 @@ 10 - 76 + 78 1 0 0 @@ -1173,7 +1197,7 @@ 10 - 77 + 79 1 0 0 @@ -1185,7 +1209,7 @@ 10 - 78 + 80 1 0 0 @@ -1197,7 +1221,7 @@ 10 - 79 + 81 1 0 0 @@ -1217,7 +1241,7 @@ 0 11 - 80 + 82 1 0 0 @@ -1237,7 +1261,7 @@ 0 12 - 81 + 83 2 0 0 @@ -1251,7 +1275,7 @@ ::CMSIS - 0 + 1 0 0 1 diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index e3192a8..02feebd 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -450,6 +450,16 @@ PowerMonitor + + power_monitor.c + 1 + ..\Core\PowerMonitor\power_monitor.c + + + power_monitor.h + 5 + ..\Core\PowerMonitor\power_monitor.h + adc_tools.c 1 @@ -915,6 +925,12 @@ + + + + + + diff --git a/UPP/UPP.ioc b/UPP/UPP.ioc index 5ea9b96..78d8d19 100644 --- a/UPP/UPP.ioc +++ b/UPP/UPP.ioc @@ -474,7 +474,7 @@ TIM3.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM3.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4 TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger -TIM8.Period=1000 +TIM8.Period=1800-1 TIM8.Prescaler=0 TIM8.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE TIM8.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_DISABLE