790 lines
20 KiB
C
790 lines
20 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, 40, 0, 40}, // ƽ<><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,k = 2<><32>*e0 / ln(8 / 4), (e0 = 0.008854187817)
|
|||
|
|
// {0.0802607, 135, 0, 135}, // ƽ<><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,k = 2<><32>*e0 / ln(8 / 4), (e0 = 0.008854187817)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// <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()
|
|||
|
|
{
|
|||
|
|
Theoretical_Param.LSrc_k = 1000 / 9.8 / Config_GetDensity(dcBuff.configBottle.source);
|
|||
|
|
Theoretical_Param.v = dcBuff.configBottle.vol;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2>߶<EFBFBD>
|
|||
|
|
Theoretical_Param.nl_len = 0;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD>߶ȣ<DFB6><C8A3>̶<EFBFBD>Ϊ0
|
|||
|
|
Theoretical_Param.zero_height = 0;
|
|||
|
|
Theoretical_Param.v0 = 0;
|
|||
|
|
|
|||
|
|
// <20><>Ч<EFBFBD>ݻ<EFBFBD>
|
|||
|
|
Theoretical_Param.ve = Theoretical_Param.v * dcBuff.configBottle.chargePct / 100 - Theoretical_Param.v0;
|
|||
|
|
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// KPaת<61><D7AA><EFBFBD><EFBFBD>MPa
|
|||
|
|
float KPa2MPa(float KPa)
|
|||
|
|
{
|
|||
|
|
return KPa * 0.001;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// KPaת<61><D7AA><EFBFBD><EFBFBD>PSI
|
|||
|
|
float KPa2PSI(float KPa)
|
|||
|
|
{
|
|||
|
|
return KPa * 0.1450377439;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ѹת<D1B9><D7AA>ΪҺλ<D2BA>߶<EFBFBD>
|
|||
|
|
float Diff2Level(float dp) // <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(dcBuff.configBottle.type == BOTTLE_TYPE_STAND)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
|
|||
|
|
max_h = dcBuff.configBottle.len + dcBuff.configBottle.lenExtra * 2 + dcBuff.configBottle.diameter / 2;
|
|||
|
|
if(h > max_h)
|
|||
|
|
h = max_h;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20>Թޡ<D4B9><DEA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
|
|||
|
|
if(h > dcBuff.configBottle.diameter)
|
|||
|
|
h = dcBuff.configBottle.diameter;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return h;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>߶<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
|
u32 Level2Vol(float h) // <20><>λmm<6D><6D>L
|
|||
|
|
{
|
|||
|
|
u32 v;
|
|||
|
|
|
|||
|
|
if(dcBuff.configBottle.type == BOTTLE_TYPE_LYING)
|
|||
|
|
{
|
|||
|
|
// <20>Թ<EFBFBD>
|
|||
|
|
v = Calculate_Volume(dcBuff.configBottle.diameter, h, Theoretical_Param.v, Theoretical_Param.v0);
|
|||
|
|
}
|
|||
|
|
else if(dcBuff.configBottle.type == BOTTLE_TYPE_STAND)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
v = Calculate_Volume_Stand(dcBuff.configBottle.diameter, dcBuff.configBottle.len + dcBuff.configBottle.lenExtra * 2, h, Theoretical_Param.v0);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
v = Calculate_Volume_Spherical(dcBuff.configBottle.diameter, h, Theoretical_Param.v0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(v > Theoretical_Param.ve)
|
|||
|
|
v = Theoretical_Param.ve;
|
|||
|
|
|
|||
|
|
return v;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
|
u32 Vol2Quantity(float v) // <20><>λL<CEBB><4C>kg
|
|||
|
|
{
|
|||
|
|
return Config_GetDensity(dcBuff.configBottle.source) * v;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
|
u32 Quantity2Vol(float quantity) // <20><>λkg<6B><67>L
|
|||
|
|
{
|
|||
|
|
u32 v = quantity / Config_GetDensity(dcBuff.configBottle.source);
|
|||
|
|
|
|||
|
|
if(v > Theoretical_Param.ve)
|
|||
|
|
v = Theoretical_Param.ve;
|
|||
|
|
|
|||
|
|
return v;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ***********************************************
|
|||
|
|
// <20><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>
|
|||
|
|
// ***********************************************
|
|||
|
|
|
|||
|
|
// <20><>ADCת<43><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ֵ
|
|||
|
|
s16 adc_k_convert(s16 adc, s16 c1ADC, s16 c2ADC, s16 c1, s16 c2)
|
|||
|
|
{
|
|||
|
|
float k, b;
|
|||
|
|
s16 val;
|
|||
|
|
|
|||
|
|
if(adc == -1)
|
|||
|
|
return -1;
|
|||
|
|
|
|||
|
|
if(c2ADC <= c1ADC)
|
|||
|
|
return 0;
|
|||
|
|
|
|||
|
|
k = (float) (c2 - c1) / (c2ADC - c1ADC);
|
|||
|
|
b = (float) (c1 * c2ADC - c2 * c1ADC) / (c2ADC - c1ADC);
|
|||
|
|
|
|||
|
|
val = (s16) (k * adc + b + 0.5);
|
|||
|
|
if(val < 0)
|
|||
|
|
return 0;
|
|||
|
|
|
|||
|
|
return val;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Һλ<D2BA>߶<EFBFBD>
|
|||
|
|
float Cap_Calculate(s16 cap, s16 base, s16 ref)
|
|||
|
|
{
|
|||
|
|
u16 L;
|
|||
|
|
float h;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>㴫<EFBFBD><E3B4AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<3D><><EFBFBD>Ӹ߶<D3B8>
|
|||
|
|
if(dcBuff.configBottle.type == BOTTLE_TYPE_STAND)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>߶<DEB8>
|
|||
|
|
L = dcBuff.configBottle.len + dcBuff.configBottle.lenExtra * 2 + dcBuff.configBottle.diameter / 2;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20>Թޡ<D4B9><DEA1><EFBFBD><EFBFBD>߶<DEB8>
|
|||
|
|
L = dcBuff.configBottle.diameter;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>㴫<EFBFBD><E3B4AB><EFBFBD><EFBFBD><EFBFBD>ɲⲿ<C9B2>ֵ<EFBFBD><D6B5><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
|
L -= Adc_Sensor_Tables[0].nl_len;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>Һλ<D2BA>߶ȣ<DFB6><C8A3>ɲⲿ<C9B2>֣<EFBFBD>
|
|||
|
|
h = (float) (cap - base) / ref * L;
|
|||
|
|
|
|||
|
|
if(h <= 0)
|
|||
|
|
return 0;
|
|||
|
|
|
|||
|
|
if(h > L)
|
|||
|
|
h = L;
|
|||
|
|
|
|||
|
|
// <20>߶ȼ<DFB6><C8BC>ϵײ<CFB5><D7B2><EFBFBD><EFBFBD>ɲⲿ<C9B2><E2B2BF>
|
|||
|
|
return h + Theoretical_Param.nl_len;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// PT100<30><30><EFBFBD><EFBFBD><EFBFBD>裨<EFBFBD>¶<EFBFBD><C2B6><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
|||
|
|
const float PT100_Resis[281] =
|
|||
|
|
{
|
|||
|
|
18.52, // -200<30><30>
|
|||
|
|
18.95, 19.38, 19.82, 20.25, 20.68, 21.11, 21.54, 21.97, 22.40, 22.83, // -190<39><30>
|
|||
|
|
23.25, 23.68, 24.11, 24.54, 24.97, 25.39, 25.82, 26.24, 26.67, 27.10, // -180<38><30>
|
|||
|
|
27.52, 27.95, 28.37, 28.80, 29.22, 29.64, 30.07, 30.49, 30.91, 31.34, // -170<37><30>
|
|||
|
|
31.76, 32.18, 32.60, 33.02, 33.44, 33.86, 34.28, 34.70, 35.12, 35.54, // -160<36><30>
|
|||
|
|
35.96, 36.38, 36.80, 37.22, 37.64, 38.05, 38.47, 38.89, 39.31, 39.72, // -150<35><30>
|
|||
|
|
40.14, 40.56, 40.97, 41.39, 41.80, 42.22, 42.63, 43.05, 43.46, 43.88, // -140<34><30>
|
|||
|
|
44.29, 44.70, 45.12, 45.53, 45.94, 46.36, 46.77, 47.18, 47.59, 48.00, // -130<33><30>
|
|||
|
|
48.42, 48.83, 49.24, 49.65, 50.06, 50.47, 50.88, 51.29, 51.77, 52.11, // -120<32><30>
|
|||
|
|
52.50, 52.93, 53.34, 53.75, 54.15, 54.56, 54.97, 55.38, 55.79, 56.19, // -110<31><30>
|
|||
|
|
56.60, 57.01, 57.41, 57.82, 58.23, 58.63, 59.04, 59.41, 59.85, 60.25, // -100<30><30>
|
|||
|
|
60.66, 61.07, 61.47, 61.88, 62.28, 62.68, 63.09, 63.49, 63.90, 64.30, // -90<39><30>
|
|||
|
|
64.70, 65.11, 65.51, 65.91, 66.31, 66.72, 67.12, 67.52, 67.92, 68.33, // -80<38><30>
|
|||
|
|
68.73, 69.13, 69.53, 69.93, 70.33, 70.73, 71.13, 91.53, 71.93, 72.33, // -70<37><30>
|
|||
|
|
72.73, 73.13, 73.53, 73.93, 74.33, 74.73, 75.13, 75.53, 75.93, 76.33, // -60<36><30>
|
|||
|
|
76.73, 77.12, 77.52, 77.92, 78.32, 78.72, 79.11, 79.51, 79.91, 80.31, // -50<35><30>
|
|||
|
|
80.70, 81.10, 81.50, 81.89, 82.29, 82.69, 83.08, 83.48, 83.87, 84.27, // -40<34><30>
|
|||
|
|
84.67, 85.06, 85.46, 85.85, 86.25, 86.64, 87.04, 87.43, 87.83, 88.22, // -30<33><30>
|
|||
|
|
88.62, 89.01, 89.40, 89.80, 90.19, 90.59, 90.98, 91.37, 91.77, 92.16, // -20<32><30>
|
|||
|
|
92.55, 92.95, 93.34, 93.73, 94.12, 94.52, 94.91, 95.30, 95.69, 96.09, // -10<31><30>
|
|||
|
|
96.48, 96.87, 97.26, 97.65, 98.04, 98.44, 98.83, 99.22, 99.61, 100.00, // 0<><30>
|
|||
|
|
100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51, // 9<><39>
|
|||
|
|
103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40, // 19<31><39>
|
|||
|
|
107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.01, // 29 <20><>
|
|||
|
|
111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15, // 39<33><39>
|
|||
|
|
115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01, // 49<34><39>
|
|||
|
|
119.40, 119.78, 120.07, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86, // 59<35><39>
|
|||
|
|
123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69, // 69<36><39>
|
|||
|
|
127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52, // 79<37><39>
|
|||
|
|
130.90 // 80<38><30>
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD>-<2D><><EFBFBD>¶<EFBFBD>
|
|||
|
|
float PT100_Resit2Tempr(float r)
|
|||
|
|
{
|
|||
|
|
s16 count = sizeof(PT100_Resis) / sizeof(float);
|
|||
|
|
s16 i;
|
|||
|
|
|
|||
|
|
if(r <= PT100_Resis[0] * dcBuff.configDisplay.op_PT100_MULTI)
|
|||
|
|
return -200;
|
|||
|
|
if(r >= PT100_Resis[count - 1] * dcBuff.configDisplay.op_PT100_MULTI)
|
|||
|
|
return (count - 1) - 200;
|
|||
|
|
|
|||
|
|
for(i = count - 2; i >= 0; i--)
|
|||
|
|
{
|
|||
|
|
if(r >= PT100_Resis[i] * dcBuff.configDisplay.op_PT100_MULTI)
|
|||
|
|
return (i - 200) + (r - PT100_Resis[i] * dcBuff.configDisplay.op_PT100_MULTI) / (PT100_Resis[i + 1] * dcBuff.configDisplay.op_PT100_MULTI - PT100_Resis[i] * dcBuff.configDisplay.op_PT100_MULTI);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣺<EFBFBD>¶<EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float PT100_Tempr2Resit(float t)
|
|||
|
|
{
|
|||
|
|
s16 count = sizeof(PT100_Resis) / sizeof(float);
|
|||
|
|
s16 idx = floor(t) + 200;
|
|||
|
|
|
|||
|
|
if(t <= -200)
|
|||
|
|
return PT100_Resis[0] * dcBuff.configDisplay.op_PT100_MULTI;
|
|||
|
|
if(t >= (count - 1) - 200)
|
|||
|
|
return PT100_Resis[count - 1] * dcBuff.configDisplay.op_PT100_MULTI;
|
|||
|
|
|
|||
|
|
return PT100_Resis[idx] * dcBuff.configDisplay.op_PT100_MULTI + (t - (idx - 200)) * (PT100_Resis[idx + 1] * dcBuff.configDisplay.op_PT100_MULTI - PT100_Resis[idx] * dcBuff.configDisplay.op_PT100_MULTI);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD>
|
|||
|
|
//
|
|||
|
|
// V=3v
|
|||
|
|
// |
|
|||
|
|
// | |----R--V1--r--Rx---|
|
|||
|
|
// |-----| |---r--R0-----
|
|||
|
|
// |----R--V2--r-------| |
|
|||
|
|
// GND
|
|||
|
|
//
|
|||
|
|
// ˵<><CBB5><EFBFBD><EFBFBD>I1 = (V - V1) / R, I2 = (V - V2) / R, I = I1 + I2
|
|||
|
|
// I1 * (r + Rx) + I * (r + R0) = V1
|
|||
|
|
// I2 * (r) + I * (r + R0) = V2
|
|||
|
|
// (<28><><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>ѹԭ<D1B9><D4AD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹVx<56><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Rx
|
|||
|
|
float RDiff_Volt2Resit(double V1, double V2)
|
|||
|
|
{
|
|||
|
|
double V = 3, R = 1000, R0 = 0;
|
|||
|
|
double I1, I2, I, FM, Rx, r;
|
|||
|
|
|
|||
|
|
if(V - V1 >= -0.025 && V - V1 <= 0.025)
|
|||
|
|
return 0;
|
|||
|
|
if(V1 >= -0.025 && V1 <= 0.025) // <20><>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
return 200 * dcBuff.configDisplay.op_PT100_MULTI;
|
|||
|
|
|
|||
|
|
I1 = (V - V1) / R;
|
|||
|
|
I2 = (V - V2) / R;
|
|||
|
|
I = I1 + I2;
|
|||
|
|
|
|||
|
|
r = (V2 - I * R0) / (I2 + I);
|
|||
|
|
#if 1
|
|||
|
|
FM = I1 * (I + I2);
|
|||
|
|
Rx = ((V1 - I * R0) * (I + I2) - (V2 - I * R0) * (I + I1)) / FM;
|
|||
|
|
#else
|
|||
|
|
Rx = (V1 - V2) * R / (V - V1);
|
|||
|
|
if(r > 0)
|
|||
|
|
Rx += (V1 - V2) * r / (V - V1);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
// printf("\nV1 = %f, V2 = %f, Rx = %f, r = %f\n", V1, V2, Rx, r);
|
|||
|
|
return Rx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD>
|
|||
|
|
//
|
|||
|
|
// V=5v
|
|||
|
|
// |
|
|||
|
|
// |------------| 5V
|
|||
|
|
// | | |
|
|||
|
|
// R=5000<30><30> R=5000<30><30> |\|
|
|||
|
|
// | | | \
|
|||
|
|
// |--------------------------- + --| \ 12λAD(Vref=3v<33><76>
|
|||
|
|
// | | | a |------------------- Vx<56><78>2.863~0.572v<EFBFBD><EFBFBD>------------------>(3909~781)
|
|||
|
|
// | |-------------- - --| /
|
|||
|
|
// | | | /|
|
|||
|
|
// | r0=4500<30><30> |/||
|
|||
|
|
// | | ||
|
|||
|
|
// r=5000<30><30> Rx(105.295~675.68<EFBFBD><EFBFBD><EFBFBD><EFBFBD> GND Vb=1.25v, a=15.7
|
|||
|
|
// | |
|
|||
|
|
// |------------|
|
|||
|
|
// |
|
|||
|
|
// GND
|
|||
|
|
//
|
|||
|
|
// r r0 + Rx
|
|||
|
|
// Vx = (--------- - ----------------) * V * a + Vb
|
|||
|
|
// r + R r0 + Rx + R
|
|||
|
|
//
|
|||
|
|
// <20>ݴ˿ɵ<CBBF><C9B5>Ƴ<EFBFBD>Rx<52><78>Vx<56>Ĺ<EFBFBD>ϵ
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹVx<56><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Rx
|
|||
|
|
float RBridge_Volt2Resit(float Vx)
|
|||
|
|
{
|
|||
|
|
float a = 15.7; // <20>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float R = 1000 * dcBuff.configDisplay.op_PT100_MULTI; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
|
|||
|
|
float r = 1000 * dcBuff.configDisplay.op_PT100_MULTI; // <20>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float r0 = 900 * dcBuff.configDisplay.op_PT100_MULTI; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float V = 5; // <20><><EFBFBD>ŵ<EFBFBD>ѹ
|
|||
|
|
float Vb = 1.25; // <20><><EFBFBD><D7BC>ѹ
|
|||
|
|
|
|||
|
|
// <20>м<EFBFBD>ֵ
|
|||
|
|
float b = r / (r + R) - (Vx - Vb) / V / a;
|
|||
|
|
|
|||
|
|
return b * R / (1 - b) - r0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int16_t PT100_CalTempr(s32 adc1, s32 adc2, s16 cTx10, s16 cRx10)
|
|||
|
|
{
|
|||
|
|
float calibrateT, calibrateR, calibrateR100, calibrateRLine;
|
|||
|
|
double V1, V2;
|
|||
|
|
float Rx, Vx;
|
|||
|
|
float deltaR, r100, t, RLine, r;
|
|||
|
|
|
|||
|
|
if(!dcBuff.configDisplay.op_PT100_3LINE)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD>
|
|||
|
|
calibrateT = (float) cTx10 / 10;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD><C2B6>µ<EFBFBD><C2B5>ܵ<EFBFBD><DCB5><EFBFBD>
|
|||
|
|
calibrateR = (float) cRx10 / 10;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD><C2B6>µ<EFBFBD>PT100<30><30><EFBFBD><EFBFBD>
|
|||
|
|
calibrateR100 = PT100_Tempr2Resit(calibrateT);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD><C2B6>µ<EFBFBD><C2B5>ߵ<EFBFBD><DFB5><EFBFBD>
|
|||
|
|
calibrateRLine = (calibrateR <= calibrateR100 ? 0 : calibrateR - calibrateR100);
|
|||
|
|
|
|||
|
|
if(dcBuff.configDisplay.op_DIFF_RESIST)
|
|||
|
|
{
|
|||
|
|
// <20><>adcֵת<D6B5><D7AA>Ϊ<EFBFBD><CEAA>ѹ<EFBFBD><D1B9>VREFΪ3V<33><56>
|
|||
|
|
V1 = (double) adc1 / 4096 * 3.0;
|
|||
|
|
V2 = (double) adc2 / 4096 * 3.0;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ѹֵת<D6B5><D7AA><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
Rx = RDiff_Volt2Resit(V1, V2);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20><>adcֵת<D6B5><D7AA>Ϊ<EFBFBD><CEAA>ѹ<EFBFBD><D1B9>VREFΪ3V<33><56>
|
|||
|
|
Vx = (float) adc1 / 4096 * 3.0;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ѹֵת<D6B5><D7AA><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
Rx = RBridge_Volt2Resit(Vx);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ܵĵ<DCB5><C4B5><EFBFBD><EFBFBD>仯
|
|||
|
|
deltaR = Rx - calibrateR;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>Լ<EFBFBD><D4BC>㣺<EFBFBD><E3A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>仯<EFBFBD><E4BBAF><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>ΪPT100<30><30><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD>ڲ<EFBFBD>ͬ<EFBFBD>¶<EFBFBD><C2B6>µĵ<C2B5><C4B5><EFBFBD><EFBFBD>仯<EFBFBD><E4BBAF>
|
|||
|
|
r100 = calibrateR100 + deltaR;
|
|||
|
|
// <20><><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>PT100<30><30><EFBFBD>¶<EFBFBD>
|
|||
|
|
t = PT100_Resit2Tempr(r100);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>¶<EFBFBD><C2B6>µ<EFBFBD><C2B5>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD>仯<EFBFBD><E4BBAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶Ⱥ<C2B6>ʵ<EFBFBD><CAB5><EFBFBD>¶<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0B2BB><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>豾<EFBFBD><E8B1BE>Ҳ<EFBFBD><D2B2>С<EFBFBD><D0A1><EFBFBD>ʺ<EFBFBD><CABA>ԣ<EFBFBD>
|
|||
|
|
// <20>¶<EFBFBD>ÿ<EFBFBD>½<EFBFBD>1<EFBFBD>棬<EFBFBD><E6A3AC><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>1.3<EFBFBD><EFBFBD>
|
|||
|
|
RLine = calibrateRLine * (1 - (calibrateT - t) * 0.0013);
|
|||
|
|
// <20><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>
|
|||
|
|
r = Rx - RLine;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶<EFBFBD>
|
|||
|
|
return PT100_Resit2Tempr(r);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 3<><33><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>
|
|||
|
|
if(dcBuff.configDisplay.op_DIFF_RESIST)
|
|||
|
|
{
|
|||
|
|
// <20><>adcֵת<D6B5><D7AA>Ϊ<EFBFBD><CEAA>ѹ<EFBFBD><D1B9>VREFΪ3V<33><56>
|
|||
|
|
V1 = (double) adc1 / 4096 * 3.0;
|
|||
|
|
V2 = (double) adc2 / 4096 * 3.0;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ѹֵת<D6B5><D7AA><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
Rx = RDiff_Volt2Resit(V1, V2);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD>
|
|||
|
|
calibrateT = (float) cTx10 / 10;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD><C2B6>µ<EFBFBD><C2B5>ܵ<EFBFBD><DCB5><EFBFBD>
|
|||
|
|
calibrateR = (float) cRx10 / 10;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD><C2B6>µ<EFBFBD>PT100<30><30><EFBFBD><EFBFBD>
|
|||
|
|
calibrateR100 = PT100_Tempr2Resit(calibrateT);
|
|||
|
|
|
|||
|
|
Rx += (calibrateR100 - calibrateR);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20><>adcֵת<D6B5><D7AA>Ϊ<EFBFBD><CEAA>ѹ<EFBFBD><D1B9>VREFΪ3V<33><56>
|
|||
|
|
Vx = (float) adc1 / 4096 * 3.0;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ѹֵת<D6B5><D7AA><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
Rx = RBridge_Volt2Resit(Vx);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>¶<EFBFBD>
|
|||
|
|
return PT100_Resit2Tempr(Rx);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float PT100_CalResit(s32 adc1, s32 adc2)
|
|||
|
|
{
|
|||
|
|
if(dcBuff.configDisplay.op_DIFF_RESIST)
|
|||
|
|
return RDiff_Volt2Resit((double) adc1 / 4096 * 3, (double) adc2 / 4096 * 3) ;
|
|||
|
|
return RBridge_Volt2Resit((float) adc1 / 4096 * 3.0) ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ݱ궨ֵ<EAB6A8><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵IJ<CCB5><C4B2><EFBFBD>ֵ
|
|||
|
|
void PT100_Calculate_Theoretical_Params(int16_t lowRange, int16_t highRange)
|
|||
|
|
{
|
|||
|
|
float a = 15.7; // <20>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float R = 1000 * dcBuff.configDisplay.op_PT100_MULTI; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
|
|||
|
|
float r = 1000 * dcBuff.configDisplay.op_PT100_MULTI; // <20>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float r0 = 900 * dcBuff.configDisplay.op_PT100_MULTI; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
float V = 5; // <20><><EFBFBD>ŵ<EFBFBD>ѹ
|
|||
|
|
float Vb = 1.25; // <20><><EFBFBD><D7BC>ѹ
|
|||
|
|
|
|||
|
|
// <20>м<EFBFBD>ֵ
|
|||
|
|
float b = r / (r + R) * V;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD>
|
|||
|
|
float calibrateT = (float) dcBuff.configSensor.sensorPTempr[0].calibrateT / 10;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD><C2B6>µ<EFBFBD><C2B5>ܵ<EFBFBD><DCB5><EFBFBD>
|
|||
|
|
float calibrateR = (float) dcBuff.configSensor.sensorPTempr[0].calibrateR / 10;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD><C2B6>µ<EFBFBD>PT100<30><30><EFBFBD><EFBFBD>
|
|||
|
|
float calibrateR100 = PT100_Tempr2Resit(calibrateT);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3>¶<EFBFBD><C2B6>µ<EFBFBD><C2B5>ߵ<EFBFBD><DFB5><EFBFBD>
|
|||
|
|
float calibrateRLine = (calibrateR <= calibrateR100 ? 0 : calibrateR - calibrateR100);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶ȣ<C2B6>-200<30>棩<EFBFBD>µ<EFBFBD><C2B5>ߵ<EFBFBD><DFB5><EFBFBD>
|
|||
|
|
float RLine = calibrateRLine * (1 - (calibrateT - lowRange) * 0.0013);
|
|||
|
|
float r100 = PT100_Tempr2Resit(lowRange);
|
|||
|
|
float Rx = RLine + r100;
|
|||
|
|
float Vx = (b - (r0 + Rx) / (r0 + Rx + R) * V) * a + Vb;
|
|||
|
|
dcBuff.configSensor.sensorPTempr[0].zeroValue = Vx / 3 * 4096;
|
|||
|
|
|
|||
|
|
// printf("\ncalibrateT: %.1f, calibrateR: %.2f, calibrateR100: %.2f, calibrateRLine: %.2f\n", calibrateT, calibrateR, calibrateR100, calibrateRLine);
|
|||
|
|
|
|||
|
|
// printf("\nLow-RLine: %.2f, r100: %.2f, RX: %.2f, Vx: %.3f\n", RLine, r100, Rx, Vx);
|
|||
|
|
// printf("\ndcBuff.configSensor.sensorPTempr[0].zeroValue = %d\n", dcBuff.configSensor.sensorPTempr[0].zeroValue);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶ȣ<C2B6>80<38>棩<EFBFBD>µ<EFBFBD><C2B5>ߵ<EFBFBD><DFB5><EFBFBD>
|
|||
|
|
RLine = calibrateRLine * (1 - (calibrateT - highRange) * 0.0013);
|
|||
|
|
r100 = PT100_Tempr2Resit(highRange);
|
|||
|
|
Rx = RLine + r100;
|
|||
|
|
Vx = (b - (r0 + Rx) / (r0 + Rx + R) * V) * a + Vb;
|
|||
|
|
dcBuff.configSensor.sensorPTempr[0].fullValue = Vx / 3 * 4096;
|
|||
|
|
|
|||
|
|
// printf("\nHigh-RLine: %.2f, r100: %.2f, RX: %.2f, Vx: %.3f\n", RLine, r100, Rx, Vx);
|
|||
|
|
// printf("\ndcBuff.configSensor.sensorPTempr[0].fullValue = %d\n", dcBuff.configSensor.sensorPTempr[0].fullValue);
|
|||
|
|
}
|