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 890f77a..73a9d5d 100755 Binary files a/F3:F303/NitrogenFlooding/nitrogen.bin and b/F3:F303/NitrogenFlooding/nitrogen.bin differ 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"