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

📄 sampling.c

📁 ADuC812的 AD驱动及滤波程序
💻 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 + -