📄 dac811.c
字号:
/************************************************************************************
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 + -