From 8f4e8b627b81e779765a2536c06fbe6bfc653ca1 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Tue, 11 Nov 2025 00:36:15 +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=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D0=B5=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BD=D1=83=D0=BB=D1=8F.=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B3=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=B2=20=D0=BC=D0=B0=D1=82=D0=BB=D0=B0=D0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +заготовки для статичтики АЦП и глобальной переменной микросекундых тиков --- MATLAB/app_wrapper/app_io.c | 8 +- MATLAB/upp_r2023.slx | Bin 66731 -> 66987 bytes UPP/Core/Inc/main.h | 2 +- UPP/Core/PowerMonitor/adc_tools.c | 60 +++++- UPP/Core/PowerMonitor/adc_tools.h | 37 +++- UPP/Core/PowerMonitor/zero_cross.c | 333 +++++++++++++++++++++++++++++ UPP/Core/PowerMonitor/zero_cross.h | 166 ++++++++++++++ UPP/Core/Src/main.c | 2 +- UPP/Core/Src/stm32f4xx_it.c | 7 +- UPP/Core/UPP/upp_main.c | 22 ++ UPP/Core/UPP/upp_main.h | 2 + UPP/MDK-ARM/UPP.uvoptx | 156 ++++++++------ UPP/MDK-ARM/UPP.uvprojx | 10 + 13 files changed, 718 insertions(+), 87 deletions(-) create mode 100644 UPP/Core/PowerMonitor/zero_cross.c create mode 100644 UPP/Core/PowerMonitor/zero_cross.h diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 4050af7..17fe31a 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -52,7 +52,13 @@ __HAL_TIM_SET_AUTORELOAD(&adc_tim, ReadInputArray(1, 0)); */ void app_writeOutputBuffer(real_T* Buffer) { // USER APP OUTPUT START - ThyristorWrite(Buffer); + //ThyristorWrite(Buffer); + for (int i = 0; i < 2; i++) + { + WriteOutputArray(ZC_Detected[i], 0, i); + } + + extern ADC_Period_t adc; for(int i = 0; i < 6; i++) { diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 1fdd5ace8f7293d085e9dc6db8d561e00ed27288..f972bdf21b86d07c70c1442b185ec8619f6e2c7b 100644 GIT binary patch delta 40253 zcmZUaV{jnBx`tyr8`~S(wr$&XHkvpa+va9tZM?Cwv2EKs=Mcz`O#I~ zHQjH&Uqu8&MHB?Ok}Nm`JqQR0%vX?r%+q!i$u>Y6Qh|bvD>N_}sbPa}mzgAmdx-!W z%%_M;LaLCxM4yUp$cZSJpX?trAEX~p={xYSgdf}=tcOA6I};%E#!zDE!m4TioL2vJ zGY7|{3u{9Di?={9_$2(+YkBqPnIzU@GoGJdPpZaBhuDA43T`Pe8;!#T%KE0s@&Xj= zY|BdPcYRnMzvKyNz7e%bFn-{*%ETG#)kDMWz1%)s%K7O52BP*>JTh}(4mUGmY1#Es z3fo?bF>^Nr+P%%DUGcH$H+)o|)q3XeaV=#rbmAME{El$_b-_1>Jx;r$&+ zPJXjvG9_x_96FN2D{}a9V;_6wyxdftlk;5f${x(Htv$vkOC)!-|HnZ{6T4_r0Y=LX z=FS*MHK5d;SKa|`PuL$QkPH)04{nr|On?J#8BFcsi;W%V+6^N@j9uMNziGdlczLUA zw7@>kBt8$x^Xeds0SBt&cr7k84Ev)@J9mgk_F1SFBM>raEKdmmTAi9F->VuMp}f}j zQC~Sj%87L{D9!Tj~9`3!sHb*D}eVc%u$k zD;I2)GlFMWvH{WB2>Q9aU-4v05wcM)_?O$5S0&0us%Rt>eDT9XH0PPvD&O6{FcT`V zPI6srrN5(j#L)rzCayPj8H~;#dp*YD&tEb zg^{_~-(|_)$&it&l-#9`0*(ajc?k`k1V9U2LW?3ngRi4V6(Pqom8A=pq8munf=$qh zrLV&!twYl#O+!Z2j$ve}oOim;Ld05e*x|%ysNDbRAYmRx!`t%fy&d$0{vn#E z0oBg?%fMzqq~i1%U;Dw-g4{ZADBUrzI~8?zIlq+~g638wtvDn1m&&?yBZ*BFxRlQP z{YXAO=aXo0!Y|EwpIe;a{l&Y!_+}ED=G6a>*;8pkx#%{A2rrKb1}H40-L;G2v&Ed` z><{uX-t8MRr6B0&AAEGEVBuF7qaaaoo%9~)3X@cLrs5rZ*t#VIQ9SgY8O37$Q1 z(2QfccJ!Pnfgma#YIJI3v*{}Zhw*jaGTE*?sgo_2TY=99E&q0@4E2-9qB_$1J>@x^ zzdxX$7{D8U*Oeh$UA(z6o4sTNSdJ9XLvZUBcJbuh-6mKf zW!Z8ItBbRRoNpqc_k(Jb^r4*>Jrv4Vl|9v+gfcsMr{-eW<_27)ez@!?AzM3xX{+ra zk0>2d1*cPU-Gwv0g;GA7iGCVO2VMa`?xT0_`tmFSB>2$M8?D>v!Cl zA240j0)JoLPP%&kDAouB`#gQPwgA^IFJSUrL4tyvM#}qb*ls-4tVWdQ+ z@9R62W3Hj^o5z#0X_|RK-IpjZPunMqvqY$RK1iX0c^@E<{uVvU*t<4;y$JCS2^59Z zze~S^=je^J)rMj^e)Ds<@`#OtjqalREp+EEoSf&+`wmrYjQjDP^cg7Cn+MdUYUb(r zA#wT(&DIEqV#&7DbP8QvbFT&WFTYI35(3K4^AJBC?&(Gb!wg; zky3H^cl7u8LGprKinIMQ0RhO~UUlFhzOq!2HRSevLon=wj(R4GzgwP9D+4Vp%Q3le zmk*4Ta3FIFMUc}Ebg@fiqRo|K4dA@=0`+EX4N7BaX${!_+`9^u&7roVy=|^w?1sxV zRqx*Tj222z90?_g*w&>HuG;aqs+uK@--iubitdR&t09~&^*?^TCv_f@GV5n0 z_^icUotnr4Dcyx#(v5&^OtQnm>d}*9MB2+cAh1eQ9srLPk_7?l48a89_;{bsTf;T9 zgFjk?YBOf1w!`1tqJ(_>M6xs11hd8mYp&|z%n6gN@H&)K3CHu_JQSSN!7>?gtoLHmqusGsaO4|Ed8eq$A|Z?e!!+G<`|` z0^u>AHfuVG7w%*B?=sJdq zg9ufiQQ)F#Q<3db&;6|K<%B!;{GLZE-*s5$XtzM z@)|~x;ivN4qUy%O1mlVzpHLa0DVa}IQH+f?@look`#NF&J14&Q%nwh!y2~yq&h~uo zYVyy~ib|P__vFLNeCul6I64K=zlgGbP@Y9S{W!Xf495NDo2|mPm|?$>C3f)$QFX11 zyN}puY&dV1fYMt)RPc(-0-o!=o!_BXE|qj+=Bb>)`Un; zA)vB+#;W(3-j{$t*eK1o%M;Q3ifs?5o@4hb@3Gm;geyCp#nML1AQ`atmRIr}e&$$$1h=_`7B zXP%M)0tA0DFJkhY(hlaa$T;I1^T$osp=!3cE;Lvzb?@<&3(mjKG3Wyq#r<6!4W3K( zNoJnSSf%&b%L3U$h)CzulDlSwNW*+(f6s^!&0W#i^CCvY*eGm!o&2wb7xSwxCoKXK z;4&^9Ru?T{M+Vhw9p+z-@|PaEVW1@$yr&?6UYvIH=Fa>pUk4Mp!v#4{UA9S56$^}% zSCE#Y)!RLUec56P_Tt@<->M&5a=3huL^33Uu_00}h5}b@Y9@R}@$UQ9Qtw+7L2ae7 zWeTb24viiH9mnwD6?>ZpH=lKlAaECp-?Z6kYyIEzXU`TNkxnkx)|;v+0~~UX6S*n@ zL!@sbT4l0h`p?<`_!EbmeKZs~V-T*mmN>ZLaw11Kf-3H-t<*#B>>pdU&Ep58mG_s| z`@a^=pI7;_LvV{L_E7TlMaQUqJvCxX*%M+EG%;d0eDI0t~j~p!(3}KJayg?yGr3lj~($Ifk`1uK= zw!JG%M{GAwmv>L(`{!`%VU40a%-sr%a)@r%pz;%>hQfB53ip7a(f+p@pM5KIRtGCn zdhYii6TB^AXQ$cKA6*R!DL?f406Z-3pr?ba+U8hqy;T|`BCk!rvAU7KF~{Yvw9 zy;rWG`4H|Y?Xj2Ehk{rxLL!RX$uQq{*MsLX90g`h9;XE;rXCp8x{DW=<>2Nl$siGafr+KeI57;tXhtztz>9)bCPPL5 zQj#eudiLl(BUc7HV{7)w1xIMA8K%k*@0mS3a|yia9EI~p+#O}Pl&$ZCN&?3;G+J+= zZ`Fb3>gwMHS$z&UdBGWT)wXLR7Z=iFBbct<_Cbf?a_Oen{mbsW=5M!1JKM94{;saO znnd<*Cz|AO;=1yS17mnyK-D8&KB|EiKqt5?f|5U`wKRmcP)>M6dQ4N!e)8T_JhoEn zNb1a0yYP`OCKE`}E|k4PrWsh0C@fP=l1WOP+7LMaD`=seIt$G&SI5gK09q(P+1l8@ zFFA2>vj!c0{s8TTaTHuF@C3q0w+Ho5SgnZLhY$NEy}eTiP|~~u3Cu`i0e=vsU3gOe z9PN)l&TxAm*MA!ER)G_qCEnt);ovq!F9V)x|V6 zTqV_KR<$I{+w2@Wa4#lMLY2Q*8^xnR!EH8BMUHP?t2Wage;4LvQtJU0P7KXciLRZJ zdSJV=6(}H0m`AY&KXv{GqH_~XUYsx2m7C0^Kro>E-}{7-PS)a|+oE{X<|?d8S*|W!x4v{7SZOm!DbyX2ECs1UX*HEwfSqi3sSXw1U6GwG$#r}g zF>N?djOkht2yP51`a3D2P%BVV?0v3)t@G+sB8Kfhu@F5Eq)$6j7wx63CO@MLq;MA@tok26F{2_4r1~s(5B`7e7g*v*4dD9&ArcqFvAY;2@sLpy|D9l=# z+R1>j05|j!sI4lt+-q~ONO;DcmhE<=m-IIUt@o(Ey)_<#QAgQ(0+tXoH|Z$s{$~#4 z^o#Fp?B618u6oLzy*@BeJ9%77>Xu&l{Ms(xXYu+v7xyLm2TvQHYv~|RmY`@_s$nSXC>&nJuIXjJ=4E3eXn4>}^emLUA&U^5 z6(=+{Ktei#7SG{Z^-jIgWyhvPAt*e|K8al=W;l%AmP~rtc>}8Q>SSv8%7=`VRXscW za2`G4_GXj;^>Rg~oJQ-89HEYYFJ6E-YddE*@f) zPU<*Vq%I`<_y!U>e7vBlX~2z!a9`hFowOJjfRsd)Mk<1~F5=O<-A)1&tlkcavQ>Mp7re4m!hI+31JR{Y;Kw&qQ80;+)Y52(Lf=qLn4X> z$v7y5gqq}p0xOJ6KJ)v;AoeDcp}#v)u+2T-+3^Jg*hK_@Y4(V<8`QWjwbY84jfSZM zdp1u-6lAuP8X|p2WQe>tv$YMlxGR!&7ic$@IGQ5P6-EWBmhiMBKq{S(Gp%vK(69*O z>K5*(E+nEp$I#UH0;8Me4yF!0hibrEMm@-W)!;XtKbS@A0U^--n^#^?RhO(tFE79RJ4^M8Ymk@e+o7uhfWZAW{URL! zh2>C5FF}q+ooDQ$d@h_ND}phB6h zSsp{5AE!t(k_8s-EAsNB*^84G%^*Nfid`8KXKhd2-U#`0{VY4MCIpk_1Hmsi*R zLf^ugU+0;z(@}}ff7B7YulCAY$fI^eibB_%6)n72sjabdyG^`A!jKe=YIy_aFT8Uk z-(Q5IP$rpi^CUF}F{S3oGH@7v%JgBv(=}-g&%k10Mi?h-6m?G zU+kZW+Wr^&XQXESUpDZChE3E4zEH1;S_;DMD_pR=y4GLrDESnYKflqws+qdqG*R;E z4Q^`cP(|hS-maKMG?q4M=3mt>Q#HL@>l608675zkbi|z7O2YMA@4cn4AXgU_b`H1? zF#*6p4xoV==6EC$c+M*YWs(16o%qzurj}|_-j$OZJZSzYka0g=Tx{Yi2M?lGN(+KN zh6Xa!0;O~<$5)TYjAdqS7pBIaxV#foriPGcZ5#k^h$A&iti1rmwJ-o$s%^_KYi%2A zzL9B~(NfKRGSaS@&CQy55I<-EduUEZ{ev@r6|j_6*--%bPq)>!H=`kQHXS@OgbcHJ z4&yqo?j4B<^%moZoU9i|^x;@tW%ZR6ngdgDU8myj;+dxnf9mX>$KJM*$}7FH#`P)d z%fzc(N5}Kux4~r?nGj-0n9RT52EsenBt+Blq}%H33DP&#?FlZROs+-%|^)H)& z^RPQPLaEh<-!WKN1~^ZV?jiWCZHU++=ysRVzjn3~x3{LbUtSh;rO;Tz&)zzV6L$Cb zB}b5bt=1mM|7^sfQd9qs6?c*ui+^o%qrs#65e~uYH*pLgAOyjjw#J~Kfy)}6nJ1{ZP`obwdh~C_N8u44J^&F#ue}xaI3FKmx#e(5Fq*DRk*Bc8ua$?qIvnXzdQj93E>)TdVB zmB&XdW2`<5zDl|p7R_Ux%iA6e!K>CxJ~}Q}+7(4e@jz4@>KKB9 zeOFI37SUr0hS8}Lt;X=fZ@uL}1yE-XC(otr3p1Ezzy7toD`hom&&XX@{tqhxmJ%+V z%ejnK6<;3p(f*@gh*|7-YI(rK`>g-29-gJ`-*{b?zOCJ#^wt3?A@d>oUkfI`u!sbc zaLf*cNG+Bwe#m49JF+6rTt!G`^vL&d)U(BGFt8e+Bs2|CU9QHSUX!Rs5)u(j_KhNN ztA4M@B)2?bBD=7Fef}O=x1y|J%08Hi)}HcIxs_1bQ;oPAq<%I)Lu3yO!>NnelKy#6J~}m9O@~a1NK*4P)xFoi%`|Gd%F0s7=9M@10-)XP&Pe@ zFNyzs?C$kgarScRF6;PF6OfoC`ZZberLvrzptro7-?bmhvc2Ol__6p2yc@stc3!i$ zy|}%&y!6cGuLA)YZTA$@8vh2094Y+3|vP zdU;0?+GLOHNaEWhuC9VFa{aYPC~_EoQ2)7Ia1F<)69$n8GtrQge$Bl zemgV$RiLcn5`t?yPj!STKMjpOJEtZ&zdo%s`!)INwECJ@G|<`{lAB|b=o!o;#WqHUiYyhkXjknQ<=YB(w0RsYps(XVCqJwcsZQ?K0zfIfXG$WMLxQ5Nnfrnnmm{t}OK~XIg6XdMofqL&F0J4A-6dZtir!)(6x1*5 zcg%D^aUY&s1Sjj>v>3@cEsLD>ne7z6ysF#}U*P4F*yi}s#qxu z*f0=!guJ8ZdmE>5#OW94)DN5H-@CmtPej}^4`87{?!;e9(oTe=KTL8lk^gpT!9%O$ z5#EbB=7jNo$CC&FpPeKz2<_$yFa1OhNF=T9%>DqcZV%N8WYc@j2&pqPP4EbT(`Hio z9?`#KXz(7~6 z&kK|`#0^o5*)d#6&qWMcKu8{b8&Bw^2Fxd)f9s>?j70{;QWVREmGUKp4bM#}@dOGG z{w+!Oe6X!L(EW9gM9BYsU= z_Wh$x?Hdq7BcmlO4!c-V7-FlY9Ezc)w%zs>xaw-okQnM63>fOZ^B5`QTiR2AcvgCX zC?~It-s=*gTO?-3ICZkl-2vu@PMD+XN=+BKYfon?=vwx}Vp+Mt7>a|!tF4-PjX4VE zuXpzH@Dtl1CTLFbK7G*Ms5gcdsDm17ZHHP!GVC%$jvEw&V5-WPgl^015vOPV8a zqank#+YuA#6;xwy7glX=BnCx*N?R#IV18(5r&MxDi%1*3|kPZ}W=;OtATYz^?@HNw819ZbYk?gE#J^qALU zz%m@$H`#fKALjK-Uwm3~2zb1Na_YtyyPv$AVIyIEzPKDN{j_|+zYOkpv3tSS_lqnw z)c5nhXMCU>$}1IY(d7aF%G0g91i#FNcNaXo*{&@FE^Y&1Dqj9i7}Bo1P9aTz*mmA4 z<%PAw`vZFTZTxPig7IpljsEf^irZTEr`<}w>}veZ{v95Qyo>*K(&NKm@W@C+vEan! zLFCtkLaWMfWOI@W{PJCFIW2%vt3Fy;#1BsAyB|&J zk_yaKtX`hVw?X*FDOO!(jaFtGr4$v7C=DAMO%EWS(aru_?_Gvu7nmDh*PB1x-vc-m z1FZKQwX>Ky+$9*^g_`Jg3D6A{^BnQFwU#qYDv#T|et@sZerA-7dBOK!jyjU8#W*TO z{=rRN7g#gN$KVDm9=;}l(~>RG!^=9M|JoMk&oM#a$0=V}zmJI*Y-H0V0u)E8h&pTD zXNzlh^JN=R;)xrL;6X!;Z(pZ+up+^ed?SNRo~}u>PW%Ze2pVtBK6h_gH_VOc^Jn_Ie4q7?xDyTPIrV|!aSz$2O zA8v3*As4&yKijnxj66+b)#LiI>g4qf{VW7n!A65%R7{0xfL_Rfk zTV?g%g4N8A9R$BLmV7d>1BCTY;;|oyLG%P>l~pCTps5?gu6fS(zRoC-yj<~OS#7#U z2fbsa#O46|-^T#DiXHg7i&Y&DaeEiD(&8uq@U#$BbMs9QH;w$;kl?>y*xH~zv zeV6H8M-N6j#5-1EE|QOJgBbQ<5oFD6dwr^)?i*3&>}lD>BM5?bsFcAf!|?O)?6&=@ z?2O^vT)Q5OYH*G!IZV*0CTM(4#OZj~+xlq#7wNcJShKC@K$t4<0G6W|%Xh9&-@ujsE zvaSQLmM`k%GiBl$ka?onIn!)9e}=nt{`@&;Sze7OhZE5C%26kggq2hub zcyueNyq-1VJy=1_?CEXG-2x{M3tt<{x9JMtp*77R$5$tKUE4nUSE?TuX#Y23BcghA zBC}#fAaX7JdZd3jL-rS8>rg)xcn#}Nj)9xH_i2?3XZ^Nk!ySE<_d(0~l#GovhfFSevr({oeF{@8Pf$P%P$2G2M2Ge)m}pu@D8Df21`0 zTWUEbNPiUqyVL$nx3=T?Pf~ky@EGtl+#yij=ZYtE+vxeDe}4J%L`jEZ|DFGJA9zY|4Y(zf`~ZXx=`NYg?k z7HPe~aICuk&E%U7t8VnL9W$>*XxTqF+i^Q;(uR_=bb2xKrrL#nsbnm=6S2UuiJC>! z7o#9;Ncm#o=1q+Y|1`eXcCpXP&1Oie?4EW`Rtj98Neul9GgE?oEAwCq7Y^%b{6whBX zxUiN9Slpn(2_2{kY03b*uyR5sokAKxvD8BJY!%GRTd{3g_RZAgPYWh|T7ur=CCVTi z`{(EmSd={d+Be@lK7-eoKrWIKnNsSCU(6GmC0$I^P*o4FNL88yh$Wr3{f<|-QK8Et z-?o{JA71jnPdYQ0Ne8bE?^S~>1%1CklbF>l)UkqF3#NX9F1`i4RGNsdO(mU`6D3nv z!n9Z8V(Odn*oQ67;D+L`%n=g#*uLTYx-U~+Xu`>xR9Nuku&EQ?846~BS}q^>3Uh?| zuZ04SCJ2#CFLhI_pqIX|%a7CWY~aYrk@KXSXJ@h0baDeqF?Y6I^-DX;RdWJZ%O)>pexm zp!9m3URgldoxwhw^F-{)0=+B{xgKz}OTQd+HfQ=M;3a4^NbGYh{7?_I9AlrjUP)g+ zA309uuSQ`@$oogbm*(0P0tehZ7cByD!LNhdwEKL?7~u7vBR7qgwh??C9U77z5Q}JD zvG^L!11c894>fYr^mTHs_GNH>8I)EcbG+7}#xXm4mV-ujT-62YyqK1&TvB~r!NShG z;pvdI0YlKSZS<#VPDvjRSr5K`20=bpY#usZ zOnVJ%A@J$IMGiuZr7!@JS?W(gE?0~?41{V(R-%bj88_DlJF$Sy_ID7$V0nQ=#h-6Y zz@3f!+RrfGvkQ(3d(6(oA5_yKb!-5|HeDaa6HLPMQzNLNrb*D`G0-76rD?oE1NDXu#95w_gbCl)S zxg{q>mL(MhB6CHURqhxzh3nc}jquIo- z9-?dm{O5PyT6`A$Veu`NqQGav(Oo>$a6&+#aL|>nO}gC!a93c!{+dJR!$zv_A(s@` zXDMvNAxN<^*|*Yb`vHoC?f|*+^>Am(q_gj|>u(AJr6ddj5`I0|#>0?kZyCt1FG zy@|t{r*MrclbL;&$70o={Ucs-8fLdMuIMIulaG&t$2U$H&5y@vtC1F9Uyc$hu0LL2 z_uFgL`ce}5s%-0>k6dwEn@O$h{5Y8rRN~cY)YtnW%!XBap)`|4Fn}h0gczFjXe<|! zb3C8n&08{aUc;FlYQJ$ohtggJ+HOv(3&437o z88?faRDAKy+IaBlzg^m>ec`5?4x>)E2rtD#8sdQH2|qlT?`EJy)?2N_e9pQdzrFC5 zYc^H>@#;UTVPKdfI|4bG2E1#*%4i`B|1mI?i8?zSz&u$Ml>B^AO>PRH1 zfl<@J|E~2zTQYlPUIb0_TrICt)}Ew8@B0W0nahQf>-WFhcD%JAB&(qw9+22c5kMM@BW!>GWN~x#~GFK(VI3aWhIDztKkfN8AZO= zB9v1^42n_7uV_i!RTty2mMstoOv0O_BPjZC8s}SD@!W6txXaIm*VANH2Ydh9r^!~@ zjuNldqlYyw+XD1T^!B6XRYDonz9e$fgiBSH%cxhOn@-!tVyo4~aT%fPq%A35${eeg zvWp%rBE&$!?7v!RDy&>R?JdaIEzO7Zm)qEB!xymwpb+kCu;pAA)?B$o>y3FBWJzvM zkjEaGe4+0HY-{pQ5$b97K2lpO>gB}MN@98u6@_qy-hhiM_g#2wc(n7C7x*CenoDGO zBxR-<69^&m^3@DEl**`6rk}pMSv56|{;c_W zU7-6SH!J;f2-wG7vt5s!yNnHZe)X|-PV;Kdd^ea%o421AUexfP)D9s+lUGj}V7swFkIyInzgg-_BG62F3RtLP<2vr+Uu z2Hk5H!e3h<0NEL=SpW9!V4{Ho@FW>=vrImC<>72t^d+6PRr1*>;b6vN`lf!p7RCEX zPJA(2Fs0E7vnJzfA@+7{ z{8QGM@8*-lafJ_$AA~45%f)f|jiZ*UQx+!hGt_eZIGVM6Rpk;b8KZ7(1!2k@T| zck2gMmXO$#3Q8YT+Bxf8K>K+Lxs726Na!@U$qzG}7r%*=vdGEtSk7Xa*uI2J!shCLt05OdXkqbZFZC zQVtN>eFM5mlK#Pi6q9rY4H@maT9ryGLR6g)(Aq#eOlcx{kTsM%UUDMz`arF9 zuuP$Ku!Rz|h76%6Rv%BTOg$2v6~2MVc@Nm&c8b{U6=2aVRM5W?4vFxMCISj>JfFH4 z&6N=oji^6Y#0E;9Bt@&eE`YjNrjWYWqTA`~&4g!UEE?%B`0)S@4GZ@c;}|+L4Nn$Y z#ntDiDB7DKLuY$=jgjeGb7T1ZOJY9R@#%wKu+=67*hE;0r)hjG-~AT{2EgNPy$FvA zdAJ%nfhoAG)ekxJ@O#>EdSyD>;Yr({?%9mY9ZxDo*AyGZttb#djL*S8Wq8ith(y|y z;Mk#%h(7Vc@9R-Uy}2)ymuM4YC#iQ6Us$gObLZDl=KszDCzC(jYSPPj8 zbkjk2H01LO+5Z`^DbwBxcBenxziBiV$ck4%1BkXy+e3W6Gmu6%mpj zbiiJ08}`~fFobcm48<{>D{*h{`&s9}*0;a<0pE!@KA`T*`>GoXqQ`s?q^B2Dvme|t zg{d7mM~c2(7~;ZF?ef!92JITIah*`ZdHXNUuw7(LPZa% zdul5-U4^4+6I5%rQV_&G9VKc{S0&wAT~Gzp%K^@Lx0DZt126cG+5w??cY=BAvFA4k zpfcBB^;cM^jRgfroia)z*$z_E3Vy~Mce1N51G^Mf035i%1UP`mKXA!=dHmkz9ifFr zwaY{pzUM(8GijAQGxFpb%Q)eg`%4AyVF^Wa-khe@o%XXY3+$$ytm04B#EKbK%&l*I z(kC((EG(>ahXRcJ5L-?T~u@dQi=fx2ulJME3mJr zuDts27qz&!U00~BUHDj{O}4nbJpmIn9*WvJVa+X4O4<&W`uM`1a`AqHXhU%8`6}9( z6|>g(jQvr^HTTe&u#5XJQdu=YT#`aKREYTK#)SnJ1!iq|mXn3_X>#iB2KowqKwDuF z5iIcY;|}o`?OhfUSV7S6n3T;AOW>T|``K0-n_7I zHMJ##5?WiAM1pV1JUtE5LqfyC;)cTJiHnQNHOr@GXZH=p*Tbz5e-BW6-cb*=!W_fI@?Z3&X;~G9&)}BtYFUS3L(H z>C17gHqwmbelAD_c41(rty_t|qieSP01^8|z40oLz56_j!oa|6D3Rby zONEo;@ZjC*kpB4bLxPfWb=IQCtdb1D39sCZi*^V+8Qi_dgpqiIbCqHU>sCQY!+7#< zMhP6+y+i}w+FqB2h6ZggLhIkg2+~PnR(pSg42|+ulfFUdq_aQ4`KTU9NOW^QEf?Gy zZXJJnatTZBG&f}XxrSVX|F6X03`LgTWCqjsfgJ}2-)k7y652o3+FDan)6=qD zen~gis0ba)7J$~~QvShSKZEi}>dn;_A|kvhCzBWI0>;}pp6YQjJ#GoMwvElnWJ1En z>FoI4+1Wc|I(NxD?b-zwsmV<8hEHxU3)@J$0)?gJg<(`wd(~;?pR|JUuJE+yv|pDH za4TfIEM`X#667n8v+V5b+cyTR40s=}p6SPC3Dwp!T|ni{r%?6#r$WJtK-VSg?~F~X zD}MARX30y4DC?2<(M!J7g<{ex@3lQgUAT|yqFRYfW9F-^ZugSc=lLoEOwi4LZ>zq{ z+@)%>IU~aC5*^};4{e@B&xTzZ*wG!GieuyE(9E2wNU!8`J;S3bqR(CfYL(gC%CUKA zyY8Omm;hm{(KMbtR3?IGuO57#9aA2i`;Qk8L_a?^85tP}h(6WH=8|*~htDJ8QZjAt z{P*!S;$+R5(K&2E`nJgPJrgAXBRsYys)e~|9MPzZAuU*gsVU5bOpjKU(iQ)g5KA7_ zU{2GTcUN%t!Cd6G#@}(8w8%{RBqOt(;}un*u7Ew|?YB}H^?OOpE~(vmY#u8Fv)mu_EQXXkD4^NceEm#tS9uQ)LP%(CFyta|CB7%x zH-MtM{Y!FhJ&Rqbnj9r1WLgye4wuaJA$UZxV|HAb-O2RqGk)qs8XkH*;_L?TH+uRfcCRm^0i4b!~x9`BcPc5-iNq)WL6vI2i4rUi6!$btoO(q6Am8FsU2 zk@OlKTWcWIVs@m0yLbB;thLSGaa257o>XjaH4HVnqwX55rS@YJhq0S0di)>6B=C=T z>aSQD5)5$-OOXFk?vft2PJvsS|HRm9=K@mGZw-#t&x|Z`0sW~MRhiL8CsK-$GIsux z_pd~wcnBHi5DwE~Gw#OT>#YJdkJ$$LZ|tRWGv(z|;*!?%^!3Pf^Jx332d;t^SsmQW zf!RmLDNdP>D{>09x^!$Ki$@;}RY2w03U-?SPtFss_TVjVQMG4G@ODVP14ngX?_V|9 zGaFSsJ{2ETV zf2UTJm}^|&>A|=$*Eh_v=||*-f4MFN^F*$1dq4a$MFQkn7f+W28kt7Krhv1}jr80i z)h8OV=FpV6NeDKu4K3oQ#`Nz!;wlZ?q?c#DeUzkdc^L_y)A@sU9{-vMaWL*^uNq`oR>+S=A)r0zYP}T z@YSUpe*RN+O+1na%Oz!Hbp$-6<63B8k>?VMyi!)5Zu_^wm!e}5*!QK6LhyjBW!{GJ z2ezYd!$#Pma(Xh=<+mS)fd9sSbqU-2(8wuzxNU+BPvLPH!mZ|nmn zqAg0T#ALQXPPcD^qwUMJUN@8E)EOT61+8r;zTX|9|4kZ-FhfE{?ybfMO)%fqnTX+2Wc-=Sg?ytUU+jw}W&{lLZXYndDTu7(b>0GF`ArmQuYQa!{ zC#9s?kD)Ozrt&d|{XyK}*N#fC8McA04bd@dHW}l&@zxJN=4z=O{n9pNcW>C?*bNU=NzA8?QpBIg&)ja-n{Y|v0|iKk4O}-ypoKx zq}~iUl$6P}b!lW8ciQyY@Q~RqG@=L+)0&gr^1)w>AOP@~bhJf!aNCg)4ZJz9hXgJq z9+0qMx*dv0)x1$a%wfd)i4nhQoJtUh7|;;9DW>e24#aOufS4~zH^!bvH3TzPRaVJs z9deJq3pv|#mDaG>8RXCsO6C_9kQ}#c67hee{df{BGi16~SJZI(4bFHuH;G#3mu5TK zO&c_%dJUYUgzJuWZsKId6UCYMgZ^Zo+EkDC-QUAjcM%g2-hH--wiz5O(A5PaW`^$q zsCM`L@Ca(wo||c(52sMpHt$#{n2wT4{vdH1w9lqY6A3IW;HB`|A|;Ov&&8!YNBv~)YCaj zSKG8U&^Y?b)HdGvj@EeOXmoWrN#qC3o2BCQb9i5*+A0OMg*CF9c4^+mPACOjsr1?L zOY1#wJbSD~lf=OCv7_;}LSGkeyKM!I8oUYD213dptY~R15#01_(sr|+h;~HWPMi0j=40*+uNEem{z2ErRtRuPUDX(R(nz#cQA93RxO(u$euF2Q zpGq~fc617sb@2tPkU;*JF@NZXVW@hi_W;&`KZO~-`M2(cXMFeQTiRkGI`+KEeL{d~ zUcVE0d%V>9I8>F&pR-BhiabAC36x=U@&rGPZ=znmTfy!W93OwrIwoJ}i}=c?&jSaJv~ziR>FaI=bxb!)=L`s} zsxZ!*ptUYXQprPacU)7n1}-@{C2H0pDbjd* zi{;RWVl5p1ru*#+3jhgQf6g2c2zTaTI3Lq?Xivub*F*^N>{3#$k5hh=L;rzc1^o zw+I4k{yHu=BK*_rqjY=FSeOW?xq@kQc_$n-?E2?1pka4MzU9(v%$&_FlGs(mL-h=$ z3q{!rSJyTHhWd^i-WHU3WJ$i{IBza2ESJ%L2!BI3x&|@2 z(=B!3yW_a3{H_yJm9O~>f6%N9537V}H)lET#4WB3m+`_&V4oPgZ2A;<;9ejG7k2B> zLF#$nZyE|bY-F1n-~taRxK6Pt^yu)dt7>=-A96@r#4Fe9Q~v{9K%&1t;Njb;b+x)p zd>Jh=K1=UKNof*CAxgoly$~iH)xOvD#m5BnE(YZie1z1Bx=)!_g3sx~vc0!KF2=EiMSH=8%XYc`h0p{4by%huzrFfvNE zptzU>9o+*N4J{NT`te#xljx`-dt12p{kCdlL)s@iDVq1UvVYgscGWdq-QJDnNUE!g zNlDXkIxeiMkPEB1Ush;;+?#!7itT$=_Cxj2ix%#?e&5wr;l3JU3q=E_*wv6@g*ptd z?sD>{^;w)D`V`{S)cSNzi&x#6r-yUjjbjuO4B z*~&{fIt?`9k8yW*B4`w3D?Wg4u@ z5^2chR6A;0@9R%dFrwRZROKkFBQKx7>jcVGQWD3fRD6p+Uy0Sq{XA#p{&uZ2?N+5y zq&3d(Ux7;HyfdkPs{6wRpAJX9oGa*lmsw6Z8zH`bxxTWE_z)43A}%<%Dt`Bn6^ud} zyO+|iP|yPxBw=dY)s5RoR3IC7+Wm*XPltrm8SB;lri$LQ;OKGW>R@ZrOUqwW{% z?uw!ge5Aou5iL`;eQ73v2p|ighsH>qwUA^DAB&kn<7y{PG!3RyDLS0`Tgh(QdT@Z( zlJqH(G|3W7soj=b^;^FglI5sU23xee3YON%2=w*!5i*AnO_rq)kfQ!BG_!myz8D#f z1^uT{7Cvi#|3*Ut$2jQTc^?-b{guQZe-d2!-!>jq zJyDk{@%+Xhe^kxZ`b{iO)&~L7+ElkD zq-beHzB}G>R-BZCRiQuiz-?(_612W<*#7}PN7;^l7~cbhE2B`SO}l*GSsE_30JhZW|k$U@fKyg`&_Y+XxUg;1d*zY&{xPCUxFw zeFEKo*Q~G7aeMFr;K^4V%9pQF6q+JP^#{JP@D54`;Re4`tQ zv?$p|&iquRGj3y|@%T3s|y-EMAfwCiS-bH&>FNR2c#Q|!pv zPKW!7r{R;XX>xB=FT48sU-%1$=1}KH~;R5`5h{OYFAf2|)*^FC% zLxY1&wcbvxt|c~hnb+pE8z&07X*URu{u~Xwa02&Gp(*{LOJTeVm0t_jl;%63@2oNxli;ht;G%ky& zLmMZ7{T3pbUkEZ zIGXaB1{=V7m2umLFJDL|CnqJ!+|gbO20e&8gNMh)!UEKZ0gh(FrEg(tA@I;z>tUfd zB2E%X$u8E5!3_l#V}FK&CJWvM$NOc1+ekE*rQ~^|LZ&a=nZsByGO)~>ebyUiKwQ9B zvl#6(L7kRRRH|XpY-!RZ6FxJ4C<$h&2#^w0%GY{&`Lb5Pv=*zH2v9Mk;27q4mGt)` z?k#N3>i%VKzY_Pqm?e<(_^|s5c#(~b4P^RlM$uQtDP^HFbuz$Pn^au}tnkYV!Z})v;;p_V^uw~+ZNzk06q-2#V zzqqQqn3(gV^op;;!N~5xjSPa;+tk(C0g>Gji@MpPK0=c&()^y=^cMn(Q^n0HBKPm zXvBXSqY8Z#oI{K?G@=)wkC?Qw343{lC^)zbrh79ni>`}=CjPj85JZ{0j=TUJ32bL`>XsQ#Z-RvC?R!|1X6HcETK=+oc>$( zsZxi{(M>Axj&t@*VUU5E#lNL>b-giR-vVB}dR4VzpH1A*VBRNsbuo_#q&=Rq+^8Aa zu4k~R3%y9@OO#h4`v9ElFjj2eOzSm!)s2s@cGWB+3v@3V0ekDYYQlE6@<;>)X9wb!qot7J88olA7! z=ZJ|PpuO9F{4w(Lmx8Qh*Gqt5U$ZqFVD;BW+%Ymwk{6c0aq9h!pYYeSoQbPzA7L64mj-v&m1JcSjT>jG}0uFfVd=lAg5@sQ}V z5IJv+T}H>F_kWd#x7#vQecmFR8*qVnb=BnbN8EKC(tdYhQDJoJ4Bd1r7i_zZLf*t` z_-7@&Gen&%CuIL^6J01-+DpZZ*)o7>tgenbDJd!Lu>JNaERvHs8QIu^-xP+-+IQVu z4>_-YbnDIR^BK0d!;O!-*x3FlsI8?4LyV|zW}43t^;0u3N#wN?F-XxZneY`k&Crz1 zUN!dJeoutvD{_ApE8xdRu2~${f3%X2Kyo1D*Tn6#B+`1bvn>3!y1nG`+2X(e=FsQn z+-;ydPj3P;9H{z5a85<Q1TXvp z!ZCV}jK z1=J`pJe>3ey8Z0;=Ro7CR#bst@bdDim1%*aDuD{{eoqYUzH0geOi=hs>ZeasLP8{f z&wv$4O-)6{#B>^;t!QWG|C$cjvc48cf>+7!sRk z<~wicHE*``gkz5VziII%jcwDW8 z(_t~m1v(f_LRQ!Cg`FwPW-+}=y}GJCDWVsIRl&p7cE|l0*#RW4UX?lIz>L!26Z(Me z%pHor-p0qHS7i*jx^f+z<~|B*XfjCVs{sRNK2eNW!ckJ3kN!#m8?mz57kjmyqRQbg zH;HiF_CI?8c%DibTbjiz*MO7=LG1G<1u`@wJM$I2ySqzDNr5lYi23{1G+Ks6>+M@= zHZ}}(b@kFxMmt_jLrqPKa-nR0@!S`&8~tQ^1hK?kiyoNve9+x1z@|hb@#3J?guGNN zUb{M8i;jtrbUlgBsR3r7Z^muYoMm`meA)KUYbig4Kj3!1Bxy*rqbGIfp2M%<7Q?2E z6(B9pXQGR}*{Fcq_P*X2ZiCe8!^a2ilhe_aB|q3&3iS0}Rdj*z2y(rz@_B#qQ5&S&W28U0iCLTsKf5 zdEdYP@ksb*aw&Uz8I%}C${8tFP)1AN3_* zoEQSD&@d#kz7O@tFG$fq9!!*|((>}wzh3;p-^}mi==Cs6@3nLIRRfzMaOM=c%4#5z z8D1{@JA)hP_VN%3f=5V5E7WqXzy0#%%O>wy$V3Ud^ZZ$r_N^&@XtL@4qD<6ydFc-W z{GvgFV*pY}NEbPwyT$DV=J6oI;fhX&F9rmlUu*a*Z^QGggyPA$H;^UA1;jjb35}|x<=#5$cn8y^B{;VnldLo z__g4VghxcQV9oF?;cE$HUnF{ml;gpm3VEYxm&9({dnXrv!g>7T4HD3bSy3{WyYnBjL9F=Ou8WdQNXux6ggiNIs2KZXyW5>>V5D4V2k>R9xKazJB!< zISSq!o`HHj26MklFzX718oeMqrwfxz1Qz#e@sbTnmavy2G^EXGxt*dK_A_~n!*#uh zLa-5Fy%F?+mV={itsC;~+l~<1`peK4?)7s>%sNYdhx@i_q&a>E9!@&>n!dLBI;uyA zM&2q}0tb9!ni?8Osi{-8x4YFHp-vt51eE?Y#9du3(a|>d6-~mtJd;51-7-+ zEer5p&a1tzO10pK`0Vk{e2o&PmFZKc#l%p6n21mAgy3TWKg0-7>eH*bn|&tx&|AXt zZ{K3v+d|boKCf-_ZfAG(|{tHSL&(P+l8>J)r%pEHsd6R00Bc=;$6c_7$=|KCcQ2 zMR(=a9YCeT#>K@1k<;Bh6#d~tgdClJtH;>5&7H6SJj(3W_{7n;tcj1-MLp~xp-gl0 zV#og7a1;V2kB|{A2H6z_pc4Ui8%jiU)Sj_?TC-YR=X2ZVJG*vmMtvA4Y-4Q^*{hC= zk?5?HdOvu7RI=ah)diUjeuO4vXNU0GO?R1d(sG}EwJRlq4=^=o_+7VMQg#V{>fFfr z`DB@!e%s|)lsW^N`;Io?l7d~kY?UaONf3E^d%GG_s`uS7;k@AY`Uir45G-=?sJS`Y zr-dlieF&&KW*l2Cdo$E5CL{cA1rMEzeyTy<;ybAl;yx$HO7tmqf%aZctCmk=Ia8ya zG`Nn8?$L4JU;wUs-YCG~cRJ^P&);YEx>7oK50@SNg^3R>10%~OjHwD+=e|5VJf@2+ z9#ts1S!)dw6N%s^^1tnn;NV8l(5?vpotv~Zxw^XQwyn>rs>0AHLnxF@lzr2W@?Qo; z&8|WLzRbD~1w>qF1&dewqjBq%3VVlZl*!%d8_Ey=SkZ<{nCW*^6%-YJ=Z%DZeEs^> zgoRZI>r5eUbKR1P*MlqY&V`VNBnS`RC?qkF-P|0Pw+?Pq;`I(Zt`d1dmkCnq>rqL~p%Nor`MpP$vu#-%VMO3FAq_t@HHvHVvsl9AZPcDmpR}^Xb9d)pl)1GNofi+cj}c8x z0*Sx)c(*wM?^tAHde7{OgpPK~t1qsUoF_$nUyfy$m$I6Fv`?QS?)h_5@H-aF^IN^c zwK{EXgEPI@dkqQ3rtLR9UKKWCuJt(U4|GfSYD_cnjH8^|%{+RzoyVqFs>78y^K!WN zi|I2*BNzJKcR8H+zCF=QmmvFeI9NT@5Z7(ZXlgAVH$I@ zA#hCoQ>kn{uV&W7uT^2*>v|N)W>_J*b+~hetUr)6&PZ4zIV!zZ%{1lac<-}`{0R{8NW6H-66kK}9(+&cZ zqCb>_gS7b*yyrHHz2=;&YbiCZ8*T88#RAk=3mxhD`(caFr@6=H`=86Jt9xc@D+${e zXm;cQ8L=$|TpBgrW_fJ_pCtj<+j=AmyMjDIfQ~t1o?9LQPD{! zEV?v*RlSgYEezAsTWfkiHY^P3R6vu=N69%vMP^dRrC4A`9#m0~+J2W0xTq1|7hUO7 zP=LLXP*am*pNfl)F5Lv;U0z;oc6XIe!8W4twB5&*mW5?{Z2%sUl+-!9+Num1yB~O3 zkk8GXFS7u7&0*f#MDYz9TQHuKe|G+Do{D*YUJA^xH9huxS2WYIXM26neQ)6!g@E07 zzO2kQrqp6M?J+*OiBnMfX{DH^V0=t1v89EixA#X|R&5>2d3zw?Ru0RVR5!1g6w}9) z6p+#e&bRxgZDOqS$w>lfkF2b$ksU#hg2FX*ef{W@6Ad~#x-J`@PTTs`U#b3#cnUv% zExA6W;`dl`QPa`kF{P4#(i$C08Vcyl?{))C;GS(P`$e1oao-~_`q;d@Z?R(gI5OfK z3Accf^nHA(2na;zZd*0Twzj&Wg2>fpK6?|C>_%9w{#>mEl6K|E9$Ub4h29mc11Q{e545ch^w zK{3{>aURG^d}}Ki58pH`kV`3PBwA)>a!yVZWX#0SahtOXMdG9zqdZ|k-)7%>vZA8b zpe##STB4DV>@0j0ca~!*Z(P zALLW4AhsD4ik48#R-!Ey}Ei-h8}Z#G{y&2B#&Ea%(cEQvW=T~EF)m0@9Ht7GCC=E=$qtZa%uhBcN;%E(NX≦~KW#)q@QPAt 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 delta 40007 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�|yI&+qtjfCJdi)qmZGM?riJb3c`+ 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μ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 AFaQ7m diff --git a/UPP/Core/Inc/main.h b/UPP/Core/Inc/main.h index 02c2ae9..e875bd5 100644 --- a/UPP/Core/Inc/main.h +++ b/UPP/Core/Inc/main.h @@ -57,7 +57,7 @@ extern "C" { void Error_Handler(void); /* USER CODE BEGIN EFP */ - +extern __IO uint32_t micros; /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ diff --git a/UPP/Core/PowerMonitor/adc_tools.c b/UPP/Core/PowerMonitor/adc_tools.c index a49d587..5bba577 100644 --- a/UPP/Core/PowerMonitor/adc_tools.c +++ b/UPP/Core/PowerMonitor/adc_tools.c @@ -1,7 +1,7 @@ /** ****************************************************************************** * @file adc_tools.c -* @brief Функции доступа к данным Modbus +* @brief Модуль считывающий данные с АЦП ****************************************************************************** * @details ******************************************************************************/ @@ -17,8 +17,6 @@ static void ADC_EnableAllFilters(ADC_Period_t *adc) { FILTER_GET_STATE(&adc->filter[i]) = FILTER_ENABLE; } - FILTER_GET_STATE(&adc->temp_filter[0]) = FILTER_ENABLE; - FILTER_GET_STATE(&adc->temp_filter[1]) = FILTER_ENABLE; } static void ADC_InitAllFilters(ADC_Period_t *adc, int coef) { @@ -113,7 +111,9 @@ HAL_StatusTypeDef ADC_Start(ADC_Period_t *adc, uint16_t Period) return res; } - ADC_EnableAllFilters(adc); + //ADC_EnableAllFilters(adc); + FILTER_GET_STATE(&adc->temp_filter[0]) = FILTER_ENABLE; + FILTER_GET_STATE(&adc->temp_filter[1]) = FILTER_ENABLE; return res; } @@ -176,4 +176,54 @@ HAL_StatusTypeDef ADC_Handle(ADC_Period_t *adc) adc->f.DataReady = 1; return HAL_OK; -} \ No newline at end of file +} + + +/** + * @brief Сбор статистики. + */ +void ADC_UpdateStatistics(ADC_Period_t *adc, uint8_t channel, float value) +{ + if(assert_adc(adc)) + return; + if (channel >= ADC_NUMB_OF_REGULAR_CHANNELS) return; + + ADC_Statistics *stat = &adc->Stat[channel]; + + // Первая инициализация + if (stat->SampleCount == 0) { + stat->Max = value; + stat->Min = value; + stat->Sum = 0; + stat->SumSquares = 0; + } + + // Обновление min/max + if (value > stat->Max) stat->Max = value; + if (value < stat->Min) stat->Min = value; + + // Накопление для Avg/RMS + stat->Sum += value; + stat->SumSquares += value * value; + stat->SampleCount++; + + // Расчет Avg/RMS (периодически или по запросу) + if (stat->SampleCount >= 1000) { // Пример: пересчет каждые 1000 samples + stat->Avg = stat->Sum / stat->SampleCount; + stat->RMS = sqrtf(stat->SumSquares / stat->SampleCount); + // Сброс накопителей + stat->Sum = 0; + stat->SumSquares = 0; + stat->SampleCount = 0; + } +} + +/** + * @brief Сброс статистики. + */ +void ADC_ResetStatistics(ADC_Period_t *adc, uint8_t channel) +{ + if (channel < ADC_NUMB_OF_REGULAR_CHANNELS) { + memset(&adc->Stat[channel], 0, sizeof(ADC_Statistics)); + } +} diff --git a/UPP/Core/PowerMonitor/adc_tools.h b/UPP/Core/PowerMonitor/adc_tools.h index fdc8234..a937322 100644 --- a/UPP/Core/PowerMonitor/adc_tools.h +++ b/UPP/Core/PowerMonitor/adc_tools.h @@ -1,7 +1,7 @@ /** ****************************************************************************** * @file adc_tools.h -* @brief Определения структур данных Modbus устройства +* @brief Модуль считывающий данные с АЦП ****************************************************************************** * @details ******************************************************************************/ @@ -11,7 +11,8 @@ #include "main.h" #define ADC_NUMB_OF_CHANNELS 6 -#define ADC_TEMP_CHANNELS_START 4 +#define ADC_NUMB_OF_REGULAR_CHANNELS 4 +#define ADC_TEMP_CHANNELS_START ADC_NUMB_OF_REGULAR_CHANNELS #define ADC_TEMPERATURES_QUANTS \ { 2188, 2197, 2206, 2216, 2226, 2236, 2247, 2259, 2271, 2283, \ @@ -45,10 +46,25 @@ static const int32_t adc_temp_quants[] = ADC_TEMPERATURES_QUANTS; typedef struct { uint16_t lZero; ///< Нулевой уровень (в квантах АЦП) - float vMax; ///< Максимальный уровень Единиц Измерения (в Вольтах/Амперах/Градусах) + float vMax; ///< Максимальный уровень Единиц Измерения (в Вольтах/Амперах) uint16_t lMax; ///< Максимальный уровень АЦП (в квантах АЦП) }ADC_Coefs_t; +/** + * @brief Статистика АЦП + */ +typedef struct +{ + float Max; ///< Пиковое значение + float Min; ///< Минимальное значение + float Avg; ///< Среднее арифметическое значение + float RMS; ///< Действующее значение + + uint32_t SampleCount; ///< Для корректного расчета Avg/RMS + float Sum; ///< Накопитель для среднего + float SumSquares; ///< Накопитель для RMS +}ADC_Statistics; + /** * @brief Хендл АЦП */ @@ -59,18 +75,21 @@ typedef struct ADC_HandleTypeDef *hadc; ///< Хендл АЦП // Data and calculation - uint16_t RawData[ADC_NUMB_OF_CHANNELS]; ///< Сырые значения АЦП - ADC_Coefs_t Coefs[ADC_NUMB_OF_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t - float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах/Градусах) + uint16_t RawData[ADC_NUMB_OF_CHANNELS]; ///< Сырые значения АЦП + ADC_Coefs_t Coefs[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t для регулярных каналов (не температуры) + FilterAverageInt_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП + FilterLUTInt_t temp_filter[2]; ///< Коррекция нелинейности датчиков температуры + + float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах) + ADC_Statistics Stat[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Статистика для регулярных каналов (не температуры) - FilterAverageInt_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП - FilterLUTInt_t temp_filter[2]; ///< Коррекция нелинейности датчиков температуры struct { unsigned Initialized:1; unsigned AdcRunning:1; unsigned DataReady:1; - }f; + }f; ///< Флаги + uint32_t LastTick; // Время последнего преобразования }ADC_Period_t; diff --git a/UPP/Core/PowerMonitor/zero_cross.c b/UPP/Core/PowerMonitor/zero_cross.c new file mode 100644 index 0000000..fe64962 --- /dev/null +++ b/UPP/Core/PowerMonitor/zero_cross.c @@ -0,0 +1,333 @@ +/** +****************************************************************************** +* @file zero_cross.c +* @brief Модуль фиксирующий переход через ноль +****************************************************************************** +* @details +******************************************************************************/ + +#include "zero_cross.h" +#include + +/** + * @brief Инициализация детектора нуля с индивидуальными настройками. + * @param zc Указатель на хендл детектора нуля + * @param num_channels Количество каналов для этого хендла + * @param hysteresis Гистерезис для избежания дребезга + * @param debounce_samples Количество samples для антидребезга + * @return HAL Status. + */ +HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels, + float hysteresis, uint8_t debounce_samples) +{ + if (zc == NULL || num_channels == 0 || num_channels > ZC_MAX_CHANNELS) { + return HAL_ERROR; + } + + // Инициализация структуры + memset(zc, 0, sizeof(ZeroCross_Handle_t)); + + // Установка параметров хендла + zc->NumChannels = num_channels; + zc->Hysteresis = hysteresis; + zc->DebounceSamples = debounce_samples; + + // Инициализация каналов + for (int i = 0; i < num_channels; i++) { + zc->Channel[i].CrossCount = 0; + zc->Channel[i].LastValue = 0.0f; + zc->Channel[i].CurrentValue = 0.0f; + zc->Channel[i].DebounceCounter = 0; + zc->Channel[i].StableState = 0; + zc->Channel[i].LastCrossTime = 0; + zc->Channel[i].Period = 0; + zc->Channel[i].Frequency = 0.0f; + zc->Channel[i].EdgeType = ZC_BOTH_EDGES; + } + + zc->f.Initialized = 1; + zc->f.Monitoring = 1; + + return HAL_OK; +} + +/** + * @brief Настройка канала детектора. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала для конфигурации + * @param edgeType Тип детектируемого перехода + * @return HAL Status. + */ +HAL_StatusTypeDef ZC_ConfigChannel(ZeroCross_Handle_t *zc, uint8_t channel, + ZC_EdgeType_t edgeType) +{ + if (zc == NULL || !zc->f.Initialized) { + return HAL_ERROR; + } + + if (channel >= zc->NumChannels) { + return HAL_ERROR; + } + + zc->Channel[channel].EdgeType = edgeType; + + // Сброс состояния канала при реконфигурации + zc->Channel[channel].LastValue = 0.0f; + zc->Channel[channel].DebounceCounter = 0; + zc->Channel[channel].StableState = 0; + zc->Channel[channel].LastCrossTime = 0; + zc->Channel[channel].Period = 0; + zc->Channel[channel].Frequency = 0.0f; + zc->Channel[channel].CrossCount = 0; + + return HAL_OK; +} +/** + * @brief Основная функция обработки значения канала. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала + * @param value Текущее значение сигнала + * @param timestamp Временная метка измерения в микросекундах + */ +void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uint32_t timestamp) +{ + if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring) { + return; + } + + if (channel >= zc->NumChannels) { + return; + } + + ZC_Channel_t *zc_ch = &zc->Channel[channel]; + zc_ch->CurrentValue = value; + + // Детектирование rising edge (отрицательное -> положительное) + if ((zc_ch->LastValue <= -zc->Hysteresis) && + (value >= zc->Hysteresis)) { + + if (zc_ch->EdgeType == ZC_RISING_EDGE || zc_ch->EdgeType == ZC_BOTH_EDGES) { + // Переход подтвержден сразу (без дебаунса) + if (zc_ch->LastCrossTime != 0) { + // Расчет периода и частоты + zc_ch->Period = timestamp - zc_ch->LastCrossTime; + if (zc_ch->Period > 0) { + zc_ch->Frequency = 1000000.0f / zc_ch->Period; + } + } + + zc_ch->LastCrossTime = timestamp; + zc_ch->CrossCount++; + zc_ch->StableState = 1; + } + } + // Детектирование falling edge (положительное -> отрицательное) + else if ((zc_ch->LastValue >= zc->Hysteresis) && + (value <= -zc->Hysteresis)) { + + if (zc_ch->EdgeType == ZC_FALLING_EDGE || zc_ch->EdgeType == ZC_BOTH_EDGES) { + // Переход подтвержден сразу (без дебаунса) + if (zc_ch->LastCrossTime != 0) { + // Расчет периода и частоты + zc_ch->Period = timestamp - zc_ch->LastCrossTime; + if (zc_ch->Period > 0) { + zc_ch->Frequency = 1000000.0f / zc_ch->Period; + } + } + + zc_ch->LastCrossTime = timestamp; + zc_ch->CrossCount++; + zc_ch->StableState = 0; + } + } + + // Сохраняем текущее значение для следующей итерации в случае если оно не в мертвой зоне + if((value > zc->Hysteresis) || (value < -zc->Hysteresis)) + { + zc_ch->LastValue = value; + } +} + +/** + * @brief Пакетная обработка всех каналов. + * @param zc Указатель на хендл детектора нуля + * @param values Массив значений сигналов + * @param timestamp Временная метка измерения + */ +void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float values[], uint32_t timestamp) +{ + if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring || values == NULL) { + return; + } + + for (int ch = 0; ch < zc->NumChannels; ch++) { + ZC_ProcessChannel(zc, ch, values[ch], timestamp); + } +} + +/** + * @brief Получение частоты сигнала. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала + * @return Частота в Гц. + */ +float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel) +{ + if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) { + return 0.0f; + } + + return zc->Channel[channel].Frequency; +} + +/** + * @brief Получение периода сигнала. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала + * @return Период в тактах таймера. + */ +uint32_t ZC_GetPeriod(ZeroCross_Handle_t *zc, uint8_t channel) +{ + if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) { + return 0; + } + + return zc->Channel[channel].Period; +} + +/** + * @brief Получение счетчика переходов. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала + * @return Количество переходов. + */ +uint32_t ZC_GetCrossCount(ZeroCross_Handle_t *zc, uint8_t channel) +{ + if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) { + return 0; + } + + return zc->Channel[channel].CrossCount; +} + +/** + * @brief Получение текущего состояния канала. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала + * @return Состояние (0 - отрицательное, 1 - положительное). + */ +uint8_t ZC_GetStableState(ZeroCross_Handle_t *zc, uint8_t channel) +{ + if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) { + return 0; + } + + return zc->Channel[channel].StableState; +} + +/** + * @brief Получение текущего значения канала. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала + * @return Текущее значение сигнала. + */ +float ZC_GetCurrentValue(ZeroCross_Handle_t *zc, uint8_t channel) +{ + if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) { + return 0.0f; + } + + return zc->Channel[channel].CurrentValue; +} + +/** + * @brief Включение/выключение мониторинга. + * @param zc Указатель на хендл детектора нуля + * @param enable Флаг включения (1 - вкл, 0 - выкл) + */ +void ZC_EnableMonitoring(ZeroCross_Handle_t *zc, uint8_t enable) +{ + if (zc == NULL || !zc->f.Initialized) { + return; + } + + zc->f.Monitoring = enable ? 1 : 0; +} + +/** + * @brief Сброс статистики канала. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала + */ +void ZC_Reset(ZeroCross_Handle_t *zc, uint8_t channel) +{ + if (zc == NULL || !zc->f.Initialized) { + return; + } + + if (channel < zc->NumChannels) { + zc->Channel[channel].LastValue = 0.0f; + zc->Channel[channel].CurrentValue = 0.0f; + zc->Channel[channel].DebounceCounter = 0; + zc->Channel[channel].StableState = 0; + zc->Channel[channel].LastCrossTime = 0; + zc->Channel[channel].Period = 0; + zc->Channel[channel].Frequency = 0.0f; + zc->Channel[channel].CrossCount = 0; + } + else { + // Сброс всех каналов + for (int i = 0; i < zc->NumChannels; i++) { + zc->Channel[i].LastValue = 0.0f; + zc->Channel[i].CurrentValue = 0.0f; + zc->Channel[i].DebounceCounter = 0; + zc->Channel[i].StableState = 0; + zc->Channel[i].LastCrossTime = 0; + zc->Channel[i].Period = 0; + zc->Channel[i].Frequency = 0.0f; + zc->Channel[i].CrossCount = 0; + } + } +} + +/** + * @brief Установка гистерезиса для хендла. + * @param zc Указатель на хендл детектора нуля + * @param hysteresis Значение гистерезиса + */ +void ZC_SetHysteresis(ZeroCross_Handle_t *zc, float hysteresis) +{ + if (zc == NULL || !zc->f.Initialized) { + return; + } + + zc->Hysteresis = hysteresis; +} + +/** + * @brief Установка дебаунс samples для хендла. + * @param zc Указатель на хендл детектора нуля + * @param debounce_samples Количество samples для антидребезга + */ +void ZC_SetDebounceSamples(ZeroCross_Handle_t *zc, uint8_t debounce_samples) +{ + if (zc == NULL || !zc->f.Initialized) { + return; + } + + zc->DebounceSamples = debounce_samples; +} + +/** + * @brief Получение количества каналов хендла. + * @param zc Указатель на хендл детектора нуля + * @return Количество каналов. + */ +uint8_t ZC_GetNumChannels(ZeroCross_Handle_t *zc) +{ + if (zc == NULL || !zc->f.Initialized) { + return 0; + } + + return zc->NumChannels; +} \ No newline at end of file diff --git a/UPP/Core/PowerMonitor/zero_cross.h b/UPP/Core/PowerMonitor/zero_cross.h new file mode 100644 index 0000000..a109023 --- /dev/null +++ b/UPP/Core/PowerMonitor/zero_cross.h @@ -0,0 +1,166 @@ +/** +****************************************************************************** +* @file zero_cross.h +* @brief Модуль фиксирующий переход через ноль +****************************************************************************** +* @addtogroup ZERO_CROSS Zero-cross detection +* @brief Библиотека для детектирования переходов сигнала через ноль +* @details +Поддерживает: +- Многоканальное детектирование (несколько независимых сигналов) +- Детектирование фронтов: rising, falling, both +- Антидребезг с настраиваемым количеством samples +- Расчет частоты и периода сигнала +- Гистерезис для устойчивого детектирования +- Независимость от источника данных (ADC, DAC, другие) +- Индивидуальные настройки для каждого хендла + +@par Пример использования: +@code +#include "zero_cross.h" + +// Объявление структур +ZeroCross_Handle_t zc_handle; +float adc_values[2] = {0}; +uint32_t timestamp = 0; + +// Инициализация с индивидуальными настройками +ZC_Init(&zc_handle, 2, 0.1f, 3); // 2 канала, гистерезис 0.1, дебаунс 3 samples + +// Настройка каналов +ZC_ConfigChannel(&zc_handle, 0, ZC_RISING_EDGE); // Канал 0 - только rising edge +ZC_ConfigChannel(&zc_handle, 1, ZC_BOTH_EDGES); // Канал 1 - оба фронта + +// В основном цикле обработки ADC +while (1) { + // Получение данных от ADC (пример) + adc_values[0] = read_adc_channel(0); // Фаза A + adc_values[1] = read_adc_channel(1); // Фаза B + timestamp = HAL_GetTick() * 1000; // Текущее время в микросекундах + + // Обработка всех каналов + ZC_ProcessAllChannels(&zc_handle, adc_values, timestamp); + + // Получение результатов + float freq_a = ZC_GetFrequency(&zc_handle, 0); + float freq_b = ZC_GetFrequency(&zc_handle, 1); + uint32_t period_a = ZC_GetPeriod(&zc_handle, 0); + uint32_t cross_count_a = ZC_GetCrossCount(&zc_handle, 0); + + // Использование в логике управления + if (freq_a > 55.0f || freq_a < 45.0f) { + // Авария по частоте + handle_frequency_fault(); + } +} + +// Пример создания нескольких хендлов с разными настройками +ZeroCross_Handle_t zc_high_sensitivity; +ZeroCross_Handle_t zc_low_sensitivity; + +// Высокая чувствительность - малый гистерезис +ZC_Init(&zc_high_sensitivity, 2, 0.01f, 5); // 0.01 гистерезис, 5 samples дебаунс + +// Низкая чувствительность - большой гистерезис для зашумленных сигналов +ZC_Init(&zc_low_sensitivity, 2, 0.5f, 2); // 0.5 гистерезис, 2 samples дебаунс +@endcode +* @{ +*****************************************************************************/ + +#ifndef _ZERO_CROSS_H_ +#define _ZERO_CROSS_H_ +#include "main.h" + +#ifndef ZC_MAX_CHANNELS +#define ZC_MAX_CHANNELS 8 ///< Максимальное количество каналов на хендл +#endif + +/** + * @brief Тип перехода через ноль + */ +typedef enum { + ZC_BOTH_EDGES = 0, ///< Детектирование обоих переходов + ZC_RISING_EDGE, ///< Переход от отрицательного к положительному + ZC_FALLING_EDGE, ///< Переход от положительного к отрицательному +} ZC_EdgeType_t; + +/** + * @brief Структура канала детектора нуля + */ +typedef struct { + uint32_t CrossCount; ///< Счетчик переходов + float LastValue; ///< Предыдущее значение + float CurrentValue; ///< Текущее значение + uint8_t DebounceCounter; ///< Счетчик антидребезга + uint8_t StableState; ///< Стабильное состояние (0=отриц, 1=полож) + uint32_t LastCrossTime; ///< Время последнего перехода + uint32_t Period; ///< Период сигнала (в тактах таймера) + float Frequency; ///< Частота + ZC_EdgeType_t EdgeType; ///< Тип детектируемого перехода +} ZC_Channel_t; + +/** + * @brief Хендл детектора нуля + */ +typedef struct { + ZC_Channel_t Channel[ZC_MAX_CHANNELS]; ///< Каналы @ref ZC_Channel_t + uint8_t NumChannels; ///< Количество используемых каналов для этого хендла + float Hysteresis; ///< Гистерезис для избежания дребезга + uint8_t DebounceSamples; ///< Количество samples для антидребезга + struct { + unsigned Initialized:1; ///< Флаг инициализации + unsigned Monitoring:1; ///< Флаг активности мониторинга + } f; ///< Флаги +} ZeroCross_Handle_t; + +/* Инициализация детектора нуля с индивидуальными настройками */ +HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels, + float hysteresis, uint8_t debounce_samples); + +/* Настройка канала детектора */ +HAL_StatusTypeDef ZC_ConfigChannel(ZeroCross_Handle_t *zc, uint8_t channel, + ZC_EdgeType_t edgeType); + +/* Обработка значения отдельного канала */ +void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, + uint32_t timestamp); + +/* Пакетная обработка всех каналов */ +void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float values[], + uint32_t timestamp); + +/* Получение частоты сигнала */ +float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel); + +/* Получение периода сигнала */ +uint32_t ZC_GetPeriod(ZeroCross_Handle_t *zc, uint8_t channel); + +/* Получение счетчика переходов */ +uint32_t ZC_GetCrossCount(ZeroCross_Handle_t *zc, uint8_t channel); + +/* Получение текущего состояния канала */ +uint8_t ZC_GetStableState(ZeroCross_Handle_t *zc, uint8_t channel); + +/* Получение текущего значения канала */ +float ZC_GetCurrentValue(ZeroCross_Handle_t *zc, uint8_t channel); + +/* Включение/выключение мониторинга */ +void ZC_EnableMonitoring(ZeroCross_Handle_t *zc, uint8_t enable); + +/* Сброс статистики канала */ +void ZC_Reset(ZeroCross_Handle_t *zc, uint8_t channel); + +/* Установка гистерезиса для хендла */ +void ZC_SetHysteresis(ZeroCross_Handle_t *zc, float hysteresis); + +/* Установка дебаунс samples для хендла */ +void ZC_SetDebounceSamples(ZeroCross_Handle_t *zc, uint8_t debounce_samples); + +/* Получение количества каналов хендла */ +uint8_t ZC_GetNumChannels(ZeroCross_Handle_t *zc); + +#endif /* _ZERO_CROSS_H_ */ + +/** + * @} + */ \ No newline at end of file diff --git a/UPP/Core/Src/main.c b/UPP/Core/Src/main.c index 0e2747f..bfbb14c 100644 --- a/UPP/Core/Src/main.c +++ b/UPP/Core/Src/main.c @@ -34,7 +34,7 @@ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ - +__IO uint32_t micros; /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ diff --git a/UPP/Core/Src/stm32f4xx_it.c b/UPP/Core/Src/stm32f4xx_it.c index c199d34..ceef07b 100644 --- a/UPP/Core/Src/stm32f4xx_it.c +++ b/UPP/Core/Src/stm32f4xx_it.c @@ -22,6 +22,7 @@ #include "stm32f4xx_it.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include "upp_main.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -222,13 +223,11 @@ void TIM8_TRG_COM_TIM14_IRQHandler(void) void DMA2_Stream0_IRQHandler(void) { /* USER CODE BEGIN DMA2_Stream0_IRQn 0 */ -#include "adc_tools.h" - extern ADC_Period_t adc; - ADC_Handle(&adc); + /* USER CODE END DMA2_Stream0_IRQn 0 */ HAL_DMA_IRQHandler(&hdma_adc3); /* USER CODE BEGIN DMA2_Stream0_IRQn 1 */ - + UPP_ADC_Handle(); /* USER CODE END DMA2_Stream0_IRQn 1 */ } diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 2f31926..c370f74 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -11,7 +11,10 @@ #include "tim.h" #include "adc_tools.h" +#include "zero_cross.h" ADC_Period_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 @@ -34,6 +37,10 @@ int UPP_Init(void) ADC_ConfigChannel(&adc, ADC_CHANNEL_TEMP1, 2554, 90, 4095); ADC_ConfigChannel(&adc, ADC_CHANNEL_TEMP2, 2554, 90, 4095); + ZC_Init(&hzc, ZC_MAX_CHANNELS, 10, 3); + ZC_ConfigChannel(&hzc, 0, ZC_BOTH_EDGES); + ZC_ConfigChannel(&hzc, 1, ZC_BOTH_EDGES); + return 0; } @@ -55,4 +62,19 @@ int UPP_While(void) { return 0; +} + +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]; + } + } } \ No newline at end of file diff --git a/UPP/Core/UPP/upp_main.h b/UPP/Core/UPP/upp_main.h index 3d72e8b..bc34d36 100644 --- a/UPP/Core/UPP/upp_main.h +++ b/UPP/Core/UPP/upp_main.h @@ -18,4 +18,6 @@ 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 e09e15c..5a030cf 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -359,6 +359,30 @@ 0 0 + + 3 + 14 + 1 + 0 + 0 + 0 + ..\Core\PowerMonitor\zero_cross.c + zero_cross.c + 0 + 0 + + + 3 + 15 + 5 + 0 + 0 + 0 + ..\Core\PowerMonitor\zero_cross.h + zero_cross.h + 0 + 0 + @@ -377,7 +401,7 @@ 0 5 - 14 + 16 1 0 0 @@ -389,7 +413,7 @@ 5 - 15 + 17 1 0 0 @@ -401,7 +425,7 @@ 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 @@ -541,7 +565,7 @@ 0 6 - 27 + 29 5 0 0 @@ -553,7 +577,7 @@ 6 - 28 + 30 5 0 0 @@ -565,7 +589,7 @@ 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 1 0 0 @@ -625,7 +649,7 @@ 6 - 34 + 36 5 0 0 @@ -645,7 +669,7 @@ 0 7 - 35 + 37 1 0 0 @@ -657,7 +681,7 @@ 7 - 36 + 38 1 0 0 @@ -669,7 +693,7 @@ 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 @@ -797,7 +821,7 @@ 0 8 - 47 + 49 1 0 0 @@ -809,7 +833,7 @@ 8 - 48 + 50 1 0 0 @@ -829,7 +853,7 @@ 0 9 - 49 + 51 1 0 0 @@ -841,7 +865,7 @@ 9 - 50 + 52 1 0 0 @@ -853,7 +877,7 @@ 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 @@ -897,7 +921,7 @@ 0 10 - 54 + 56 1 0 0 @@ -909,7 +933,7 @@ 10 - 55 + 57 1 0 0 @@ -921,7 +945,7 @@ 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 @@ -1193,7 +1217,7 @@ 0 11 - 78 + 80 1 0 0 @@ -1213,7 +1237,7 @@ 0 12 - 79 + 81 2 0 0 diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index fdf03ee..b6b4547 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -460,6 +460,16 @@ 5 ..\Core\PowerMonitor\adc_tools.h + + zero_cross.c + 1 + ..\Core\PowerMonitor\zero_cross.c + + + zero_cross.h + 5 + ..\Core\PowerMonitor\zero_cross.h +