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

求帮助!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条回答 默认 最新

  • 乐观的study123 2022-06-24 16:33
    关注

    D就是2^13次方。故输入值为0x002000而不是0x008000

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月24日
  • 创建了问题 6月24日

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler