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

📄 da.c

📁 DSP2407系统板上的DA转换器件代码
💻 C
字号:
#include "string.h"
#include "math.h"
#include "DSK2407_DA.h"
#include "SEED-DSK2407.h"
#include "DA.h"



void main()
{
	timer_count = 0;
	*IFR = 0x3f;
	DINT;  
	SystemInit();  
	TimerInit(); 
	da_setup(0,0,50,2499);
	da_setup(1,1,50,2499);
	da_setup(2,2,50,2499);
	da_setup(3,3,50,2499);        
	
	  
	
	*IMR = 0x02;;
	EINT;

	for(;;)
	{
	    
	}
}

void SystemInit(void)
{	
	WSGR = 0x1c0;
	*WDCR = 0x6f;
	*SCSR1 = 0x0204;
}

void TimerInit(void)
{
	*GPTCONA = 0;
	*T1CNT = 0;
	*T1CON = 0x0840;
	/* 25us */
	*T1PR = 1000;
	*EVAIMRA = 0x0780;
	*EVAIFRA = 0x0080;   
}

interrupt void PHANTOM(void)
{

} 

interrupt void c_int2(void)
{
    timer_count++;
#ifdef DAC7625_0_ENABLE	
	if(channel_flag[0] == 1)
	{
	    DA_PORT0 = coefficient1[data_time[0]];
	    data_time[0]++;
	    if(data_time[0] == timer_sum[0])
	    {
	    	data_time[0] = 0;
	    }
	}
#endif
#ifdef DAC7625_1_ENABLE	
	if(channel_flag[1] == 1)
	{
	    DA_PORT1 = coefficient2[data_time[1]];
	    data_time[1]++;
	    if(data_time[1] == timer_sum[1])
	    {
	    	data_time[1] = 0;
	    }
	}
#endif
#ifdef DAC7625_2_ENABLE		
	if(channel_flag[2] == 1)
	{
	    DA_PORT2 = coefficient3[data_time[2]];
	    data_time[2]++;
	    if(data_time[2] == timer_sum[2])
	    {
	    	data_time[2] = 0;
	    }	
	}
#endif
#ifdef DAC7625_3_ENABLE		
	if(channel_flag[3] == 1)
	{
	    DA_PORT3 = coefficient4[data_time[3]];
	    data_time[3]++;
	    if(data_time[3] >= timer_sum[3])
	    {
	    	data_time[3] = 0;
	    }
	}
#endif	
/*	da_run();  */
	*EVAIFRA = 0x0080;
	EINT;
} 

/****************************************************************************

*	函数:	void da_setup(int channel,int kind,int freq,int value)	
*	目的:	设置DA转换
*	输入:	
		channel		通道
		kind		da转换波形方式:	0:正弦波
*							1: 方波
*							2:三角波
*							3:直流
		freq		波形频率
		value		幅值
*	输出:	无
*	参数:	dac7625cs:	dac7625使能
		loadcs:		dac7625转换使能
		timer_sum:	定时器计数次数	long
		angle:		角度
		angle_diff:	角度差
		da_kind:	da种类
		da_value:	da幅值

***************************************************************************/

void da_setup(int channel,int kind,int freq,int value)
{
	float temp;
	int i;
	switch(kind)
	{
	    case 0:			/*正弦*/
	    	if(channel >= 0)
	    	{
	    	    if(channel < 4)	/* 通道范围 */
	    	    {
	    		if(freq >= 40) 
	    		{
//	    		    if(freq < DA_TIMER_NUM)	/*频率范围*/
	    		    {
		    		channel_flag[channel] = 1;		/* 通道设置标志 */
		    		timer_sum[channel] = DA_TIMER_NUM / freq;	/* 一个周波的DA输出点数 */
		    		angle_diff = 6.2831852 / timer_sum[channel];	/* 每个点与上一点的角度差 */
		    		angle = 0;					/* 初始化角度为0 */
		    		da_kind[channel] = kind;			/* 记录该通道的DA种类 */
		    		da_value = value;				/* 幅值 范围02500 */
		    		da_value = da_value / DA_SETVALUE * 2048;	/* 将幅值转化成系统可识别的数值 */
		    		/* 做系数表,每个值代表一个周波内DA输出的点 */
		    		for(i = 0; i < timer_sum[channel]; i++)
		    		{
		    		    angle = angle + angle_diff;
		    		    switch(channel)
		    		    {
#if DAC7625_0_ENABLE			    		
		    		    	case 0:
					    		coefficient1[i] = da_value * sin(angle)+2048;					    
					    	break;
#endif					    
#if DAC7625_1_ENABLE						    
							case 1:
					   		 	coefficient2[i] = da_value * sin(angle);					    
					   		break;
#endif					    
#if DAC7625_2_ENABLE						    
							case 2:		
					    		coefficient3[i] = da_value * sin(angle);					    
					    	break;
#endif			
#if DAC7625_3_ENABLE					    
							case 3:
					    		coefficient4[i] = da_value * sin(angle);				    
					    	break;
#endif	
		    		    	default:
		    		    	break;
		    		    }
		    		}
		    		data_time[channel] = 0;
		    	    }
	    		}
	    	    }
		}
	    	break;
	    	
	    case 1:						/*方波*/
	    	if(channel >= 0) 
	    	{
	    	    if(channel <= 3)		/* 通道范围 */
	    	    {
	    		if(freq >= 40) 
	    		{
//	    		    if(freq < 40000)	/* 频率范围 */
	    		    {
		    		channel_flag[channel] = 1;		/* 通道标志 */
		    		timer_sum[channel] = DA_TIMER_NUM / freq ;	/* 每个周波的DA点数 */
		    		da_kind[channel] = kind;		/* DA信号种类 */
		    		da_value = value;			/* 幅值 */
		    		da_value = da_value / DA_SETVALUE * 4096;
		    		for(i = 0; i < timer_sum[channel]; i++)
		    		{
		    		    switch(channel)
		    		    {
#if DAC7625_0_ENABLE					
					case 0:
					    if(i < (timer_sum[channel] / 2))
		    			    {
		    			    	coefficient1[i] = da_value;
		    			    }
		    			    else
		    			    {
		    			    	coefficient1[i] = 0;
		    			    }	    			    
					    break;
#endif	
#if DAC7625_1_ENABLE					    
					case 1:				
					    if(i < (timer_sum[channel] / 2))
		    			    {
		    			    	coefficient2[i] = da_value;
		    			    }
		    			    else
		    			    {
		    			    	coefficient2[i] = 0;
		    			    }		    			    
					    break;
#endif
#if DAC7625_2_ENABLE						    			    
					case 2:	
					    if(i < (timer_sum[channel] / 2))
		    			    {
		    			    	coefficient3[i] = da_value;
		    			    }
		    			    else
		    			    {
		    			    	coefficient3[i] = 0;
		    			    }		    			    
					    break;
#endif
#if DAC7625_3_ENABLE					    
					case 3:					
					    if(i < (timer_sum[channel] / 2))
		    			    {
		    			    	coefficient4[i] = da_value;
		    			    }
		    			    else
		    			    {
		    			    	coefficient4[i] = 0;
		    			    }		    			    
					    break;
#endif	    		    	
					default:
					    break;
				    }
				}
		    		data_time[channel] = 0;
		    	    }
		    	}
		    }
	    	}
	    	break;
	    	
	    case 2:					/*三角波*/
	    	if((channel >= 0) && (channel <= 3))
	    	{
		    	if(freq >= 40) 	//&& (freq <= DA_TIMER_NUM))
		    	{
		    		channel_flag[channel] = 1;
		    		timer_sum[channel] = DA_TIMER_NUM / freq;	/*25us*/
		    		da_value = value;
		    		da_value = da_value / DA_SETVALUE * 2048;
		    		da_value_high[channel] = 4096 ;
		    		da_value_low[channel] = 0;
		    		angle_diff = 4 * da_value /timer_sum[channel];
		    		temp = 0;
		    		
		    		for(i = 0; i < timer_sum[channel] / 4; i++)
		    		{
		    		    temp = temp + angle_diff;
		    		    switch(channel)
		    		    {
#if DAC7625_0_ENABLE						    
							case 0:				
					    		coefficient1[i] = temp+2048;					    
					    	break;
#endif
#if DAC7625_1_ENABLE				    
							case 1:					
					    		coefficient2[i] = temp+2048;					    
					    	break;
#endif	
#if DAC7625_2_ENABLE					    
							case 2:					
					    		coefficient3[i] = temp+2048;					    
					    	break;
#endif
#if DAC7625_3_ENABLE					    
							case 3:					
					    		coefficient4[i] = temp+2048;					    
					    	break;
#endif
							default:
					    	break;
				    }					
		    		}
		    		temp = 0;
		    		for(i = timer_sum[channel] / 4; i < timer_sum[channel] / 2; i++)
		    		{
		    		    temp = temp + angle_diff;
		    		    switch(channel)
		    		    {
#if DAC7625_0_ENABLE					    
					case 0:						
					    coefficient1[i] = da_value_high[channel] - temp;					    
					    break;
#endif	
#if DAC7625_1_ENABLE				    
					case 1:				
					    coefficient2[i] = da_value_high[channel] - temp;					    
					    break;
#endif
#if DAC7625_2_ENABLE					    
					case 2:
					    coefficient3[i] = da_value_high[channel] - temp;
					    break;
#endif
#if DAC7625_3_ENABLE						    
					case 3:
					    coefficient4[i] = da_value_high[channel] - temp;
					    break;
#endif
					default:
					    break;
				    }
		    		}
		    		temp = 0;
			    	for(i = timer_sum[channel] / 2; i < timer_sum[channel] * 3 / 4; i++)
			    	{
			    	    temp = temp + angle_diff;
			    	    switch(channel)
		    		    {
#if DAC7625_0_ENABLE				    
					case 0:
					    coefficient1[i] = 2048 - temp;
					    break;
#endif
#if DAC7625_1_ENABLE					    
					case 1:
					    coefficient2[i] = 2048 - temp;
					    break;
#endif
#if DAC7625_2_ENABLE				    
					case 2:
					    coefficient3[i] = 2048 - temp;
					    break;
#endif
#if DAC7625_3_ENABLE					    
					case 3:
					    coefficient4[i] = 2048 - temp;
					    break;
#endif
					default:
					    break;
				    }
			    	}
			    	temp = 0;
			    	for(i = timer_sum[channel] * 3 / 4; i < timer_sum[channel] ; i++)
			    	{
			    	    temp = temp + angle_diff;
			    	    switch(channel)
		    		    {
#if DAC7625_0_ENABLE	    
					case 0:
					    coefficient1[i] = da_value_low[channel] + temp;
					    break;
#endif
#if DAC7625_1_ENABLE
					case 1:
					    coefficient2[i] = da_value_low[channel] + temp;
					    break;
#endif		
#if DAC7625_2_ENABLE		    
					case 2:
					    coefficient3[i] = da_value_low[channel] + temp;
					    break;
#endif		
#if DAC7625_3_ENABLE			    
					case 3:
					    coefficient4[i] = da_value_low[channel] + temp;
					    break;
#endif	
					default:
					    break;
				    }
			    	}
			    	da_kind[channel] = kind;
			    	data_time[channel] = 0;
			}
		}
	    	break;
	    	
	    case 3:			/*直流*/
	    	channel_flag[channel] = 1;
	    	timer_sum[channel] = 1;
	    	da_value = value;
	    	da_value = da_value / DA_SETVALUE * 4096;
	    	da_kind[channel] = kind;
	    	da_zhiliu_value[channel] = da_value;
	    	switch(channel)
		{
#if DAC7625_0_ENABLE		    	
		    case 0:
		    	coefficient1[0] = da_value;		/*转换数据发送*/
		    	break;
#endif	
#if DAC7625_1_ENABLE			    	
		    case 1:
		    	coefficient2[0] = da_value;		/*转换数据发送*/
		    	break;
#endif	
#if DAC7625_2_ENABLE			    	
		    case 2:
		    	coefficient3[0] = da_value;		/*转换数据发送*/
		    	break;
#endif	
#if DAC7625_3_ENABLE			    	
		    case 3:
		    	coefficient4[0] = da_value;		/*转换数据发送*/
		    	break;
#endif	
		    default:
		    	break;
		}
		
	    	break;
	    	   
	    default:
	    	break;
	}	    			    		    	
}

/****************************************************************************

*	函数:	void da_end(int channel)
*	目的:	关闭设定的DA通道转换
*	输入:	tondao		通道
*	输出:	无
*	参数:	无


***************************************************************************/

void da_end(int channel)
{
	channel_flag[channel] = 0;
#if DAC7625_0_ENABLE
	if(channel == 1)
	{
		DA_PORT0 = 2048;
	}
#endif
#if DAC7625_1_ENABLE
	if(channel == 2)
	{
		DA_PORT1 = 2048;
	}
#endif
#if DAC7625_2_ENABLE
	if(channel == 3)
	{
		DA_PORT2 = 2048;
	}
#endif	
#if DAC7625_3_ENABLE
	if(channel == 4)
	{
		DA_PORT3 = 2048;
	}
#endif
}

/****************************************************************************

*	函数:	void da_run(void)
*	目的:	设置DA转换
*	输入:	无
*	输出:	无
*	参数:	无
***************************************************************************/

/*extern void da_run(void)
{
	DA_OUT = 0;
}

*/

⌨️ 快捷键说明

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