麻烦各位帮看看我的DAC代码哪里不对,我的目的是让VoutA输出2.5V的电压。现在的代码只能输出0.7V,不知道问题在哪里。
1.这是DAC的原理图
其中SYNC对应DSP(这里使用的是28335)的GPIO16
SCLK对应GPIO56
SDIN对应GPIO54
这几个口我都设置成I/O口,只需对着三个口进行操作。
2.DAC用的是AD5734,时序图如下
我的想法是只控制上述3个GPIO口来确定输出电压。按照时序图所示,先让SYNC变高,即使GPIO16=1,持续一段时间再变低并保持,之后进行24个SCLK高低变化,每一次下降SDIN就输出0或者1(根据需要的功能,总共输入24个0或1),24个周期以后抬高SYNC。按照这样的方式,需要的电压就能出现在需要的端口上。
3.这是AD5734寄存器功能图
我编写的大致逻辑如下
(1)首先第一次24位SDIN使寄存器进入Power Control Register
因为我想A口输出电压,这里这24个SDIN进入的值应该是0x100001(16进制表示)
(2) 第二次24位SDIN使得寄存器进入 Output Range Register
我想要A口输出0-5V的电压,故输入值应该是0x080000
(3)第三次输入24位SDIN使得寄存器进入DAC Register
AD5734为14位DAC,当选择输出为5V时,输出电压公式为Vout=5*D/(2^14),我需要输出2.5V,则D就是2^13次方。故输入值为0x008000
代码是比较直白的一个一个赋2进制0或1的代码,很长。
#include"DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define SetSync GpioDataRegs.GPADAT.bit.GPIO16=1;//将sync置1
#define ClrSync GpioDataRegs.GPADAT.bit.GPIO16=0;//将sync置0
void InitGpio(void)
{
EALLOW;
GpioCtrlRegs.GPBMUX2.bit.GPIO54=0;//SDIN作为I/O引脚
GpioCtrlRegs.GPBDIR.bit.GPIO54=1;//输出引脚
GpioCtrlRegs.GPBPUD.bit.GPIO54=0;//禁止上拉
GpioCtrlRegs.GPBMUX2.bit.GPIO56=0;//SCLK作为功能引脚
GpioCtrlRegs.GPBDIR.bit.GPIO56=1;//输出引脚
GpioCtrlRegs.GPBPUD.bit.GPIO56=0;//禁止上拉
GpioCtrlRegs.GPAMUX2.bit.GPIO16=0;//SYNC作为I/O引脚
GpioCtrlRegs.GPADIR.bit.GPIO16=1;//输出引脚
GpioCtrlRegs.GPBPUD.bit.GPIO56=0;//禁止上拉
EDIS;
}
void main(void)
{
InitSysCtrl();
DINT;
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
InitPieVectTable();
InitGpio();
InitAdc();
/*power control register*/
SetSync;//sync为高-
DELAY_US(20);
ClrSync;//sync下降
DELAY_US(5);//延迟1us
GpioDataRegs.GPBDAT.bit.GPIO56=1;//SCLK为高
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=1;//SDIN为1,这里是第一个输入信号
GpioDataRegs.GPBDAT.bit.GPIO56=0;//SCLK下降,经过一个下降沿,第一个SDIN被写入
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;//SCLK为高
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//第二个SDIN输入
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//3
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//4
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//5
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//6
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//7
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//8
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//9
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//10
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//11
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//12
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//13
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//14
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//15
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//16
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//17 A0
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//18 A1
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//19 A2
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//20 REG0
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=1;//21 REG1
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//22 REG2
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//23
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO56=1;
DELAY_US(5);
GpioDataRegs.GPBDAT.bit.GPIO54=0;//24
GpioDataRegs.GPBDAT.bit.GPIO56=0;
DELAY_US(5);
SetSync;
DELAY_US(30);
/*后面2个寄存器的代码都是按这个方式写的,就不重复放代码了*/
while(1)
{}
}
希望各位能给我解答一下,被这个东西卡住几天了,代码烂什么的我无所谓,先实现功能吧。