我会个锤子的编程
2022-06-24 15:52
采纳率: 0%
浏览 41

求帮助!28335中DAC的代码问题

麻烦各位帮看看我的DAC代码哪里不对,我的目的是让VoutA输出2.5V的电压。现在的代码只能输出0.7V,不知道问题在哪里。
1.这是DAC的原理图

img

其中SYNC对应DSP(这里使用的是28335)的GPIO16
SCLK对应GPIO56
SDIN对应GPIO54
这几个口我都设置成I/O口,只需对着三个口进行操作。
2.DAC用的是AD5734,时序图如下

img

我的想法是只控制上述3个GPIO口来确定输出电压。按照时序图所示,先让SYNC变高,即使GPIO16=1,持续一段时间再变低并保持,之后进行24个SCLK高低变化,每一次下降SDIN就输出0或者1(根据需要的功能,总共输入24个0或1),24个周期以后抬高SYNC。按照这样的方式,需要的电压就能出现在需要的端口上。
3.这是AD5734寄存器功能图

img

我编写的大致逻辑如下
(1)首先第一次24位SDIN使寄存器进入Power Control Register

img


因为我想A口输出电压,这里这24个SDIN进入的值应该是0x100001(16进制表示)

(2) 第二次24位SDIN使得寄存器进入 Output Range Register

img


我想要A口输出0-5V的电压,故输入值应该是0x080000

(3)第三次输入24位SDIN使得寄存器进入DAC Register

img


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)
{}
}

希望各位能给我解答一下,被这个东西卡住几天了,代码烂什么的我无所谓,先实现功能吧。

1条回答 默认 最新

相关推荐 更多相似问题