From 54155fdca916ff2baab31b9191c8891b68bfdc2c Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Mon, 15 May 2023 22:58:39 +0300 Subject: [PATCH] add calculations of T & P by ADC; Release mode still have problems --- F3:F303/NitrogenFlooding/BMP280.c | 1 + F3:F303/NitrogenFlooding/adc.c | 65 +++++++++++++++++++++++--- F3:F303/NitrogenFlooding/adc.h | 9 +++- F3:F303/NitrogenFlooding/hardware.c | 7 ++- F3:F303/NitrogenFlooding/hardware.h | 4 ++ F3:F303/NitrogenFlooding/i2c.c | 1 + F3:F303/NitrogenFlooding/main.c | 3 ++ F3:F303/NitrogenFlooding/menu.c | 57 ++++++++++++++++++---- F3:F303/NitrogenFlooding/nitrogen.bin | Bin 32748 -> 33488 bytes F3:F303/NitrogenFlooding/version.inc | 4 +- 10 files changed, 127 insertions(+), 24 deletions(-) diff --git a/F3:F303/NitrogenFlooding/BMP280.c b/F3:F303/NitrogenFlooding/BMP280.c index 8981e74..c743501 100644 --- a/F3:F303/NitrogenFlooding/BMP280.c +++ b/F3:F303/NitrogenFlooding/BMP280.c @@ -197,6 +197,7 @@ static int write_reg(uint8_t reg, uint8_t val){ // read compensation data & write registers int BMP280_init(){ + IWDG->KR = IWDG_REFRESH; DBG("INI:\n"); if(!read_reg(BMP280_REG_ID, ¶ms.ID)){ DBG("Can't get ID\n"); diff --git a/F3:F303/NitrogenFlooding/adc.c b/F3:F303/NitrogenFlooding/adc.c index 84c2968..227f196 100644 --- a/F3:F303/NitrogenFlooding/adc.c +++ b/F3:F303/NitrogenFlooding/adc.c @@ -17,6 +17,7 @@ */ #include "adc.h" +#include "hardware.h" // ADCvals /** * @brief ADCx_array - arrays for ADC channels with median filtering: @@ -65,6 +66,7 @@ TRUE_INLINE void enADC(ADC_TypeDef *chnl){ */ // Setup ADC void adc_setup(){ + IWDG->KR = IWDG_REFRESH; RCC->AHBENR |= RCC_AHBENR_ADC12EN; // Enable clocking ADC12_COMMON->CCR = ADC_CCR_TSEN | ADC_CCR_CKMODE; // enable Tsens, HCLK/4 calADC(ADC1); @@ -128,19 +130,68 @@ uint16_t getADCval(int nch){ } // get voltage @input nch (V) -float getADCvoltage(int nch){ - float v = getADCval(nch) * 3.3; - v /= 4096.f; // 12bit ADC - return v; +float getADCvoltage(uint16_t ADCval){ + float v = (float)ADCval * 3.3; + return v/4096.f; // 12bit ADC } // return MCU temperature (degrees of celsius) float getMCUtemp(){ - // make correction on Vdd value - int32_t ADval = getADCval(ADC_TSENS); - float temperature = ADval - (float) *TEMP30_CAL_ADDR; + float temperature = ADCvals[ADC_TSENS] - (float) *TEMP30_CAL_ADDR; temperature *= (110.f - 30.f); temperature /= (float)(*TEMP110_CAL_ADDR - *TEMP30_CAL_ADDR); temperature += 30.f; return(temperature); } + +// calculate R (Ohms) by given `ADCval` for main 10 ADC channels with 1k in upper arm of divider +float calcR(uint16_t ADCval){ + return 1000.f/(4096.f/((float)ADCval) - 1.f); +} + +/****** R(T, K): +T -= 273.15; % convert to K +_A = 3.9083e-03; +_B = -5.7750e-07; +_C = 0.; +if(T < 0.); _C = -4.1830e-12; endif +R = 1000.*(1 + _A*T + _B*T.^2 - _C.*T.^3*100. + _C.*T.^4); + +=====> for T=[70:400] Kelvins + +function T = pt1000Tapp(R) + k1 = 27.645; + k2 = 0.235268; + k3 = 1.0242e-05; + k4 = 0.; + if(R < 1000) + k1 = 31.067; + k2 = 2.2272e-01; + k3 = 2.5251e-05; + k4 = -5.9001e-09; + endif + T = k1 + k2*R + k3*R.^2 + k4*R.^3; +endfunction + +mean(T-Tapp)= -3.3824e-04 +std(T-Tapp')= 3.2089e-03 +max(abs(T-Tapp'))= 0.011899 + +********/ + +// approximate calculation of T (K) for platinum 1k PTC +float calcT(uint16_t ADCval){ + float R = calcR(ADCval); + if(R < 1000.){ + return (31.067 + R * (2.2272e-01 + R * (2.5251e-05 - R * 5.9001e-09))); + } + return (27.645 + R * (0.235268 + R * 1.0242e-05)); +} + +// MPX5050: V=VS(P x 0.018 + 0.04); for 3v3 ADU=4096(P*0.018+0.04) ====> +// 0.018P=ADU/4096-0.04, +// P(kPa) = 55.556*(ADU/4096-0.04) +float calcPres5050(){ + float adu = (float)ADCvals[ADC_EXT]/4096. - 0.04; + return 55.556*adu; +} diff --git a/F3:F303/NitrogenFlooding/adc.h b/F3:F303/NitrogenFlooding/adc.h index 317ec39..adfae2b 100644 --- a/F3:F303/NitrogenFlooding/adc.h +++ b/F3:F303/NitrogenFlooding/adc.h @@ -47,7 +47,14 @@ // starting index of ADC2 #define ADC2START (9*NUMBER_OF_ADC1_CHANNELS) +// ADC level for not connected TRD +#define ADC_NOCONN (4000) + void adc_setup(); float getMCUtemp(); uint16_t getADCval(int nch); -float getADCvoltage(int nch); +float getADCvoltage(uint16_t ADCval); + +float calcR(uint16_t ADCval); +float calcT(uint16_t ADCval); +float calcPres5050(); diff --git a/F3:F303/NitrogenFlooding/hardware.c b/F3:F303/NitrogenFlooding/hardware.c index 0767602..fffeda7 100644 --- a/F3:F303/NitrogenFlooding/hardware.c +++ b/F3:F303/NitrogenFlooding/hardware.c @@ -108,7 +108,7 @@ TRUE_INLINE void pwm_setup(){ } #ifndef EBUG -TRUE_INLINE void iwdg_setup(){ +void iwdg_setup(){ uint32_t tmout = 16000000; /* Enable the peripheral clock RTC */ /* (1) Enable the LSI (40kHz) */ @@ -135,11 +135,10 @@ TRUE_INLINE void iwdg_setup(){ void hw_setup(){ RCC->AHBENR |= RCC_AHBENR_DMA1EN | RCC_AHBENR_DMA2EN; gpio_setup(); + IWDG->KR = IWDG_REFRESH; i2c_setup(HIGH_SPEED); + IWDG->KR = IWDG_REFRESH; pwm_setup(); -#ifndef EBUG - iwdg_setup(); -#endif } void setPWM(int nch, uint16_t val){ diff --git a/F3:F303/NitrogenFlooding/hardware.h b/F3:F303/NitrogenFlooding/hardware.h index a1eaebc..61fe905 100644 --- a/F3:F303/NitrogenFlooding/hardware.h +++ b/F3:F303/NitrogenFlooding/hardware.h @@ -120,3 +120,7 @@ void hw_setup(); void setPWM(int nch, uint16_t val); uint16_t getPWM(int nch); + +#ifndef EBUG +void iwdg_setup(); +#endif diff --git a/F3:F303/NitrogenFlooding/i2c.c b/F3:F303/NitrogenFlooding/i2c.c index e6a5367..f6b7de9 100644 --- a/F3:F303/NitrogenFlooding/i2c.c +++ b/F3:F303/NitrogenFlooding/i2c.c @@ -42,6 +42,7 @@ static uint8_t I2Cbuf[256], i2cbuflen = 0; // buffer for DMA tx/rx and its len static inline int isI2Cbusy(){ cntr = Tms; do{ + IWDG->KR = IWDG_REFRESH; if(Tms - cntr > I2C_TIMEOUT){ USND("Timeout, DMA transfer in progress?"); return 1;} }while(I2Cbusy); return 0; diff --git a/F3:F303/NitrogenFlooding/main.c b/F3:F303/NitrogenFlooding/main.c index c220c86..2c45e01 100644 --- a/F3:F303/NitrogenFlooding/main.c +++ b/F3:F303/NitrogenFlooding/main.c @@ -89,6 +89,9 @@ int main(void){ BMP280_setup(0); BMP280_start(); USBPU_ON(); +#ifndef EBUG + iwdg_setup(); +#endif // CAN_message *can_mesg; while(1){ IWDG->KR = IWDG_REFRESH; diff --git a/F3:F303/NitrogenFlooding/menu.c b/F3:F303/NitrogenFlooding/menu.c index c9550f4..00ab764 100644 --- a/F3:F303/NitrogenFlooding/menu.c +++ b/F3:F303/NitrogenFlooding/menu.c @@ -106,23 +106,60 @@ static void refresh_adcwin(btnevtmask evtmask){ if(evtmask) return; cls(); SetFontScale(1); - int Y = fontheight + 1, wmax = 0; + int Y0 = fontheight*2 + 5; // output + int X, Y = Y0, Xstart = 20, Xraw = 0, XR = 0, XK = 0; setFGcolor(COLOR_CYAN); for(int i = 0; i < NUMBER_OF_AIN_CHANNELS; ++i, Y+=fontheight+2){ - int X = 20; - X = PutStringAt(X, Y, "ADC input "); - X = PutStringAt(X, Y, u2str(i)); - if(X > wmax) wmax = X; + //X = PutStringAt(X, Y, "ADC input "); + X = PutStringAt(Xstart, Y, u2str(i)); + if(X > Xraw) Xraw = X; } - wmax += 20; - setFGcolor(COLOR_WHITE); - Y = fontheight + 1; + Xraw += 20; // Xraw - starting X for text 'RAW' + Y = Y0; + setFGcolor(COLOR_LIGHTBLUE); + // RAW values for(int i = 0; i < NUMBER_OF_AIN_CHANNELS; ++i, Y+=fontheight+2){ - PutStringAt(wmax, Y, u2str(ADCvals[i])); + X = PutStringAt(Xraw, Y, u2str(ADCvals[i])); + if(X > XR) XR = X; } + XR += 20; // XR - starting X for text 'R, Ohm' + Y = Y0; setFGcolor(COLOR_LIGHTGREEN); + // R in Ohms + for(int i = 0; i < NUMBER_OF_AIN_CHANNELS; ++i, Y+=fontheight+2){ + if(ADCvals[i] > ADC_NOCONN) X = PutStringAt(XR, Y, "NC"); + else X = PutStringAt(XR, Y, float2str(calcR(ADCvals[i]), 3)); + if(X > XK) XK = X; + } + Y = Y0; + XK += 20; // XK - starting X for text 'T, K' + // T in K + for(int i = 0; i < NUMBER_OF_AIN_CHANNELS; ++i, Y+=fontheight+2){ + if(ADCvals[i] < ADC_NOCONN){ + float K = calcT(ADCvals[i]); + setFGcolor(COLOR_YELLOW); + PutStringAt(XK, Y, float2str(K, 1)); + setFGcolor(COLOR_GOLD); + PutStringAt(XK+80, Y, float2str(K-273.15, 1)); + } + } + setFGcolor(COLOR_BLUE); + Y0 = fontheight + 1; + // print header + PutStringAt(Xstart, Y0, "#"); + PutStringAt(Xraw, Y0, "Raw"); + PutStringAt(XR, Y0, "R, Ohm"); + PutStringAt(XK, Y0, "T, K"); + PutStringAt(XK+80, Y0, "degC"); + setFGcolor(COLOR_CHOCOLATE); Y += 5; - PutStringAt(20, Y, "ADC ext"); PutStringAt(wmax, Y, u2str(ADCvals[ADC_EXT])); + PutStringAt(Xstart, Y, "P"); PutStringAt(Xraw, Y, u2str(ADCvals[ADC_EXT])); + float P = calcPres5050(); + if(P > 30) setFGcolor(COLOR_RED); + else if(P > 10) setFGcolor(COLOR_YELLOW); + else setFGcolor(COLOR_GREEN); + X = PutStringAt(XR, Y, float2str(P, 1)); + PutStringAt(X+16, Y, "kPa"); //setFGcolor(COLOR_LIGHTYELLOW); //Y += 2 + fontheight; //PutStringAt(20, Y, "T MCU"); PutStringAt(wmax, Y, float2str(getMCUtemp(), 0)); diff --git a/F3:F303/NitrogenFlooding/nitrogen.bin b/F3:F303/NitrogenFlooding/nitrogen.bin index 890f77a1c155b22bd9f2deba9660d938e28a2706..73a9d5db4e6940cbc1b593cb2835d046a2d1760f 100755 GIT binary patch delta 6982 zcmcgxdwf*Ywch8 z#Hlbo?Pu3)p`3a!?LLhF-2%nIl$^38>GA3JG`zAB|*MdqCipV;=>bLm@b95b0- zU}rFDI!2b25N*CokXxv|f|tvv&G94BMGVB~s+8#%YqV#N>ZJii6QB}2tD07M{;Mh5 z)2tG`ii&PG64G3%wv4NG3CFlyyIsN`4TwmJ_Na3OkGtuZ=SNNZk~VqXLHwvDdP<(? zl<2*Ybh(OfgtV5!6$3=C0aT*9*F)C4?TK#Msu`Moi@Q z@Z0G*(9}B+w`PXN)butIyN;MakJ_&~-#ZWs##js+t2*F$t?7Wo^wL0#b4~9+3`{XF z#i-n#x7WM|l3_FI9vNutg}fPw|8UG6(tSGj{PFh+Qa=1>#_!ZCXV2Ir%vD-?2S%;A zwELw2r3z?5Qe|R77)Hf;qNRj~i)$`b{Z-R>XX)~C#*(;MEZioi9(hXk1C|G>9<++9 zAj!6)P0mm8sW>^W@ZD?XHZz)@48l(eJ6v{}qey1j={$vIhBriXi+f%aWT!mt#Z_`X zAczqk3WSrj@twD$=bF^>u5iO$Uz?;UG_`=`GJQ!gRefJbcf1@P-IB*E0{u*pdH3xh z;>vp%gxs37w!Aq#MHX2m!zDRHx&k;Kkes&(huu@rYL!}>gjd{pv|f-}4q?AL7p-Tc z)@tEdcXnO0rp)v?2HryNj;g*l5+u5|bK~K&T=JPFG`Pi;b?^?Nj3R`S12|^5KD18( z_sI#j;ZCBoL2{4;s03aGR-*4bq>(796&Av?#Ky-FlBskgIU?R68XH~O_prLbAm5je8^}HLo;TH1{ za}aZr@?1icF+k!HdN`V6PSgL1PGxq{ucIp%>dIF>&9Kh|T&G4E8TRF%iyggyVU0`Z z;+V1u0rIWJ?EHZWOc`czE5vsci5-Ysy(Zb94EE2KateI+%$LOe8OUmdUh zakn5hPOs_~V%mBI`OCo5#kIxN1?H)iULlB>U~?VcVm%{pr_Ko4)-wXx^IO|}wtidP zbe05 z+``5`3Z!|jZK3VFEv0c;Jgwuz~UNI-=}ZM^B9HH(U&e0Y?Ia z6FQX$=#kn7&>nJQ7b8FlM9>uk1=rEP#GY{Gf6dPwXB}UgZSNK8PoelMw(qh)4Ex%r z*);Y`$t&}`ACCrEokTV{ATEk(N#{V^d4+!zn9FD)-rTNl=;PNDWeIQ*%SGfLYmJro zjo;$GcbMNP4IpNlE|CuTzf1b|AHGdGLRgVlv!gBAw8!*cjAlwq&WQKVVWPX%qcNFH zb4?|ti1(@Ru+ujKi-U?4DLbO7qs-A&jApbW&LQL9@poQP8b#v$Ct|QEF2k=LevXc8 zb9POFJ-d2)8}Z^+hvi!2uLJEZuf{?FX8<~YYCcilg%gwZ6K#0m)?CK0bT zOiB{F7>S?Ud`x0tQDSBG_0&9mJ9B})KR!9-qfpgx=6SURcWy)7b<+4k!_OPUyjb2G zqVhN`yE;sB<}x{yZ%GJuKfEq<6+ozwM3hQ9S~O8$B3zmF|BD z-+yz6RYCe*d?C9vNW<}oDMmyMBB~kL=9oAW%MYOE3I-|)(!vRaY_;T<9P>TDq7lCc zePKcoJ0VCvn2?x!G4KuDuN&Bm6(`0FjwP=PV+|}HpiDyCs6p620eL4)P1u!iFkp}- z>erYLg|z%w{(%5JnV@GMTTlOyppSP1bjPDC;$(|ct;USa2+-V#3&ze0sE-ey#Vj8k zpt~p9^L9q+h9VAzZ;3E`TZG{l-iPCw;hQ4W*VdtbOXM!IIz!H}{J&^wV!@>4k-Y;% zHNR#-EsMT)Ls=QDiG%h5U6q)cSP^*^)*sbiY4ArRn;qI40^OgOl8_U54o1=RoMbu% zZJ$6tNYvgHBgKiPhb5B$Z5yslhTkY0-lNQ=Lu zz3zI@#_(6dsnwTZe@N)O;xPU*L#*UWS~n>t;ZI@XHL=b!;jz_O@VH&*bYEXje>y4C zs@p)6#Q^qPc?zU>#MIZyP4!hQ|8iIb=gnb*o#+U^yZMXgr59xOA{)sg{ElXkz9l?7 zfxE*De>6;klcrDmB0Sx4Q6Tlnb~5!>S7i#tAfuS}X?A5?AHy#Xi$RORMRxhsO7@an zXS!X;REt@zO46u|Vx7oxdYJA_%4PL`pr?|oZv337jeHI(er(3{g^SXCFJk*N=hgQR-Km~LtZc21#mQfSxp+SS8)5mk1eSj% zFbzGY1HW|_o9p=I6|^DjUGG=(q1eeia^32lUZK0Kjwhq4F#0U|dio@DQ{Y&;#(ox8 z!A`dZvHJsi+_HlVPy9sp1Qz$+K#M!(;wi@mE{;>D1z!&a`h}eM> zo#mGXsG6&EIxr_2#D^A7s#+jd0wtK6y*Px#7sFB2sw$N^?0pJ*=cheN%STvx3Jb-* zVQ(a;unh?0TxC3FZI=<*CMVMAoL zF76_0iZabh8Dq&XiO=qi2;G~Z8+#~|C~re;CBWkv`d)_Fc}Po?>JGVyt%`V$1X)Xp zP2Krc7WM&L9Ozf`4B6iHAQp$sKfJyh{S3d`UuKzUe*bHt(M0E8D6OfvR$;(m_On>h zXZ?EnbhG^G`L*(^4RX#j&d%_k1jH@;ra#YasF7X$Xr1h8qfFeWDG8MfUxse>Fne`} zjKdyKrZD`U=%LJPYpO)I$6stux`pnS65S4ek^LL8bS?!<@>`f#oQe)3(tVSrXi}nL zHsaB3q_Z`d&OiHxi#g}RIp@N;cPdv&G`*Q5!u~$u)LB(i>*Zb}^O*R=!44)A$ zHL<36`1}Hs_gHzu6JPJZuww*w0v--%Bkqfv%fV@%yM64Zcho4 zXan8#4@2HmTw;BWHji;PR-4e~slqM8@Vdwn5SM^BA8WYP#_+ETB_6wEOOkB$u%%?dd}r*9{J6l?k=&U z;ahEiRMP!oOkcZ?0*AS&jYI<-^h{klsayS3@1c&p8%rNwi12J5CH=oCU(C z?pLw5)z}L~w51{*G7(4tw16Hc2E?PYMAT_R*0jWu6U}H#KQ8bCLp(mj^Wl(|{x)lh z>KNSmw-9C9M*3A&?bx$u_5hcGFE`Ti$qUk2kA}RvLK!BVi7AeFdm=IV8|TDdA1&zL z8lp!hH>UCMCJ%{6t9V%xepZC7!u5wsU)d>th!$pRnG$+O_IxIe9?C9a@2R4nWoyTO z5h`gXS>i%sGMQ(?-q%7jURR&?E`C8MJ4sh_&cuuAjxm4@q|O(_>itWe5%wMlNgk=4 zVx`HF%dk=1F}$-wUVYHDIj5D4c_a|>J|1`;No)yFt-hFH=n{PvX2hw_VV?-n!}^7+ zE%;3SovM)cClL-?YEy(Z=3CjyFm20U$XXwwQB%^!p7ZP4<(cAig}wjnr-f6NvhD!= z>6GPcXTar|lF4K&L~f3bF=LrdWIu7kn{#H`a~NImTQl#MLwWHJ=#c#tYYgPmDS3 z)1fUx%-`{ihv859MDLsPjwS1)e=o>VH--)E27LR;HGPg1=nA`%3U@O}8&LZ);CY}Q zZxHfL_%RE8&qJ<16scwGWuL2Ox}RY`6I|UT>lpS_h#JeLBnQ2|NTsE+I@zAs^z)_) zi_*qu^^PQ4$UA}VDx1ZdFej&Do|P zM&LU7W45`r&;CS_pxuV69kw*!{qF8=J=(@?u632yWbErTuAfvj$rA?Zi1Kg1p8;p> zFwWG`A?r`lW?6{xQQ&?+FC&~5Uv?LQA_y3qw5jGwd`~zmegMGU5kKBM1}Cf2^-%3% zIZKwfK3I^p8|*?ih6kv9Q7ThNcP^UB%%HzpG=(iP(66LM z!r}_1m@ZwMG`@cs&a1VUDvl+0;=5D-k6k+#w@#WMr7+imkyjV4kkT%gRzPPuW=<*u zd39k0*SK;0!~d}s!um7EM5fer!0{rJS6e}d2Ehv&HjxE-uFifxzR~D8k&mprXBDjY zHUr#S-{87q-4RAzWH4|>uFz0ely8`pUog#;u;H2_L5W4E1~@cADMr=>Pwr50N3;p>KeG&B5jrjiw zF`^WWgCm9x=p7i;hSKbSXx}g*JMxIK1^Sb~xhX{X2INU#wE+(e@*sA6g=IK=Qm>&uhkP}9~xf*;$ZxUd;$IBVI0mtDFRX;wLp6@s)eis z^3lHxawQ-oIwH>?iN~Nn2|Nz{AY>cxdM;6(h3o+?AfbLIl8l|Y974jhPG4zv=r?*hE^Oyeyqr^d$ delta 6236 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 a$L&R9EoN{G^dv9_#^*r$H`C1RZ~hO`;j8cf diff --git a/F3:F303/NitrogenFlooding/version.inc b/F3:F303/NitrogenFlooding/version.inc index 4949b60..07d91d9 100644 --- a/F3:F303/NitrogenFlooding/version.inc +++ b/F3:F303/NitrogenFlooding/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "294" -#define BUILD_DATE "2023-05-14" +#define BUILD_NUMBER "300" +#define BUILD_DATE "2023-05-15"