/* ********************************************************************************************************* * 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