📄 sampling.c
字号:
/*
****************************************************************************************************
**
** 研发中心
**-------------------------------------------------------------------------------------------------
** 文 件 名: Sampling.c
** 创 建 人:
** 描 述: 包含一些头文件
**
**-------------------------------------------------------------------------------------------------
** 版 本: V1.0
** 日 期:
** 修 改 人:
** 日 期:
** 描 述:
****************************************************************************************************
*/
#include "Include.h"
INT8U OldSwitchWay ; //切换ADC的通道变量
INT8U TeTime ; //温度采样计书数器
/*
****************************************************************************************************
** 函数名称: Measure
** 功能描述: 采样函数
**
** 输 入: 采样通道号
** 输 出: 采样值
**
** 调用模块: 无
** 创 建 人: 陈晓富
** 日 期: 2006年6月
****************************************************************************************************
*/
void ADC_Init (void)
{
ADCCON1=0x54; //ADC工作在正常模式下,工作时钟为1/2主频,请求应答时间为1/2工作时钟。
ADCCON2=0x0; //置AI通道为0
}
/*
****************************************************************************************************
** 函数名称: Measure
** 功能描述: 采样函数
**
** 输 入: 采样通道号
** 输 出: 采样值
**
** 调用模块: 无
** 创 建 人: 陈晓富
** 日 期: 2006年6月
****************************************************************************************************
*/
INT16S Measure(INT8U SwitchWay)
{
ADCCON2 = SwitchWay ; //置当前测量通道
if (SwitchWay == 8) Dly(10); //片内温度通道,延时增长5ms
if (OldSwitchWay != SwitchWay) Dly(10) ; //测量通道进行了切换,进行延时
SCONV = 1; //启动片内ADC进行测量
while (SCONV == 1) ; //等待测量结束
OldSwitchWay = SwitchWay; //记录当前测量通道
return (int)(((int)(ADCDATAH & 0x0f) << 8) + ADCDATAL); //返回ADC测量值,ADC数据寄存器高4位是
//--当前测量通道号
}
/*
****************************************************************************************************
** 函数名称: Measure
** 功能描述: 采样函数
**
** 输 入: 采样通道号
** 输 出: 采样值
**
** 调用模块: 无
** 创 建 人:
** 日 期: 2006年6月
****************************************************************************************************
*/
void Filter(INT8U currentLimit)
{
INT16SI CurrentValue;
INT8UI MeasureChannel,MeasureTime,i ;
for (MeasureChannel = 0; MeasureChannel < currentLimit; MeasureChannel++)
for (MeasureTime = 0; MeasureTime < 3; MeasureTime++)
SAMP_BUFF[MeasureChannel][MeasureTime] = Measure(MeasureChannel) ;
for (MeasureChannel = 0; MeasureChannel < currentLimit; MeasureChannel++) {
for(i=0;i<2;i++) { //冒泡排序法排列采集到的数据
for(MeasureTime = 0; MeasureTime < currentLimit; MeasureTime++) {
if(SAMP_BUFF[MeasureChannel][MeasureTime] > SAMP_BUFF[MeasureChannel][MeasureTime + 1]) {
CurrentValue = SAMP_BUFF[MeasureChannel][MeasureTime];
SAMP_BUFF[MeasureChannel][MeasureTime] = SAMP_BUFF[MeasureChannel][MeasureTime + 1];
SAMP_BUFF[MeasureChannel][MeasureTime+1] = CurrentValue;
}
}
}
}
}
/*
****************************************************************************************************
** 函数名称: SampCount
** 功能描述: 计算测量值的百分比
**
** 输 入: 无
** 输 出: 无
**
** 调用模块: 无
** 创 建 人:
** 日 期: 2006年6月
****************************************************************************************************
*/
void SampCount (void)
{
int idata CurrentValue ;
Filter(2);
#ifdef CYCLE_ENABLED
if (CycleEnabled == 0) {
Sv = (float)(SAMP_BUFF[1][1]-SvZero) / (float)(SvSpan - SvZero) * 100.0 ;
} //自动采集外部给定
#endif
Mv = (float)(SAMP_BUFF[0][1] - MvZero) / (float)(MvSpan - MvZero) * 100.0 ;
TeTime++ ;
if(TeTime > 20) {
TeTime=0 ;
CurrentValue = Measure(2) ;
Te = (CurrentValue - 819) / 16.38 ;
CurrentValue = Measure(8);
TeChip = (1106 - CurrentValue) / 4.92 ;
}
}
/*
****************************************************************************************************
** 函数名称: CorrectDAC
** 功能描述:
**
** 输 入: Chara
** 输 出: 无
**
** 调用模块: 无
** 创 建 人:
** 日 期: 2006年5月
****************************************************************************************************
*/
void CorrectDAC (void)
{
switch (Chara) {
case 0 : //直线流量特性
MvCr = Mv ;
break ;
case 1 : //等百分比流量特性(对数)
if (Mv <= 3.3) MvCr = 0 ;
else if (Mv <= 9.9) MvCr = (Mv - 3.3) / 0.2 ;
else if (Mv <= 25.32) MvCr = (Mv + 7.08) / 0.54 ;
else if (Mv <= 50.8) MvCr = (Mv + 50) / 1.26 ;
else if (Mv <= 100) MvCr = (Mv + 146) / 2.46 ;
break ;
case 2 : //快开流量特性
if (Sv <= 0) SvCr = 3.3 ;
else if (Sv <= 30) SvCr = 1.64 * Sv + 3.3 ;
else if (Sv <= 60) SvCr = 1.06 * Sv + 20.7 ;
else if (Sv <= 80) SvCr = 0.58 * Sv + 49.7 ;
else if (Sv <= 97.5) SvCr = 0.2 * Sv + 80.5 ;
else if (Sv >= 97.5) SvCr = 100 ;
break ;
case 3 : //抛物线流量特性
if (Mv <= 3.3) MvCr = 0 ;
else if (Mv <= 18) MvCr = (Mv - 3.3) / 0.49 ;
else if (Mv <= 45) MvCr = (Mv + 9) / 0.9 ;
else if (Mv <= 70) MvCr = (Mv + 30) / 1.25 ;
else if (Mv <= 100) MvCr = (Mv + 50) / 1.5 ;
break ;
}
if (MvCr < 0.0) MvCr = 0.0 ; //4mA输出限制
if (MvCr > 100.0) MvCr = 100.0 ; //20mA限制
}
/*
****************************************************************************************************
** 函数名称: CheckError
** 功能描述:
**
** 输 入: 无
** 输 出: 无
**
** 调用模块: 无
** 创 建 人:
** 日 期: 2006年5月
****************************************************************************************************
*/
void CheckError (void)
{
if (Sv <= -20)
SvSever = 1 ; //输入信号断线
else
SvSever = 0 ; //输入信号正常
if (Mv <= -20)
MvSever = 1 ; //阀位信号断线
else
MvSever = 0 ;
//阀位信号正常
if (TeEnabled ==1) {
if (Te <= -20)
TeSever = 1 ; //电机温度信号断线
else {
if (Te >= 90)
TeHigh = 1; //电机机温度超限
else {
if ((TeHigh == 1)&&(Te >= 70)) { //电机温度超限以后必须降到70度才能继续工作
TeHigh = 1 ;
} else {
TeSever = 0 ; //温度正常
TeHigh = 0 ;
}
}
}
} else {
TeSever = 0 ; //温度正常
TeHigh = 0 ;
}
if (TeChip <= -20) //芯片温度超低限
TeChipLow = 1 ;
else {
if (TeChip >= 80) //芯片温度超高限
TeChipHigh = 1 ;
else {
if ((TeChipHigh == 1)&&(TeChip >= 70)) { //芯片温度超高限后必须降到70度以下才能
TeChipHigh = 1 ;
} else { //温度正常
TeChipLow = 0 ;
TeChipHigh = 0 ;
}
}
}
Correct() ; //电流校正
if (Error == 0) {
RELAY = OFF ; //继电器关闭
Trace() ;
} else {
if (AutoFlag == 0)RELAY = OUT ; //继电器输出触电
else RELAY = OFF ;
if ((TeHigh == 1)||(TeChipHigh == 1) //电机温度超高限 或 芯片温度超高限
||(TeSever == 1)||(MvSever == 1)) { //--或芯片温度超低限停止电机
if (AutoFlag == 0) {
MOTOR_Z = STOP ;
MOTOR_F = STOP ;
}
} else {
if ((SvSever == 1)&&(AutoFlag == 0)) //信号断线值安全阀位
SafeValve(); //安全阀位
}
}
}
/*
***************************************************************************************************
** 文 件 结 束
***************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -