📄 adsample.c
字号:
//--------------------------------------------------------
//函数名称:void SetACADZero(unsigned char uchChannel,unsigned int uiACADZero)
//功 能:设置交流通道零点数据
//输入参数:通道号,交流通道零点数据
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void SetACADZero(unsigned char uchChannel,unsigned int uiACADZero)
{
AD.uiACADZero[uchChannel - 1] = uiACADZero;
}
//--------------------------------------------------------
//函数名称:void SetACADFull(unsigned char uchChannel,unsigned int uiACADFull)
//功 能:设置交流通道满度
//输入参数:通道号,交流通道满度数据
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void SetACADFull(unsigned char uchChannel,unsigned int uiACADFull)
{
AD.uiACADSpan[uchChannel - 1] = uiACADFull;
}
//--------------------------------------------------------
//函数名称:void SetDCADZero(unsigned char uchChannel,unsigned int uiDCADZero)
//功 能:设置直流通道零点数据
//输入参数:通道号,直流通道零点数据
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void SetDCADZero(unsigned char uchChannel,unsigned int uiDCADZero)
{
AD.uiDCADZero[uchChannel - 1] = uiDCADZero;
}
//--------------------------------------------------------
//函数名称:void SetDCADFull(unsigned char uchChannel,unsigned int uiDCADFull)
//功 能:设置直流通道满度数据
//输入参数:通道号,直流通道满度数据
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void SetDCADFull(unsigned char uchChannel,unsigned int uiDCADFull)
{
AD.uiDCADSpan[uchChannel - 1] = uiDCADFull;
}
//--------------------------------------------------------
//函数名称:void SetLittleRangeADZero(unsigned char uchChannel,unsigned int uiLittleRangeADZero)
//功 能:设置小量程通道零点数据
//输入参数:通道号,小量程通道零点数据
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void SetLittleRangeADZero(unsigned char uchChannel,unsigned int uiLittleRangeADZero)
{
AD.uiLittleRangeADZero[uchChannel - 1] = uiLittleRangeADZero;
}
//--------------------------------------------------------
//函数名称:void SetLittleRangeADFull(unsigned char uchChannel,unsigned int uiLittleRangeADFull)
//功 能:设置小量程通道满度数据
//输入参数:通道号,小量程通道满度数据
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void SetLittleRangeADFull(unsigned char uchChannel,unsigned int uiLittleRangeADFull)
{
AD.uiLittleRangeADSpan[uchChannel - 1] = uiLittleRangeADFull;
}
//--------------------------------------------------------
//函数名称:void SetGAPADZero(unsigned char uchChannel,unsigned int uiGAPADZero)
//功 能:设置间隙电压的零点AD值
//输入参数:通道号,GAP零点对应的AD值
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void SetGAPADZero(unsigned char uchChannel,unsigned int uiGAPADZero)
{
AD.uiGAPADZero[uchChannel - 1] = uiGAPADZero;
}
//--------------------------------------------------------
//函数名称:void SetGAPADFull(unsigned char uchChannel,unsigned int uiGAPADFull)
//功 能:设置间隙电压满度对应的AD值
//输入参数:通道号,间隙电压满度对应的AD值
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void SetGAPADFull(unsigned char uchChannel,unsigned int uiGAPADFull)
{
AD.uiGAPADFull[uchChannel - 1] = uiGAPADFull;
}
//--------------------------------------------------------
//函数名称:void SetSampleLocationStatus(unsigned char uchSampleLocationFlag)
//功 能:从硬件模块将采样位置的标志设置到采样计算模块
//输入参数:采样位置标志
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void SetSampleLocationStatus(unsigned char uchSampleLocationFlag)
{
uchSampleLocationNumber = uchSampleLocationFlag;
}
/*
有效值计算方法:
1) 初始化平均值;
2) 取1024个采样数据为一组进行有效值计算,以平均值为基准线,寻找过基准线的前一个和后一个采集点(两个采集点反相);
3) 以第二个过基准线的后一个采集点开始计算过基准线的个数,并且记录这个采样点的位置及采样点的个数,直至最后一个过基准线的两个采集点中的前一个采集点,如果过基准线的个数为奇数,则需要向前去掉一个过基准线的采样点,得到过基准线的个数为偶数个,除以2则得到采样点的周期个数(及采样点的整周期);
4) 计算上面的整周期内采样点数据的平均值,此平均值即为基准线数值;
5) 在整周期内由下面的公式计算有效值
有效值 = SQRT{ SUM[(采集点-平均值)^2]/(整周期内的采集点数量)}
*/
//--------------------------------------------------------
//函数名称:void CaculateRMSValue(unsigned char uchChannel,unsigned int xdata *SrcData,unsigned int uiSampleLocation,unsigned int uiGroupLength)
//功 能:计算两个通道的有效值
//输入参数:通道号,缓存起始地址,当前采样位置,数组长度
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void CaculateRMSValue(unsigned char uchChannel,unsigned int xdata *SrcData,unsigned int uiSampleLocation,unsigned int uiGroupLength)
{
unsigned long xdata ulDataSum;
int xdata iDataSum;
long idata lDataCorrect;
// float xdata fDataAverageSum;
unsigned int xdata i,j;
unsigned int xdata uiTempData;
bit bCountFlag;
bit bCountFlagBAK;
unsigned int idata uiDataOffsetAddress;
unsigned int idata uiAverageValue;
unsigned long idata ulDataADSum; //20080708
float idata fTempValue;
bit bCycleFlag;
float idata fADDataSum;
// float mmmm , nnnn;
// unsigned char idata mmm;
iDataSum = 0;
lDataCorrect = 0;
bCountFlag = 1;
bCountFlagBAK = 1;
AD.uiRMSCountNumber = 0;
ulDataSum = 0;
ulDataADSum = 0;
// uiSampleLocation = uiSampleLocation + 0x100;
FeedDog();
if (uiSampleLocation >= 0x400)
{
uiSampleLocation = uiSampleLocation - 0x400;
}
else
{
uiSampleLocation = uiSampleLocation + 0x400;
}
uiAverageValue = AD.uiDataAverage[uchChannel - 1];
iDataSum = SrcData[uiSampleLocation] - uiAverageValue;
if (iDataSum > 10)
{
bCountFlag = 1;
bCountFlagBAK = 1;
}
else
{
bCountFlag = 0;
bCountFlagBAK = 0;
}
j = uiGroupLength*4;
for (i=0; i<j; i++)
{
iDataSum = SrcData[(uiSampleLocation + i)&0x7ff] - uiAverageValue; //20080324
if (iDataSum > 10)
{
bCountFlag = 1;
}
else if (iDataSum < -10) //20080707
{
bCountFlag = 0;
}
if (bCountFlagBAK != bCountFlag)
{
AD.uiRMSCountNumber++;
bCountFlagBAK = bCountFlag;
if (AD.uiRMSCountNumber <= 1) //2
{
AD.uiRMSampleCountSomeCycleBAK = i;
}
else if ((AD.uiRMSCountNumber & 0x01) == 1) //0
{
AD.uiRMSampleCountSomeCycle = i;
}
}
}
if (AD.uiRMSCountNumber <= 2) //3
{
AD.uiRMSampleCountSomeCycleBAK = 0;
AD.uiRMSampleCountSomeCycle = 1023;
}
if(AD.uiRMSampleCountSomeCycle > AD.uiRMSampleCountSomeCycleBAK)
{
uiTempData = AD.uiRMSampleCountSomeCycle - AD.uiRMSampleCountSomeCycleBAK + 1;
}
else
{
uiTempData = 1024;
}
uiDataOffsetAddress = uiSampleLocation + AD.uiRMSampleCountSomeCycleBAK; //20080708
FeedDog();
ulDataSum = 0;
for (j=0; j<uiTempData; j++)
{
ulDataSum = ulDataSum + SrcData[(uiDataOffsetAddress + j) & 0x7FF];
}
AD.uiDataAverage[uchChannel - 1] = ulDataSum/uiTempData;
if (uchChannel == 1)
{
/* AD.uiDataAverageBAK[0][AD.uchCountNumber1] = AD.uiDataAverage[0];
AD.uchCountNumber1++;
if (AD.uchCountNumber1 >= 15)
{
AD.uchCountNumber1 = 0;
} */
uiRmsCounter[0][uchValue1] = AD.uiRMSCountNumber;
uchValue1 = (uchValue1 + 1) & 0x03;
}
else
{
/* AD.uiDataAverageBAK[1][AD.uchCountNumber2] = AD.uiDataAverage[1];
AD.uchCountNumber2++;
if (AD.uchCountNumber2 >= 15)
{
AD.uchCountNumber2 = 0;
} */
uiRmsCounter[1][uchValue2] = AD.uiRMSCountNumber;
uchValue2 = (uchValue2 + 1) & 0x03;
}
if((uiRmsCounter[uchChannel - 1][0] > 2) && (uiRmsCounter[uchChannel - 1][1] > 2) && (uiRmsCounter[uchChannel - 1][2] > 2) && (uiRmsCounter[uchChannel - 1][3] > 2))
{
bCycleFlag = 1; //有整周期
}
else
{
bCycleFlag = 0; //没有整周期
}
/* if (bCycleFlag == 1)
{
for (j=0; j<15; j++)
{
AD.uiDataAverage[uchChannel - 1] += AD.uiDataAverageBAK[uchChannel - 1][j];
}
AD.uiDataAverage[uchChannel - 1] = AD.uiDataAverage[uchChannel - 1]>>4;
} */
uiAverageValue = AD.uiDataAverage[uchChannel - 1];
//----------------------以下程序可能需要打开-----------------------------------------
/* for (j=0; j<uiTempData; j++)
{
lDataCorrect = (long)SrcData[(uiDataOffsetAddress + j) & 0x7FF] - AD.uiDataAverage[uchChannel - 1];
fDataAverageSum = fDataAverageSum + lDataCorrect * lDataCorrect;
FeedDog();
}
fDataAverageSum = fDataAverageSum / uiTempData;
AD.fDataRMSAverage[uchChannel - 1] = sqrt(fDataAverageSum); */
//------------------------------------------------------------------------------------------
// nnnn = 0;
FeedDog();
for (j=0; j<uiTempData; j++)
{
lDataCorrect = (long)SrcData[(uiDataOffsetAddress + j) & 0x7FF] - uiAverageValue;
ulDataADSum = ulDataADSum + lDataCorrect * lDataCorrect;
/* FeedDog();
mmmm = (float)SrcData[(uiDataOffsetAddress + j) & 0x7FF] - 2074.18;// uiAverageValue;
nnnn = nnnn + mmmm * mmmm; */
}
FeedDog();
ulDataADSum = ulDataADSum / uiTempData;
fTempValue = sqrt(ulDataADSum);
if (uchChannel == 1)
{
AD.fDataRMSADAverage[0][uchRMSDataStorageNumber1] = fTempValue; //20080708
uchRMSDataStorageNumber1 = (uchRMSDataStorageNumber1+1) & 0x07; //20080708
}
else
{
AD.fDataRMSADAverage[1][uchRMSDataStorageNumber2] = fTempValue; //20080708
uchRMSDataStorageNumber2 = (uchRMSDataStorageNumber2+1) & 0x07; //20080708
}
if (bCycleFlag == 0)
{
fADDataSum = 0;
for (j=0; j<8; j++)
{
fADDataSum += AD.fDataRMSADAverage[uchChannel - 1][j];
}
fTempValue = fADDataSum / 8;
}
AD.fDataRMSAverage[uchChannel - 1] = fTempValue;
}
/*
峰峰值计算的方法:
1) 采样程序中峰峰值计算函数的算法:
2)取15组存储器存储数据最高值,取15组存储器存储数据最低值;
3)采集数据256组,新采集值与最高、最低的15组比较,判定是否在其中;
4)如果在其中,该采集值与组号将存储,并挤掉不是最高最低值的那一组值,并排序;
5)如果不在其中,舍弃;
6)采集完毕后,取最高15组数的最低值,取最低15组数的最高值,得到最近的峰峰值;
7)以最近峰峰值的3/4与上次峰峰值的1/4作为最终的峰峰值输出;
8)初始化1)的内容,重复2)-6)步骤的过程。
*/
//*************************************************/
//* CH0 PKPK Value */
//*************************************************/
void CalculatePKPKValue0(unsigned int xdata *SrcData,unsigned int uiSampleLocation,unsigned int uiCurGroupIndex,unsigned int uiPassedGroupIndex,unsigned int uiGroupNum)
{
char i;
unsigned char j,k;
unsigned int s,m;
idata unsigned int xdata *PTR;
m = SrcData + uiSampleLocation + AD.uiGroupLength;
for(PTR = SrcData + uiSampleLocation; PTR<m; PTR++)
{
FeedDog();
s = *PTR;
if(s>=AD.uiMaxValue0[29]) //29
{
if(AD.uchCurMaxCount< 5) //15
{
AD.uchCurMaxCount++;
k=29; //29
}
else
{
k=0;
for(i=29;i>=0;i--) //29
{
if((AD.uiMaxGroup0[i]==uiCurGroupIndex)&&(s>AD.uiMaxValue0[i]))
{
k=i;
break;
}
}
}
if(k!=0)
{
AD.uiMaxValue0[k] = s;
AD.uiMaxGroup0[k] = uiCurGroupIndex;
for(i=k-1;i>=0;i--)
{
if(s>=AD.uiMaxValue0[i])
{
AD.uiMaxValue0[i+1] = AD.uiMaxValue0[i];
AD.uiMaxGroup0[i+1] = AD.uiMaxGroup0[i];
AD.uiMaxValue0[i] = s;
AD.uiMaxGroup0[i] = uiCurGroupIndex;
}
else
{
break;
}
}
}
}
//-------------------------------minimum value------------------------------
if(s<=AD.uiMinValue0[29]) //29
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -