123 lines
3.2 KiB
C
123 lines
3.2 KiB
C
/*
|
||
*********************************************************************************************************
|
||
* IAR Development Kits
|
||
* on the
|
||
*
|
||
* Nano130
|
||
*
|
||
* Filename : adc_calculate.h
|
||
* Version : V1.00
|
||
* Programmer(s) : Qian Xianghong
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
#ifndef USER_ADC_CALCULATE_PRESENT
|
||
#define USER_ADC_CALCULATE_PRESENT
|
||
|
||
// 本模块大部分代码为车载瓶和罐箱液位计项目移植过来的
|
||
typedef uint8_t u8;
|
||
typedef char s8;
|
||
typedef uint16_t u16;
|
||
typedef int16_t s16;
|
||
typedef uint32_t u32;
|
||
typedef int32_t s32;
|
||
|
||
// 定义常量π
|
||
#define PI (3.1415926)
|
||
|
||
#define CAP_K_C1 245 // 电容K值校验C1(pF)
|
||
#define CAP_K_C2 1045 // 电容K值校验C2(pF)
|
||
|
||
// 介质介电常数
|
||
extern const float e_Src[];
|
||
|
||
typedef struct // size = 10 if --float=32
|
||
{
|
||
float k; // 真空电容常数,根据传感器尺寸综合计算得到
|
||
s16 nl_len; // 非线性段总长度(mm),结合传感器长度计算有效测量长度(对应增长电容部分)
|
||
s16 base_d; // 底座厚度(mm),计算传感器底座下缘和罐子之间的缝隙高度
|
||
s16 base_len; // 底部非线性段长度(mm),传感器底座下缘和内管之间的高度
|
||
} Sensor_Model;
|
||
|
||
// 传感器规格参数
|
||
extern const Sensor_Model Adc_Sensor_Tables[1];
|
||
|
||
// 储罐理论参数
|
||
typedef struct
|
||
{
|
||
// 储罐总容积(L)
|
||
u32 v;
|
||
u32 ve; // 有效容积(可充装容积)
|
||
u16 v0; // 留底容量
|
||
u16 zero_height; // 留底高度
|
||
|
||
s16 nl_len; // 底部不可测高度
|
||
|
||
// dp=h*density*g => h=dp/g/density
|
||
// 其中dp为差压, h为液位高度, density为密度, g为9.8
|
||
// 为简少浮点运算,先算出差压->高度的转换系数
|
||
|
||
// dp以KPa为单位, 高度以mm为单位, density以kg/L为单位
|
||
// LSrc_k = 1/g/density*1000=1000/g/density
|
||
// h = dp * LSrc_k
|
||
// 假设液源为LNG, LSrc_k = 1000/9.8/0.42 = 242.9543
|
||
float LSrc_k;
|
||
} Bottle_Data;
|
||
|
||
extern Bottle_Data Theoretical_Param;
|
||
|
||
// 计算理论参数: 直径,长度,类型(立罐或卧罐)
|
||
u8 Calculate_Theoretical_Params();
|
||
|
||
// 根据液位高度与直径之比,计算剩余液量(有扣除)
|
||
// v0: 留底液量
|
||
u32 Calculate_Volume(u16 d, float h, u32 v, u16 v0);
|
||
u32 Calculate_Volume_Stand(u16 d, u16 L, float h, u16 v0);
|
||
|
||
// 判断采集数据范围是否合法
|
||
// 输入:采集值、校零值、校满值
|
||
// 返回:传感器状态字节
|
||
u8 ADC_Validate(u32 adc, u32 zero, u32 full);
|
||
|
||
// 计算采集数据
|
||
// 输入:adc,校准值,量程
|
||
// 输出:经计算得到的值
|
||
float ADC_Calculate(u32 adc, u32 zero, u32 full, s32 low, s32 high);
|
||
|
||
// 冒泡排序,用于数量较少的排序法
|
||
void sort(u32 numbs[], s8 cnt);
|
||
|
||
// KPa转换成mmH2O
|
||
float KPa2mmH2O(float KPa);
|
||
// KPa转换成MPa
|
||
float KPa2MPa(float KPa);
|
||
// KPa转换成PSI
|
||
float KPa2PSI(float KPa);
|
||
|
||
// 差压转换为液位高度
|
||
float Diff2Level(float dp); // 单位KPa、mm
|
||
|
||
// 高度转换为体积
|
||
u32 Level2Vol(float h); // 单位mm、L
|
||
|
||
// 体积转换为质量
|
||
u32 Vol2Quantity(float v); // 单位L、kg
|
||
|
||
// 质量转换为体积
|
||
u32 Quantity2Vol(float quantity); // 单位kg、L
|
||
|
||
s16 adc_k_convert(s16 adc, s16 c1ADC, s16 c2ADC, s16 c1, s16 c2);
|
||
float Cap_Calculate(s16 cap, s16 base, s16 ref);
|
||
|
||
int16_t PT100_CalTempr(s32 adc1, s32 adc2, s16 cTx10, s16 cRx10);
|
||
// 计算实测电阻
|
||
float PT100_CalResit(s32 adc1, s32 adc2);
|
||
|
||
// 根据标定值计算最小、最大量程的测量值
|
||
void PT100_Calculate_Theoretical_Params(int16_t lowRange, int16_t highRange);
|
||
|
||
extern const float PT100_Resis[281];
|
||
|
||
#endif
|
||
|