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

📄 dec2812_da.c

📁 用于DSP的数字信号到模拟信号的转换的原程序
💻 C
字号:
#include "string.h"
#include "math.h"
#include "DSP28_Device.h"
#include "DEC2812_DA.h"

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

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

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

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

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

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


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

void da_end(int tongdao)
{
	tongdao_flag[tongdao] = 0;
#if DAC7724_0_ENABLE
	if(tongdao == 1)
	{
		*DA_PORT0 = 2048;
	}
#endif
#if DAC7724_1_ENABLE
	if(tongdao == 2)
	{
		*DA_PORT1 = 2048;
	}
#endif
#if DAC7724_2_ENABLE
	if(tongdao == 3)
	{
		*DA_PORT2 = 2048;
	}
#endif	
#if DAC7724_3_ENABLE
	if(tongdao == 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 + -