⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 currentmodule.c

📁 该程序完成了c8051外围电路的驱动和串口协议的编写。希望能给大家学习51单片机带来帮助
💻 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 + -