📄 dsk2812_da.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 + -