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

📄 timex.c

📁 利用TI54系列DSP的测试仪器的触发运算通信以及时基功能实现的程序
💻 C
字号:
#include <limits.h>
//********************temporary define********************
static const float arrTVal[]=
{
1.00e-3,
2.50e-3,
5.00e-3,//ns
10.00e-3,
25.00e-3,
50.00e-3,
100.00e-3,
250.00e-3,
500.00e-3,
1.00,	//us
2.50,
5.00,
10.00,
25.00,
50.00,
100.00,
250.00,
500.00,
1.00e3,	//ms
2.50e3,
5.00e3,
10.00e3,
25.00e3,
50.00e3,
100.00e3,
250.00e3,
500.00e3,
1.00e6,	//s
2.50e6,
5.00e6,
10.00e6,
25.00e6,
50.00e6,
100.00e6,
250.00e6
};

char stoplevel;

void std_real(fElement* fe)
{
     if (fe->fdata!=0 && fe->funit<0x1c)
     {
        while (fabs(fe->fdata)>=1000.0)
        {
                fe->fdata=fe->fdata/1000.0;
                fe->funit++;
        }
        if (fe->funit!=6)
        {
                while (fabs(fe->fdata)<1.0)
                {
                        fe->fdata=fe->fdata*1000.0;
                        fe->funit--;
                        if (fe->funit==0) break;
                }
        }
     }
     //else fe->funit=4;
}

void std_Tmpos(char which)
{	
	if (T_range[which].Vallevel>225) 
	//此处的值225指预触发深度的最大值,是FIFO深度的90%.
		T_range[which].Vallevel=225;
	else if (T_range[which].Vallevel<INT_MIN+16) 
		T_range[which].Vallevel=INT_MIN+16;
	
	//此处限制了随机方式下波形左移的最小值
	if (basetime<LEV250NS && T_range[which].Vallevel<25)
		T_range[which].Vallevel=25;
	//此处限制了随机方式下波形左移的最小值
	if (basetime>LEV50MS && T_range[which].Vallevel<0)
		T_range[which].Vallevel=0;
		
	T_range[which].fVal=125-T_range[which].Vallevel;
	T_range[which].fVal=T_range[which].fVal*X_range[which].fVal/25.0;
	
	if (which) 
		W_center=W_pos.fVal*25.0/M_range.fVal+M_pos.Vallevel;
}

static void std_TmStep()
{
int fx;
	fx=125-T_range[0].fVal*25/X_range[0].fVal;
	if (fx>225) 
		fx=225;
	else if (fx<INT_MIN+16) 
		fx=INT_MIN+16;
	if (basetime<LEV250NS && fx<25) 
		fx=25;
	T_range[0].Vallevel=fx;
}

int Get_Tmpos(char which)
{
    //if (T_range[which].Vallevel>225) return 225;
	return T_range[which].Vallevel;
}

void Get_TmfVal(fElement *fe, char which)
{
	fe->fdata=-X_range[which].fVal*4;
	if (basetime<LEV250NS && T_range[which].fVal>X_range[which].fVal*5) 
		fe->fdata=X_range[which].fVal*5;
	else if (T_range[which].fVal > (fe->fdata))  
		fe->fdata=T_range[which].fVal;
	fe->funit=T_range[which].Valunit;
	std_real(fe);
}

void Get_TmfVal2(fElement * ftemp, char which)
{
	(*ftemp).fdata=X_range[which].fVal;
	(*ftemp).funit=X_range[which].Valunit;
	std_real(ftemp);
}


//////////////////////////////////////////////////////////time setting

void std_TmEx()
{
int iwidth;
	//W_center+=gap;
	iwidth=W_width/2;
	if (W_center+iwidth>250)
	{
		M_pos.Vallevel=M_pos.Vallevel-(W_center+iwidth-250);
		W_center=250-iwidth;
	}
	else if (W_center-iwidth<0)
	{
        M_pos.Vallevel=M_pos.Vallevel+(iwidth-W_center);
        W_center=iwidth;
	}
	
	iwidth=W_width*2/5;
	if (M_pos.Vallevel-W_center>iwidth)
	{
        M_pos.Vallevel=W_center+iwidth;
	}
	
	W_pos.fVal=(W_center-M_pos.Vallevel)*M_range.fVal;
	W_pos.Vallevel=125.0-W_pos.fVal/W_range.fVal;
	W_pos.fVal=W_pos.fVal/25.0;
	
	std_Tmpos(0);
}

void expandW(char initWin)
{
int imin;
    imin=M_range.Vallevel-3;
    if ((iProcFlag<=PROC_READY) && imin<stoplevel-3) imin=stoplevel-3;
    imin=imin>LEV250NS ? imin : LEV250NS;
    if (W_range.Vallevel>=M_range.Vallevel)
    {
            if (initWin) W_range.Vallevel=imin;
            else W_range.Vallevel=M_range.Vallevel-1;
    }
    if (W_range.Vallevel<imin) W_range.Vallevel=imin;

   
	//W_range.fVal=arrTVal[W_range.Vallevel];
	switch (stoplevel-W_range.Vallevel)
	{
		case  1:	W_range.fVal=arrTVal[stoplevel]/2;
					break;
		case  2:	//禁止200NS档的出现
					if (stoplevel!=LEV1US)
						W_range.fVal=arrTVal[stoplevel]/5;
					else
						W_range.fVal=arrTVal[stoplevel]/4;
					break;
		case  3:	W_range.fVal=arrTVal[stoplevel]/10;
	}
	
	
	W_width=250.0/M_range.fVal*W_range.fVal;

    if (initWin==0) std_TmEx();
	Samples();
}

//////////////////////////////////////////////////////////////////////释抑时间

Delayer DTimer={{50, 0x0ffff}, 0};

void ModiTimer(int gap)
{
unsigned int i;
     i=hor_1/2;
     //if (X_range[i].Vallevel>17) gap*=20;
     //else if (X_range[i].Vallevel>14) gap*=10;
     //else if (X_range[i].Vallevel>11) gap*=5;
     //else if (X_range[i].Vallevel>8)  gap*=2;
     
     if (DTimer.useWhich==0 && X_range[i].Vallevel>LEV100US)
     {
     	DTimer.useWhich=1;
        DTimer.uiVal[1]=25;
        DTimer.uiVal[0]=0x0ffff;
     }
     else if (DTimer.useWhich==1 && X_range[i].Vallevel<=LEV100US)
     {
     	DTimer.useWhich=0;
		DTimer.uiVal[0]=50000;
		DTimer.uiVal[1]=0x0ffff;
     }
     if (DTimer.useWhich)
     {
     	i=(unsigned int)X_range[i].fVal/(5*20);
     	
     }
     else
     {	
     	i=(unsigned int)X_range[i].fVal/(5*10.00e-3);
     }
     gap*=i;
     DTimer.uiVal[DTimer.useWhich]+=gap;
     if (DTimer.useWhich==0)
     {
             if (DTimer.uiVal[0]>50000)
             {
                 DTimer.useWhich=1;
                 DTimer.uiVal[1]=25;
                 DTimer.uiVal[0]=0x0ffff;
             }
             else if (DTimer.uiVal[0]<50)
             {
                 DTimer.uiVal[0]=50;
             }
     }
     else
     {
             if (DTimer.uiVal[1]>50000)
             {
                DTimer.uiVal[1]=50000;
             }
             else if (DTimer.uiVal[1]<25)
             {
                DTimer.useWhich=0;
                DTimer.uiVal[0]=50000;
                DTimer.uiVal[1]=0x0ffff;
             }
     }
     DelayTimer();
}

void DelayTimer()
{
int x;     
     if (GetStatus(EDGE_MENU, MENUITEM4)>0)
     	x=0x0000;
     else
     	x=0x0004;
     ECONTROL=x;
     TIMER1_REG=DTimer.uiVal[0];
     TIMER2_REG=DTimer.uiVal[1];
     uiPower=x | 0x0001 | 0x0002;
     ECONTROL=uiPower;
}


void DispTimer()
{
fElement fTimer;
     if (DTimer.useWhich==0)
     	fTimer.fdata=DTimer.uiVal[0]*0.01;	//计数时钟0.01us
     else 
     	fTimer.fdata=DTimer.uiVal[1]*20;		//计数时钟20us
     	
     fTimer.funit=2;
     std_real(&fTimer);
     FtoC(fTimer.fdata, strFloat, 2, 5);
     strcat(strFloat, zqstr[fTimer.funit]);
     FillRect(MENU_Y+14, 264, 12, 60, 1, 1);
     DrawOut(MENU_Y+16, 266, strFloat, 3, 0);

}

/////////////////////////////////////////////////time range adjust


static void t_stop()
{
	if (stoplevel>LEV50MS)
	{//在SCAN档位下STOP或READY状态的波形尺度变换处理
		if (M_range.Vallevel>stoplevel+1) 
			M_range.Vallevel=stoplevel+1;
		else if (M_range.Vallevel<stoplevel-6) 
			M_range.Vallevel=stoplevel-6;
	}
	else if (stoplevel>LEV100NS)
	{//在实时档位下STOP或READY状态的尺度变换
		if (M_range.Vallevel>stoplevel+1) 
			M_range.Vallevel=stoplevel+1;
		else if (M_range.Vallevel<stoplevel-3) 
			M_range.Vallevel=stoplevel-3;
		if (M_range.Vallevel<LEV250NS) 
			M_range.Vallevel=LEV250NS;
		else if (M_range.Vallevel>LEV50MS) 
		//	M_range.Vallevel=LEV50MS;
			SetStatus(EDGE_MENU, MENUITEM4, TRI_AUTO);
	}
	else 
	{//在随机档位下STOP或READY状态的尺度变换
		if (M_range.Vallevel>stoplevel+1) 
			M_range.Vallevel=stoplevel+1;
		else if (M_range.Vallevel<stoplevel-2) 
			M_range.Vallevel=stoplevel-2;
		if (M_range.Vallevel>LEV100NS) M_range.Vallevel=LEV100NS;
	}
}

void t_modi()
{
	
	if (ISRECMODE)
	{
		if (M_range.Vallevel>LEV250S) 
			M_range.Vallevel=LEV250S;
		else if (M_range.Vallevel<LEV100MS)
			M_range.Vallevel=LEV100MS;
	}
	else
	{
		if (M_range.Vallevel>LEV5S) 
			M_range.Vallevel=LEV5S;
		else if (M_range.Vallevel<LEV1NS) 
		{
			if (ISMENU(CALI_MENU))
				M_range.Vallevel=LEV1NS;
			else
				M_range.Vallevel=LEV1NS;
		}
	}
	if (!ISRECMODE && iProcFlag==PROC_STOP)
	{
		if (ISFFT)
		{//在FFT模式的停止状态不能扩展频率档位
			M_range.Vallevel=stoplevel;
			return;
		}
		
		else
		{
			t_stop();
		}
		
	}
	else 
		stoplevel=M_range.Vallevel;
	
	M_range.fVal=arrTVal[M_range.Vallevel];
	
	std_TmStep(); 
	if (ISPEAKLEV)
	{
		if (GetStatus(SETUP_MENU, MENUITEM3) || ISSCANLEV)
			PEAK_SEL=1;
	}
	else
		PEAK_SEL=0;
	
	base_t();

	InitProcess(SA_RESET);
	
	if (basetime<LEV25NS) 
	{//5ns/div和10ns/div时基上仅采用点显示方式
		SetStatus(DISP_MENU, MENUITEM1, 0);
	}
	else 
		SetStatus(DISP_MENU, MENUITEM1, GetStatus(MATH_MENU, MENUITEM5));
    
    //插值
    if (basetime<LEV10NS)
    {
    	SetStatus(ACQ_MENU, MENUITEM5, 1);
    }
   
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -