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

📄 dac811.c

📁 基于dsp的da输出程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************************************
	filename:	dac811.c
	版权(c) 	2003-		北京合众达电子技术有限责任公司			                *
*  	设计者:	戴展波	
*************************************************************************************/

#include "string.h"
#include "math.h"
#include "DAC811.h"

/* 使用DAC811 */
#if 1						/* 1:编译 0:不编译 */
#define DAC811_ENABLE	
#endif

/* 使用DAC7724的0通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_0_ENABLE
#endif

/* 使用DAC7724的1通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_1_ENABLE
#endif

/* 使用DAC7724的2通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_2_ENABLE
#endif

/* 使用DAC7724的3通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_3_ENABLE
#endif

/* 使用DAC7724的4通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_4_ENABLE
#endif

/* 使用DAC7724的5通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_5_ENABLE
#endif

/* 使用DAC7724的6通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_6_ENABLE
#endif

/* 使用DAC7724的7通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_7_ENABLE
#endif

/* 使用DAC7724的8通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_8_ENABLE
#endif

/* 使用DAC7724的9通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_9_ENABLE
#endif

/* 使用DAC7724的10通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_10_ENABLE
#endif

/* 使用DAC7724的11通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_11_ENABLE
#endif

/* 使用DAC7724的12通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_12_ENABLE
#endif

/* 使用DAC7724的13通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_13_ENABLE
#endif

/* 使用DAC7724的14通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_14_ENABLE
#endif

/* 使用DAC7724的15通道 */
#if 1						/* 1:编译 0:不编译 */
#define DAC7724_15_ENABLE
#endif

#ifndef _register
#define _register

ioport unsigned port0014;			/*  */
#define da811cs	port0014

ioport unsigned port0000;
#define da7724cs0	port0000

ioport unsigned port0001;
#define da7724cs1	port0001

ioport unsigned port0002;
#define da7724cs2	port0002

ioport unsigned port0003;
#define da7724cs3	port0003

ioport unsigned port0004;
#define da7724cs4	port0004

ioport unsigned port0005;
#define da7724cs5	port0005

ioport unsigned port0006;
#define da7724cs6	port0006

ioport unsigned port0007;
#define da7724cs7	port0007

ioport unsigned port0008;
#define da7724cs8	port0008

ioport unsigned port0009;
#define da7724cs9	port0009

ioport unsigned port000A;
#define da7724cs10	port000A

ioport unsigned port000B;
#define da7724cs11	port000B

ioport unsigned port000C;
#define da7724cs12	port000C

ioport unsigned port000D;
#define da7724cs13	port000D

ioport unsigned port000E;
#define da7724cs14	port000E

ioport unsigned port000F;
#define da7724cs15	port000F
	
ioport unsigned port0010;
#define ldac	port0010

#define DA_RUN	asm(" PORTW 1H,10H ")		/* DA信号输出 */
#define EINT	asm(" RSBX INTM ")		/*开中断*/
#define DINT	asm(" SSBX INTM ")		/*关中断*/

#endif

#ifndef _da_var
#define _da_var

#define DA_NOISE_VALUE 400
#define DA_TIMER_NUM	40000			/* 1s/25us*/
#define DA_SETVALUE	10000			/* 10000mv */

//int i;
int da_rand;
int da_temp_value;
int da_zhiliu_value[17];
int da_noise_flag[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int da_tongdao;
int da_kind[17];
int data_time[17];
int timer_sum[17];
int fangbo_flag[17];
int tongdao_flag[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};


float angle;					/* 角度 */
float angle_diff;				/* 角差 */
float da_value;					/* 幅值 */
float da_value_low[17];
float da_value_high[17];
#ifdef DAC811_ENABLE
int xishu0[1000];				/* DAC811系数表 */
#endif
#ifdef DAC7724_0_ENABLE
int xishu1[1000];				/* DAC7724的0通道系数表 */
#endif
#ifdef DAC7724_1_ENABLE
int xishu2[1000];				/* DAC7724的1通道系数表 */
#endif
#ifdef DAC7724_2_ENABLE
int xishu3[1000];				/* DAC7724的2通道系数表 */
#endif
#ifdef DAC7724_3_ENABLE
int xishu4[1000];				/* DAC7724的3通道系数表 */
#endif
#ifdef DAC7724_4_ENABLE
int xishu5[1000];				/* DAC7724的4通道系数表 */
#endif
#ifdef DAC7724_5_ENABLE
int xishu6[1000];				/* DAC7724的5通道系数表 */
#endif
#ifdef DAC7724_6_ENABLE
int xishu7[1000];				/* DAC7724的6通道系数表 */
#endif
#ifdef DAC7724_7_ENABLE
int xishu8[1000];				/* DAC7724的7通道系数表 */
#endif
#ifdef DAC7724_8_ENABLE
int xishu9[1000];				/* DAC7724的8通道系数表 */
#endif
#ifdef DAC7724_9_ENABLE
int xishu10[1000];				/* DAC7724的9通道系数表 */
#endif
#ifdef DAC7724_10_ENABLE
int xishu11[1000];				/* DAC7724的10通道系数表 */
#endif
#ifdef DAC7724_11_ENABLE
int xishu12[1000];				/* DAC7724的11通道系数表 */
#endif
#ifdef DAC7724_12_ENABLE
int xishu13[1000];				/* DAC7724的12通道系数表 */
#endif
#ifdef DAC7724_13_ENABLE
int xishu14[1000];				/* DAC7724的13通道系数表 */
#endif
#ifdef DAC7724_14_ENABLE
int xishu15[1000];				/* DAC7724的14通道系数表 */
#endif
#ifdef DAC7724_15_ENABLE
int xishu16[1000];				/* DAC7724的15通道系数表 */
#endif

#endif

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

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

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

extern void da_setup(int tongdao,int kind,int freq,int value,unsigned short noise)
{
	float temp;
	int i;
//	da_tongdao = tongdao;
	/* 判断DA信号种类 */
	switch(kind)
	{
	    case 0:			/*正弦*/
	    	if((tongdao >= 0) && (tongdao < 17))	/* 通道范围 */
	    	{
	    		if((freq >= 40) && (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)
		    		    {
#ifdef DAC811_ENABLE		    			
		    			case 0:
		    			    xishu0[i] = da_value * sin(angle) + 2048;
		    			    if(noise == 1)	/* 噪音 */	
	    				    {
	    					da_rand = rand();	/* 随机值 */
	    					da_rand = da_rand % 3;
	    					if(da_rand == 1)	/* 1:正向噪音 2:负向噪音 0:无*/
	    					{
	    					    xishu0[i] = xishu0[i] + DA_NOISE_VALUE;
	    					    if(xishu0[i] > 4095)
	    					    {
	    						xishu0[i] = 4095;
	    					    }
	    					}
	    					else if(da_rand == 2)		
	    					{
	    					    xishu0[i] = xishu0[i] - DA_NOISE_VALUE;
	    					    if(xishu0[i] < 0)
	    					    {
	    						xishu0[i] = 0;
	    					    }
	    					}
	    				    }	    				    
		    			    break;
#endif		    			    
#ifdef DAC7724_0_ENABLE			    		
		    		    	case 1:
					    xishu1[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif					    
#ifdef DAC7724_1_ENABLE						    
					case 2:
					    xishu2[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif					    
#ifdef DAC7724_2_ENABLE						    
					case 3:		
					    xishu3[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif			
#ifdef DAC7724_3_ENABLE					    
					case 4:
					    xishu4[i] = da_value * sin(angle) + 2048;				    
					    break;
#endif					    
#ifdef DAC7724_4_ENABLE
					case 5:
					    xishu5[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif					    
#ifdef DAC7724_5_ENABLE						   
					case 6:
					    xishu6[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif					    
#ifdef DAC7724_6_ENABLE					    
					case 7:
					    xishu7[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif
#ifdef DAC7724_7_ENABLE					    		    
					case 8:
					    xishu8[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif					    
#ifdef DAC7724_8_ENABLE	    
					case 9:						
					    xishu9[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif					    
#ifdef DAC7724_9_ENABLE						    
					case 10:					
					    xishu10[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif
#ifdef DAC7724_10_ENABLE					    
					case 11:						
					    xishu11[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif
#ifdef DAC7724_11_ENABLE					    
					case 12:						
					    xishu12[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif
#ifdef DAC7724_12_ENABLE					    
					case 13:					
					    xishu13[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif
#ifdef DAC7724_13_ENABLE					    
					case 14:
					    xishu14[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif					    
#ifdef DAC7724_14_ENABLE					    
					case 15:
					    xishu15[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif	
#ifdef DAC7724_15_ENABLE				    
					case 16:						
					    xishu16[i] = da_value * sin(angle) + 2048;					    
					    break;
#endif		    		    	
		    		    	default:
		    		    	    break;
		    		    }
		    		}
		    		data_time[tongdao] = 0;
	    		}
		}
	    	break;
	    	
	    case 1:						/*方波*/
	    	if((tongdao >= 0) && (tongdao <= 16))		/* 通道范围 */
	    	{
	    		if((freq >= 40) && (freq <= DA_TIMER_NUM))	/* 频率范围 */
	    		{
		    		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)
		    		    {
#ifdef DAC811_ENABLE		    			
		    			case 0:		    			
		    			    if(i < (timer_sum[0] / 2))
		    			    {
		    			    	xishu0[i] = da_value + 2048;
		    			    }
		    			    else
		    			    {
		    			    	xishu0[i] = 2048 - da_value;
		    			    }
		    			    
		    			    if(noise == 1)		
	    				    {
	    					da_rand = rand();
	    					da_rand = da_rand % 3;
	    					if(da_rand == 1)		
	    					{
	    					    xishu0[i] = xishu0[i] + DA_NOISE_VALUE;
	    					    if(xishu0[i] > 4095)
	    					    {
	    						xishu0[i] = 4095;
	    					    }
	    					}
	    					else if(da_rand == 2)		
	    					{
	    					    xishu0[i] = xishu0[i] - DA_NOISE_VALUE;
	    					    if(xishu0[i] < 0)
	    					    {
	    						xishu0[i] = 0;
	    					    }
	    					}
	    				    }	    				    
					    break;
#endif					    
#ifdef DAC7724_0_ENABLE					
					case 1:
					    if(i < (timer_sum[1] / 2))
		    			    {
		    			    	xishu1[i] = da_value + 2048;
		    			    }
		    			    else
		    			    {

⌨️ 快捷键说明

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