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

📄 dsk2812_da.c

📁 合众达DSKF2812开发板的测试程序
💻 C
字号:
#include "string.h"
#include "math.h"
#include "DSP28_Device.h"
#include "DSK2812_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 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)
		    		    {
			    		
		    		    	case 0:
					    		coefficient1[i] = da_value * sin(angle)+2048;					    
					    	break;
				    
						    
							case 1:
					   		 	coefficient2[i] = da_value * sin(angle);					    
					   		break;
						    
							case 2:		
					    		coefficient3[i] = da_value * sin(angle);					    
					    	break;
					    
							case 3:
					    		coefficient4[i] = da_value * sin(angle);				    
					    	break;

		    		    	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)
		    		    {
					
					case 0:
					    if(i < (timer_sum[channel] / 2))
		    			    {
		    			    	coefficient1[i] = da_value;
		    			    }
		    			    else
		    			    {
		    			    	coefficient1[i] = 0;
		    			    }	    			    
					    break;
					    
					case 1:				
					    if(i < (timer_sum[channel] / 2))
		    			    {
		    			    	coefficient2[i] = da_value;
		    			    }
		    			    else
		    			    {
		    			    	coefficient2[i] = 0;
		    			    }		    			    
					    break;
						    			    
					case 2:	
					    if(i < (timer_sum[channel] / 2))
		    			    {
		    			    	coefficient3[i] = da_value;
		    			    }
		    			    else
		    			    {
		    			    	coefficient3[i] = 0;
		    			    }		    			    
					    break;
					    
					case 3:					
					    if(i < (timer_sum[channel] / 2))
		    			    {
		    			    	coefficient4[i] = da_value;
		    			    }
		    			    else
		    			    {
		    			    	coefficient4[i] = 0;
		    			    }		    			    
					    break;
	    		    	
					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)
		    		    {
						    
							case 0:				
					    		coefficient1[i] = temp+2048;					    
					    	break;
				    
							case 1:					
					    		coefficient2[i] = temp+2048;					    
					    	break;
					    
							case 2:					
					    		coefficient3[i] = temp+2048;					    
					    	break;
					    
							case 3:					
					    		coefficient4[i] = temp+2048;					    
					    	break;

							default:
					    	break;
				    }					
		    		}
		    		temp = 0;
		    		for(i = timer_sum[channel] / 4; i < timer_sum[channel] / 2; i++)
		    		{
		    		    temp = temp + angle_diff;
		    		    switch(channel)
		    		    {
					    
					case 0:						
					    coefficient1[i] = da_value_high[channel] - temp;					    
					    break;
				    
					case 1:				
					    coefficient2[i] = da_value_high[channel] - temp;					    
					    break;
					    
					case 2:
					    coefficient3[i] = da_value_high[channel] - temp;
					    break;
						    
					case 3:
					    coefficient4[i] = da_value_high[channel] - temp;
					    break;

					default:
					    break;
				    }
		    		}
		    		temp = 0;
			    	for(i = timer_sum[channel] / 2; i < timer_sum[channel] * 3 / 4; i++)
			    	{
			    	    temp = temp + angle_diff;
			    	    switch(channel)
		    		    {
				    
					case 0:
					    coefficient1[i] = 2048 - temp;
					    break;

					    
					case 1:
					    coefficient2[i] = 2048 - temp;
					    break;
				    
					case 2:
					    coefficient3[i] = 2048 - temp;
					    break;
					    
					case 3:
					    coefficient4[i] = 2048 - temp;
					    break;

					default:
					    break;
				    }
			    	}
			    	temp = 0;
			    	for(i = timer_sum[channel] * 3 / 4; i < timer_sum[channel] ; i++)
			    	{
			    	    temp = temp + angle_diff;
			    	    switch(channel)
		    		    {
	    
					case 0:
					    coefficient1[i] = da_value_low[channel] + temp;
					    break;

					case 1:
					    coefficient2[i] = da_value_low[channel] + temp;
					    break;
		    
					case 2:
					    coefficient3[i] = da_value_low[channel] + temp;
					    break;
			    
					case 3:
					    coefficient4[i] = da_value_low[channel] + temp;
					    break;
	
					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)
				{
		    	
		    		case 0:
		    			coefficient1[1] = da_value;		/*转换数据发送*/
		    		break;
			    	
		  			case 1:
		    			coefficient2[1] = da_value;		/*转换数据发送*/
		    		break;
			    	
		   			case 2:
		    			coefficient3[1] = da_value;		/*转换数据发送*/
		    		break;
			    	
		    		case 3:
		    			coefficient4[1] = da_value;		/*转换数据发送*/
		    		break;
	
		    		default:
		    		break;
				}
				
		    data_time[channel] = 0;
	    	break;
	    	   
	    default:
	    	break;
	}	    			    		    	
}

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

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


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

void da_end(int channel)
{
	channel_flag[channel] = 0;

	if(channel == 1)
	{
		*DA_PORT0 = 2048;
	}

	if(channel == 2)
	{
		*DA_PORT1 = 2048;
	}

	if(channel == 3)
	{
		*DA_PORT2 = 2048;
	}

	if(channel == 4)
	{
		*DA_PORT3 = 2048;
	}

}

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

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

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

⌨️ 快捷键说明

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