ZNY_Pakistan/Anjiehui7_ZNY/User/adc_calculate.h

115 lines
3.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*********************************************************************************************************
* 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
#include "type.h"
// 本模块大部分代码为车载瓶和罐箱液位计项目移植过来的
// 定义常量π
#define PI (3.1415926)
#define CAP_K_C1 150 // 电容K值校验C1pF
#define CAP_K_C2 500 // 电容K值校验C2pF
// 介质介电常数
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);
// 差压转换为液位高度
float Diff2Level(float dp); // 单位KPa、mm
// 高度转换为体积
u32 Level2Vol(float h); // 单位mm、L
// 体积转换为质量
u32 Vol2Quantity(float v); // 单位L、kg
// 质量转换为体积
u32 Quantity2Vol(float quantity); // 单位kg、L
float adc_k_convert(s16 adc, s16 c1ADC, s16 c2ADC, s16 c1, s16 c2);
float Cap_Calculate(float 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