📄 currentmodule.c
字号:
//*******************************************************************************
//Copyright (c) 2007,派利斯电子(北京)有限公司 硬件部
//文件名称: CurrentModule.c
//摘 要: 本文件主要包含PT2060程序中电流计算、输出和标定等操作
//当前版本: D-1
//作 者: 佟文杰
//完成日期: 4/19/2007
//*******************************************************************************
#define CURRENTMODULE_C
#include "currentmodule.h"
xdata struct Current CurrentModule;
//-------------------------------------------------------------------------
//函数名称:void SetDAZero(unsigned char uchChannel, unsigned int uiDAZero)
//功 能:由通道的选择设置DA 4mA对应的参数
//输入参数:通道号 ,DA 4mA对应的值
//返 回:无
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SetDAZero(unsigned char uchChannel, unsigned int uiDAZero)
{
CurrentModule.uiDAZero[uchChannel - 1] = uiDAZero;
}
//-------------------------------------------------------------------------
//函数名称:void SetDAFull(unsigned char uchChannel, unsigned int uiDAFull)
//功 能:由通道的选择设置DA 20mA对应的参数
//输入参数:通道号,DA 20mA对应的值
//返 回:无
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SetDAFull(unsigned char uchChannel, unsigned int uiDAFull)
{
CurrentModule.uiDAFull[uchChannel - 1] = uiDAFull;
}
//----------------------------------------------------------------------------------------------------------
//函数名称:void OutputCurrentValue(unsigned char uchChannel, int iCurrentValue)
//功 能:根据电流值输出对应的电流值
//输入参数:通道号,给定的电流值×100
//返 回:无
//完成日期:4/16/2007
//----------------------------------------------------------------------------------------------------------
void OutputCurrentValue(unsigned char uchChannel, int iCurrentValue)
{
long xdata fTempVariable;
if (iCurrentValue >= 2300)
{
iCurrentValue = 2300;
}
fTempVariable = (long)(iCurrentValue - 400);
fTempVariable = fTempVariable * (CurrentModule.uiDAFull[uchChannel - 1] - CurrentModule.uiDAZero[uchChannel - 1]);
fTempVariable = fTempVariable / 1600; //16 * 100
fTempVariable = fTempVariable + CurrentModule.uiDAZero[uchChannel - 1];
if (fTempVariable < 0)
{
fTempVariable = 0;
}
if (fTempVariable > 4095)
{
fTempVariable = 4095;
}
DirectCurrentOutput(uchChannel, (unsigned int)fTempVariable);
}
//------------------以下为电流标定的部分-----------------------------------------
//------------------------------------------------------------------------------
//函数名称:void SetCalibCurrentZero(unsigned char uchChannel, unsigned int uiCalibCurrentZero)
//功 能:由通道的选择得到上位机传下来的电流值的零点
//输入参数:通道号,DA标定零点的电流值 乘以了100后传过来的
//返 回:无
//完成日期:4/16/2007
//------------------------------------------------------------------------------
void SetCalibCurrentZero(unsigned char uchChannel, unsigned int uiCalibCurrentZero)
{
CurrentModule.uiCalibCurrentZero[uchChannel - 1] = uiCalibCurrentZero;
}
//--------------------------------------------------------------------------------------
//函数名称:void SetCalibCurrentFull(unsigned char uchChannel, unsigned int uiCalibCurrentFull)
//功 能:由通道的选择得到上位机传下来的电流值的满度
//输入参数:通道号,DA标定满度的电流值 乘以了100后传过来的
//返 回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------
void SetCalibCurrentFull(unsigned char uchChannel, unsigned int uiCalibCurrentFull)
{
CurrentModule.uiCalibCurrentFull[uchChannel - 1] = uiCalibCurrentFull;
}
//--------------------------------------------------------------------------------------------------
//函数名称:void CalculateCalibrateZeroValue(unsigned char uchChannel, unsigned char uchCountFlag)
//功 能:计算每个通道标定的零点AD值和满量程AD值
//输入参数:通道号,计算标志 0:表示计算零点 1:表示计算满度 0xff:表示计算全体
//返 回:无
//完成日期:4/16/2007
//--------------------------------------------------------------------------------------------------
void CalculateCalibrateValue(unsigned char uchChannel, unsigned char uchCountFlag)
{
unsigned long xdata ulTempVariable;
if (uchCountFlag == 0)
{
ulTempVariable = CurrentModule.uiCalibCurrentFull[uchChannel - 1] - CurrentModule.uiCalibCurrentZero[uchChannel - 1];
ulTempVariable = 327000 / ulTempVariable; //(3700 - 430)*100
ulTempVariable = ulTempVariable * (400 - CurrentModule.uiCalibCurrentZero[uchChannel - 1]);
ulTempVariable = ulTempVariable / 100;
CurrentModule.uiDAZero[uchChannel - 1] = ulTempVariable + 430; //400mA对应的AD值
SetDAZeroCountResultMain(uchChannel, CurrentModule.uiDAZero[uchChannel - 1]); //存储电流DA值
DirectCurrentOutput(uchChannel, CurrentModule.uiDAZero[uchChannel - 1]); //显示电流值
}
else if (uchCountFlag == 1)
{
ulTempVariable = 5232000 / (CurrentModule.uiCalibCurrentFull[uchChannel - 1] - CurrentModule.uiCalibCurrentZero[uchChannel - 1]); //((3700 - 430) * 16 * 100)
CurrentModule.uiDAFull[uchChannel - 1] = ulTempVariable + CurrentModule.uiDAZero[uchChannel - 1];
SetDAFullCountResultMain(uchChannel, CurrentModule.uiDAFull[uchChannel - 1]);
DirectCurrentOutput(uchChannel, CurrentModule.uiDAFull[uchChannel - 1]);
}
else if (uchCountFlag == 0xff)
{
ulTempVariable = CurrentModule.uiCalibCurrentFull[uchChannel - 1] - CurrentModule.uiCalibCurrentZero[uchChannel - 1];
ulTempVariable = 327000 / ulTempVariable; //(3700 - 430)*100
ulTempVariable = ulTempVariable * (400 - CurrentModule.uiCalibCurrentZero[uchChannel - 1]);
ulTempVariable = ulTempVariable / 100;
CurrentModule.uiDAZero[uchChannel - 1] = ulTempVariable + 430;
ulTempVariable = 5232000 / (CurrentModule.uiCalibCurrentFull[uchChannel - 1] - CurrentModule.uiCalibCurrentZero[uchChannel - 1]); //((3700 - 430) * 16 * 100)
CurrentModule.uiDAFull[uchChannel - 1] = ulTempVariable + CurrentModule.uiDAZero[uchChannel - 1];
SetDAZeroCountResultMain(uchChannel, CurrentModule.uiDAZero[uchChannel - 1]);
SetDAFullCountResultMain(uchChannel, CurrentModule.uiDAFull[uchChannel - 1]);
}
else
{
return;
}
FeedDog();
}
//--------------------------------------------------------------------------------------------------
//函数名称:void InitCalibrationPara(unsigned char uchChannel)
//功 能:初始化标定的电流值 放在初始化程序中
//输入参数:通道号
//返 回:无
//完成日期:4/16/2007
//--------------------------------------------------------------------------------------------------
void InitCalibrationPara(unsigned char uchChannel)
{
/* unsigned long xdata ulTempData;
if (CurrentModule.uiDAZero[uchChannel - 1] > 430)
{
ulTempData = 1600 * ((unsigned long)CurrentModule.uiDAZero[uchChannel - 1] - 430);
ulTempData = ulTempData / (CurrentModule.uiDAFull[uchChannel - 1] - CurrentModule.uiDAZero[uchChannel - 1]);
ulTempData = 400 - ulTempData;
SetCalibCurrentZero(uchChannel, ulTempData); //放置默认的参数
}
else
{
SetCalibCurrentZero(uchChannel, 400); //放置默认的参数
}
// SetCalibCurrentZero(uchChannel, 250); //放置默认的参数
if (CurrentModule.uiDAFull[uchChannel - 1] < 3700)
{
ulTempData = 1600 * (3700 - (unsigned long)CurrentModule.uiDAFull[uchChannel - 1]);
ulTempData = ulTempData / (CurrentModule.uiDAFull[uchChannel - 1] - CurrentModule.uiDAZero[uchChannel - 1]);
ulTempData = ulTempData + 2000;
SetCalibCurrentFull(uchChannel, ulTempData); //放置默认的参数
}
else
{
SetCalibCurrentFull(uchChannel, 2000); //放置默认的参数
}
// SetCalibCurrentFull(uchChannel, 2130); //放置默认的参数 */
float xdata fTempData;
if (CurrentModule.uiDAZero[uchChannel - 1] > 430)
{
fTempData = 1600 * ((unsigned long)CurrentModule.uiDAZero[uchChannel - 1] - 430);
fTempData = fTempData / (CurrentModule.uiDAFull[uchChannel - 1] - CurrentModule.uiDAZero[uchChannel - 1]);
fTempData = 400 - fTempData;
SetCalibCurrentZero(uchChannel, fTempData); //放置默认的参数
}
else
{
SetCalibCurrentZero(uchChannel, 400); //放置默认的参数
}
// SetCalibCurrentZero(uchChannel, 250); //放置默认的参数
if (CurrentModule.uiDAFull[uchChannel - 1] < 3700)
{
fTempData = 1600 * (3700 - (unsigned long)CurrentModule.uiDAFull[uchChannel - 1]);
fTempData = fTempData / (CurrentModule.uiDAFull[uchChannel - 1] - CurrentModule.uiDAZero[uchChannel - 1]);
fTempData = fTempData + 2000;
SetCalibCurrentFull(uchChannel, fTempData); //放置默认的参数
}
else
{
SetCalibCurrentFull(uchChannel, 2000); //放置默认的参数
}
//20080417
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -