495 lines
9.8 KiB
C
495 lines
9.8 KiB
C
|
|
/*
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
* IAR Development Kits
|
|||
|
|
* on the
|
|||
|
|
*
|
|||
|
|
* Nano130
|
|||
|
|
*
|
|||
|
|
* Filename : adc_calculate.c
|
|||
|
|
* Version : V1.00
|
|||
|
|
* Programmer(s) : Qian Xianghong
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
* INCLUDE FILES
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "includes.h"
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ʽ<EFBFBD><CABD>糣<EFBFBD><E7B3A3>
|
|||
|
|
const float e_Src[] =
|
|||
|
|
{
|
|||
|
|
1.62, // LNG
|
|||
|
|
1.48, // O2
|
|||
|
|
1.44, // N2
|
|||
|
|
1.52, // AR
|
|||
|
|
1.60, // CO2
|
|||
|
|
1.23, // H2<48><32><EFBFBD><EFBFBD><EFBFBD>糣<EFBFBD><E7B3A3><EFBFBD><EFBFBD>δ֪<CEB4><D6AA>
|
|||
|
|
1.10, // CNG<4E><47><EFBFBD><EFBFBD><EFBFBD>糣<EFBFBD><E7B3A3><EFBFBD><EFBFBD>δ֪<CEB4><D6AA>
|
|||
|
|
1.41, // He<48><65><EFBFBD><EFBFBD><EFBFBD>糣<EFBFBD><E7B3A3><EFBFBD><EFBFBD>δ֪<CEB4><D6AA>
|
|||
|
|
1.60, // C2H4<48><34><EFBFBD><EFBFBD><EFBFBD>糣<EFBFBD><E7B3A3><EFBFBD><EFBFBD>δ֪<CEB4><D6AA>
|
|||
|
|
1.75, // LPG<50><47><EFBFBD><EFBFBD><EFBFBD>糣<EFBFBD><E7B3A3><EFBFBD><EFBFBD>δ֪<CEB4><D6AA>
|
|||
|
|
2.5, // NH3<48><33><EFBFBD><EFBFBD><EFBFBD>糣<EFBFBD><E7B3A3><EFBFBD><EFBFBD>δ֪<CEB4><D6AA>
|
|||
|
|
1.5, // PENT<4E><54><EFBFBD><EFBFBD><EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD>糣<EFBFBD><E7B3A3><EFBFBD><EFBFBD>δ֪<CEB4><D6AA>
|
|||
|
|
1.5, // POPO<50><4F><EFBFBD><EFBFBD><EFBFBD>Ѷ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>糣<EFBFBD><E7B3A3><EFBFBD><EFBFBD>δ֪<CEB4><D6AA>
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
const Sensor_Model Adc_Sensor_Tables[1] =
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>յ<EFBFBD><D5B5>ݳ<EFBFBD><DDB3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>Զγ<D4B6><CEB3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD>ԣ<EFBFBD>, <20>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զγ<D4B6><CEB3><EFBFBD>
|
|||
|
|
// {0.0802607, 45, 0, 45}, // Բ<>ܵ<EFBFBD><DCB5><EFBFBD>,k = 2<><32>*e0 / ln(8 / 4), (e0 = 0.008854187817)
|
|||
|
|
{0.0667859, 45, 0, 45}, // Բ<>ܵ<EFBFBD><DCB5><EFBFBD>, <20>ڹ<EFBFBD><DAB9>ⲿͿ<E2B2BF><CDBF>0.2mm
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۲<EFBFBD><DBB2><EFBFBD>
|
|||
|
|
Bottle_Data Theoretical_Param;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>[0, PI/2]<5D><><EFBFBD><EFBFBD>
|
|||
|
|
#define my_cos(angle) cos(angle)
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>[0, 1]<5D><><EFBFBD><EFBFBD>
|
|||
|
|
#define my_acos(c) acos(c)
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>[0, PI/2]<5D><><EFBFBD><EFBFBD>
|
|||
|
|
#define my_sin(angle) sin(angle)
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>[0, 1]<5D><><EFBFBD><EFBFBD>
|
|||
|
|
#define my_asin(c) asin(c)
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>
|
|||
|
|
u32 Calculate_Ellipsoid_Space(u16 d)
|
|||
|
|
{
|
|||
|
|
float r = ((float) d) / 100 / 2; // <20>뾶, <20><>λmm->dm
|
|||
|
|
return (u32) (2 * PI * r * r * r / 3); // <20><>λL
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u32 Calculate_Cylinder_Space(u16 d, u16 L)
|
|||
|
|
{
|
|||
|
|
float r = (float) d / 200; // ת<><D7AA><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD>
|
|||
|
|
float l = (float) L / 100;
|
|||
|
|
return (u32)(PI * r * r * l); // <20><>λL
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u32 Calculate_Spherical_Space(u16 d)
|
|||
|
|
{
|
|||
|
|
float r = (float) d / 200; // ת<><D7AA><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD>
|
|||
|
|
return (u32)(4 * PI * r * r * r / 3); // <20><>λL
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һλ<D2BA>߶<EFBFBD><DFB6><EFBFBD><EFBFBD>뾶֮<EBBEB6>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float Calculate_Cylinder_Rate0(float hr)
|
|||
|
|
{
|
|||
|
|
float b;
|
|||
|
|
float vr;
|
|||
|
|
u8 reverse = 0;
|
|||
|
|
|
|||
|
|
if(hr > 1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD>㶥<EFBFBD><E3B6A5><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
hr = 2 - hr;
|
|||
|
|
reverse = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
b = my_acos(1 - hr);
|
|||
|
|
vr = (b - my_cos(PI / 2 - b) * (1 - hr)) / PI;
|
|||
|
|
if(!reverse)
|
|||
|
|
{
|
|||
|
|
return vr;
|
|||
|
|
}
|
|||
|
|
return 1 - vr;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һλ<D2BA>߶ȼ<DFB6><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float Calculate_Cylinder_Rate(u16 d, float h)
|
|||
|
|
{
|
|||
|
|
float hr = ((float) h) / d * 2; // <20>߶<EFBFBD><DFB6><EFBFBD><EFBFBD>뾶֮<EBBEB6><D6AE>
|
|||
|
|
return Calculate_Cylinder_Rate0(hr);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һλ<D2BA>߶ȼ<DFB6><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float Calculate_Ellipsoid_Rate(u16 d, float h)
|
|||
|
|
{
|
|||
|
|
float hr;
|
|||
|
|
float vr;
|
|||
|
|
u8 reverse = 0;
|
|||
|
|
|
|||
|
|
hr = ((float) h) / d * 2; // <20>߶<EFBFBD><DFB6><EFBFBD><EFBFBD>뾶֮<EBBEB6><D6AE>
|
|||
|
|
if(hr > 1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD>㶥<EFBFBD><E3B6A5><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
hr = 2 - hr;
|
|||
|
|
reverse = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
vr = hr * hr * (3 - hr) / 4;
|
|||
|
|
if(!reverse)
|
|||
|
|
{
|
|||
|
|
return vr;
|
|||
|
|
}
|
|||
|
|
return 1 - vr;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Һλ<D2BA>߶<EFBFBD><DFB6><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣨<D5BC>۳<DEBF><DBB3><EFBFBD>
|
|||
|
|
// <20>Թ<EFBFBD>
|
|||
|
|
u32 Calculate_Space(u16 d, float h, u32 v)
|
|||
|
|
{
|
|||
|
|
u32 ve = Calculate_Ellipsoid_Space(d);
|
|||
|
|
u32 vc = v - ve;
|
|||
|
|
float re = Calculate_Ellipsoid_Rate(d, h);
|
|||
|
|
float rc = Calculate_Cylinder_Rate(d, h);
|
|||
|
|
|
|||
|
|
return (u32) (ve * re + vc * rc);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Һλ<D2BA>߶<EFBFBD><DFB6><EFBFBD>ֱ<EFBFBD><D6B1>֮<EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD>п۳<D0BF><DBB3><EFBFBD>
|
|||
|
|
// v0: <20><><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA>
|
|||
|
|
// <20>Թ<EFBFBD>
|
|||
|
|
u32 Calculate_Volume(u16 d, float h, u32 v, u16 v0)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>ݻ<EFBFBD>
|
|||
|
|
u32 space = Calculate_Space(d, h, v);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
if(space < v0)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
return space - v0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Һλ<D2BA>߶ȣ<DFB6><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣨<D5BC>۳<DEBF><DBB3><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
u32 Calculate_Space_Stand(u16 d, u16 L, float H)
|
|||
|
|
{
|
|||
|
|
float r = (float) d / 200; // תΪdm<64><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λΪL
|
|||
|
|
float l = (float) L / 100;
|
|||
|
|
float h = (float) H / 100;
|
|||
|
|
|
|||
|
|
if(h <= r / 2)
|
|||
|
|
{
|
|||
|
|
// ֻ<>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
return 2 * PI * r * h * h - 4 * PI * h * h * h / 3;
|
|||
|
|
}
|
|||
|
|
if(h <= r / 2 + l)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+Բ<><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
h -= r/2;
|
|||
|
|
return PI * r * r * r / 3 + PI * r * r * h;
|
|||
|
|
}
|
|||
|
|
if(h <= r / 2 + l + r / 2)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B>м<EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
h -= r / 2 + l;
|
|||
|
|
return PI * r * r * r / 3 + PI * r * r * l + PI * r * r * h - 4 * PI * h * h * h / 3;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>߶ȳ<DFB6><C8B3><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>Χ
|
|||
|
|
return 2 * PI * r * r * r / 3 + PI * r * r * l;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Һλ<D2BA>߶ȣ<DFB6><C8A3><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD>п۳<D0BF><DBB3><EFBFBD>
|
|||
|
|
// v0: <20><><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
u32 Calculate_Volume_Stand(u16 d, u16 L, float H, u16 v0)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>ݻ<EFBFBD>
|
|||
|
|
u32 space = Calculate_Space_Stand(d, L, H);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
if(space < v0)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
return space - v0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Һλ<D2BA>߶ȣ<DFB6><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣨<D5BC>۳<DEBF><DBB3><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
u32 Calculate_Space_Spherical(u16 d, float H)
|
|||
|
|
{
|
|||
|
|
float r = (float) d / 200; // תΪdm<64><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λΪL
|
|||
|
|
float h = (float) H / 100;
|
|||
|
|
|
|||
|
|
if(h <= r)
|
|||
|
|
{
|
|||
|
|
// <20>߶<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
return PI * r * h * h - PI * h * h * h / 3;
|
|||
|
|
}
|
|||
|
|
if(h <= r + r)
|
|||
|
|
{
|
|||
|
|
// <20>߶ȳ<DFB6><C8B3><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
h = r + r - h;
|
|||
|
|
return 4 * PI * r * r * r / 3 - PI * r * h * h + PI * h * h * h / 3;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>߶ȳ<DFB6><C8B3><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>Χ
|
|||
|
|
return 4 * PI * r * r * r / 3;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Һλ<D2BA>߶ȣ<DFB6><C8A3><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD>п۳<D0BF><DBB3><EFBFBD>
|
|||
|
|
// v0: <20><><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
u32 Calculate_Volume_Spherical(u16 d, float H, u16 v0)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>ݻ<EFBFBD>
|
|||
|
|
u32 space = Calculate_Space_Spherical(d, H);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
if(space < v0)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
return space - v0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD>ɲⲿ<C9B2>ָ߶<D6B8>
|
|||
|
|
s16 Calculate_Base_Height(s16 d, s16 base_d, s16 base_len)
|
|||
|
|
{
|
|||
|
|
float r = ((float) d) / 2 ;
|
|||
|
|
float base_r = ((float) base_d) / 2;
|
|||
|
|
float b = my_asin(base_r / r);
|
|||
|
|
b = my_cos(b);
|
|||
|
|
return (s16) (r * (1 - b)) + base_len;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۲<EFBFBD><DBB2><EFBFBD>
|
|||
|
|
u8 Calculate_Theoretical_Params(u8 bottle_type, u16 d, u16 L, uint8_t chargePct, float density)
|
|||
|
|
{
|
|||
|
|
u8 vresv_percent = 0;// <20><><EFBFBD>װٷֱȣ<D6B1><C8A3>̶<EFBFBD>Ϊ0
|
|||
|
|
|
|||
|
|
u16 h0, h1, zero_h;
|
|||
|
|
u16 zero_v, v0;
|
|||
|
|
|
|||
|
|
Theoretical_Param.LSrc_k = 1000 / 9.8 / density;
|
|||
|
|
if(bottle_type == BOTTLE_TYPE_SPHERICAL)
|
|||
|
|
Theoretical_Param.v = Calculate_Spherical_Space(d);
|
|||
|
|
else
|
|||
|
|
Theoretical_Param.v = Calculate_Ellipsoid_Space(d) + Calculate_Cylinder_Space(d, L);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2>߶<EFBFBD>
|
|||
|
|
Theoretical_Param.nl_len = Calculate_Base_Height(d, Adc_Sensor_Tables[0].base_d, Adc_Sensor_Tables[0].base_len);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
if(vresv_percent == 0)
|
|||
|
|
{
|
|||
|
|
Theoretical_Param.zero_height = 0;
|
|||
|
|
Theoretical_Param.v0 = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
h0 = 0;
|
|||
|
|
if(bottle_type == BOTTLE_TYPE_STAND)
|
|||
|
|
{
|
|||
|
|
h1 = d / 4 + L / 2; // <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
h1 = d / 2; // <20>Թޡ<D4B9><DEA1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
v0 = (u16) (Theoretical_Param.v * (vresv_percent * 0.01)); // Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA>
|
|||
|
|
while(1)
|
|||
|
|
{
|
|||
|
|
zero_h = (h0 + h1) / 2;
|
|||
|
|
if(bottle_type == BOTTLE_TYPE_LYING)
|
|||
|
|
{
|
|||
|
|
zero_v = Calculate_Volume(d, zero_h, Theoretical_Param.v, 0);
|
|||
|
|
}
|
|||
|
|
else if(bottle_type == BOTTLE_TYPE_STAND)
|
|||
|
|
{
|
|||
|
|
zero_v = Calculate_Volume_Stand(d, L, zero_h, 0);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
zero_v = Calculate_Volume_Spherical(d, zero_h, 0);
|
|||
|
|
}
|
|||
|
|
if(zero_v == v0)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else if(zero_v > v0)
|
|||
|
|
{
|
|||
|
|
if(zero_h == h0)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
h1 = zero_h - 1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(zero_h == h1)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
h0 = zero_h + 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Theoretical_Param.zero_height = zero_h;
|
|||
|
|
Theoretical_Param.v0 = zero_v;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>Ч<EFBFBD>ݻ<EFBFBD>
|
|||
|
|
Theoretical_Param.ve = (Theoretical_Param.v - Theoretical_Param.v0) * chargePct / 100;
|
|||
|
|
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>жϲɼ<CFB2><C9BC><EFBFBD><EFBFBD>ݷ<EFBFBD>Χ<EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>
|
|||
|
|
// <20><><EFBFBD>룺<EFBFBD>ɼ<EFBFBD>ֵ<EFBFBD><D6B5>У<EFBFBD><D0A3>ֵ<EFBFBD><D6B5>У<EFBFBD><D0A3>ֵ
|
|||
|
|
// <20><><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4>ֽ<EFBFBD>
|
|||
|
|
u8 ADC_Validate(u32 adc, u32 zero, u32 full)
|
|||
|
|
{
|
|||
|
|
u32 temp;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD><F2A3ACBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ADCֵ
|
|||
|
|
if(zero > full)
|
|||
|
|
{
|
|||
|
|
temp = zero;
|
|||
|
|
zero = full;
|
|||
|
|
full = temp;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>У<D0A3><D7BC><EFBFBD><EFBFBD>1/3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ<EFBFBD><CEA7>1/3<><33>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
|||
|
|
if(adc < zero / 3 || adc + (full - zero) / 3 < zero)
|
|||
|
|
return SENSOR_STATUS_NOCONNECT;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>У<D0A3><D7BC><EFBFBD><EFBFBD>1/2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ<EFBFBD><CEA7>1/4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(adc < zero / 2 || adc + (full - zero) / 4 < zero)
|
|||
|
|
return SENSOR_STATUS_UNDERFLOW;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ<EFBFBD><CEA7>1/4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(adc > full + (full - zero) / 4)
|
|||
|
|
return SENSOR_STATUS_OVERFLOW;
|
|||
|
|
|
|||
|
|
return SENSOR_STATUS_NORMAL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD>룺adc<64><63>Уֵ<D7BC><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ֵ
|
|||
|
|
float ADC_Calculate(u32 adc, u32 zero, u32 full, s32 low, s32 high)
|
|||
|
|
{
|
|||
|
|
if(zero > full)
|
|||
|
|
{
|
|||
|
|
if(adc <= full)
|
|||
|
|
return high; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
if(adc >= zero)
|
|||
|
|
return low; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
|
|||
|
|
return low + ((float) (zero - adc)) / (zero - full) * (high - low);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(adc <= zero)
|
|||
|
|
return low; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
|
|||
|
|
if(adc >= full)
|
|||
|
|
return high; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
return low + ((float) (adc - zero)) / (full - zero) * (high - low);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ð<><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD><D9B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void sort(u32 numbs[], s8 cnt)
|
|||
|
|
{
|
|||
|
|
s8 i, j, k;
|
|||
|
|
u32 temp;
|
|||
|
|
|
|||
|
|
for(i = 0; i < cnt - 1; i++)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ
|
|||
|
|
k = i;
|
|||
|
|
temp = numbs[k];
|
|||
|
|
for(j = i + 1; j < cnt; j++)
|
|||
|
|
{
|
|||
|
|
if(numbs[j] < temp)
|
|||
|
|
{
|
|||
|
|
k = j;
|
|||
|
|
temp = numbs[k];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
if(k != i)
|
|||
|
|
{
|
|||
|
|
numbs[k] = numbs[i];
|
|||
|
|
numbs[i] = temp;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// KPaת<61><D7AA><EFBFBD><EFBFBD>mmH2O
|
|||
|
|
float KPa2mmH2O(float KPa)
|
|||
|
|
{
|
|||
|
|
return KPa * 101.9716213;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ѹת<D1B9><D7AA>ΪҺλ<D2BA>߶<EFBFBD>
|
|||
|
|
float Diff2Level(float dp, u8 bottle_type, u16 d, u16 L) // <20><>λKPa<50><61>mm
|
|||
|
|
{
|
|||
|
|
float h = Theoretical_Param.LSrc_k * dp;
|
|||
|
|
u16 max_h;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӹ߶<D3B8>
|
|||
|
|
if(bottle_type == BOTTLE_TYPE_STAND)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
|
|||
|
|
max_h = L + d / 2;
|
|||
|
|
if(h > max_h)
|
|||
|
|
h = max_h;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20>Թޡ<D4B9><DEA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
|
|||
|
|
if(h > d)
|
|||
|
|
h = d;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return h;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>߶<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
|
u32 Level2Vol(float h, u8 bottle_type, u16 d, u16 L) // <20><>λmm<6D><6D>L
|
|||
|
|
{
|
|||
|
|
u32 v;
|
|||
|
|
|
|||
|
|
if(bottle_type == BOTTLE_TYPE_LYING)
|
|||
|
|
{
|
|||
|
|
// <20>Թ<EFBFBD>
|
|||
|
|
v = Calculate_Volume(d, h, Theoretical_Param.v, Theoretical_Param.v0);
|
|||
|
|
}
|
|||
|
|
else if(bottle_type == BOTTLE_TYPE_STAND)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
v = Calculate_Volume_Stand(d, L, h, Theoretical_Param.v0);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
v = Calculate_Volume_Spherical(d, h, Theoretical_Param.v0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(v > Theoretical_Param.v - Theoretical_Param.v0)
|
|||
|
|
v = Theoretical_Param.v - Theoretical_Param.v0;
|
|||
|
|
|
|||
|
|
return v;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
|
u32 Vol2Quantity(float v, float density) // <20><>λL<CEBB><4C>kg
|
|||
|
|
{
|
|||
|
|
return density * v;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
|
u32 Quantity2Vol(float quantity, float density) // <20><>λkg<6B><67>L
|
|||
|
|
{
|
|||
|
|
u32 v = quantity / density;
|
|||
|
|
|
|||
|
|
if(v > Theoretical_Param.v - Theoretical_Param.v0)
|
|||
|
|
v = Theoretical_Param.v - Theoretical_Param.v0;
|
|||
|
|
|
|||
|
|
return v;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|