This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DAC7724多路模拟量输出问题

Other Parts Discussed in Thread: DAC7724

通过单片机pic24hj256gp610a输出数字量给TI的DAC7724,在DAC7724的多路工作模式下,DAC7724输出的模拟量结果为各路电压之和,而单独给一路的时候那一路就能输出正确的电压值,这是什么原因呢?还有DAC7724的片选信号CS可以一直接地给低电平吗?麻烦大神们帮帮忙,我已经弄了好多天了。。。

  • “在DAC7724的多路工作模式下,DAC7724输出的模拟量结果为各路电压之和” 有没有更具体点的说明,比方你如何配4ch的DAC 寄存器,最后输出的电压之和是在哪一路输出上?

    CS信号一直给低问题不大,只要你配置完成后保证外面的MCU不会给DAC新的配置时序。

  • 这是我的程序,我看不出哪里有问题,ABCD四路输出,例如A给2V,B给3V,那么AB两路的输出都为5V,即两路之和,其他路也一样

    #include "p24hj256gp610a.h"

    #define reset PORTGbits.RG1
    #define ldac PORTGbits.RG0
    #define a0 PORTAbits.RA7
    #define a1 PORTAbits.RA6             //cs=rw=GND
    #define uchar unsigned char
    #define uint unsigned int


    void Delay(int count)
    {
     char i,j;
     for(i=0;i<count;i++)
      for(j=0;j<10;j++);
    }

    void Delay_asm(void)
    {
     asm("nop");
     asm("nop");
     asm("nop");
    }

    void PortInit(void)
    {  
        AD1PCFGH=0xffff;
        AD1PCFGL=0xffff;
        TRISE=0x0000;        //RE0-RE7是输出
        TRISG=0x0000;        //RG12-RG15是输出     RG0,RG1是输出
        TRISA=0x0000;        //RA6,RA7是输出
        PORTA=0x0000;
        PORTE=0x0000;
        PORTG=0x0000;
        asm("nop");
    }

    void Init_7724Reg(void)
    {
     reset=1;
     asm("nop");
     reset=0;          
     asm("nop");
     reset=1;    
     Delay_asm();//Ts>=10us完成复位操作
        Delay_asm();
        ldac=1;
        asm("nop");
    }

    int Dac( int ru)     //上位机输入的数
    {
     double a,b;
     int c;
     a=ru;
     a=a/100;         //上位机的数过来时做了*100的处理
     b=((a+10)*4096)/20;
     c=b;
     if(c>0x0fff)    //当上位机输入10V时,对应数字量输入为0x1000,输入到12位DAC7724会发生溢出,这里做了强制的处理
     {
      c=0x0fff;
     }
     return c;        //进入DAC7724的数字量
    }

    void WriteDac(uint data) //addr是通道值 data是输入DAC7724的数字量值 
                                        //这里的通道值是上位机给的,要哪个通道输出就给相应的通道的值
    {
       
          PORTE=PORTE|(data&0x00ff);
          PORTG=PORTG|((data<<4)&0xf000);  
        
    }


    int main(void)
    {
        uint D_Buffer1,D_Buffer2,D_Buffer3,D_Buffer4;                 //模拟量转化成的12位数字量

        PortInit();
        Init_7724Reg();
     while(1)
       { 
            ldac=1;
            asm("nop");  
            a0=1;
            a1=1; 
            asm("nop");
         D_Buffer1=Dac(350);      
         WriteDac(D_Buffer1);       //0x1101表示输入通道1 ,0x0fff表示输入+10V*/
           

            a0=0;
            a1=1;
            asm("nop");       
           D_Buffer2=Dac(500);      
         WriteDac(D_Buffer2);       //0x1102表示输入通道2 ,0x0fff表示输入+10V
           
            a0=1;      
            a1=0;
            asm("nop"); 
         D_Buffer3=Dac(800);     
         WriteDac(D_Buffer3);       //0x1103表示输入通道3 ,0x0fff表示输入+10V
           
            a0=0;     
            a1=0;
            asm("nop");
          D_Buffer4=Dac(200);      
         WriteDac(D_Buffer4);       //0x1104表示输入通道4 ,0x0fff表示输入+10V 
      

            ldac=0;                      //将数字量存入DAC7724寄存器,各通道输出相应电压
            asm("nop");  
           
          
       }
    }

  • 是不是把LDAC的逻辑搞反了?写数据的时候ldac=0,输出时ldac=1,试试看能否改善。

  • 按您说的试了之后还是不对,我的程序里面开始让ldac=1是为了让各通道数据锁存在DAC寄存器中,而最后使ldac=0则是使各通道输出相应电压,这个应该没问题吧

    我的程序里面时序有问题吗?实验的结果还是之前的问题

  • 发一下你的电路图。

  • 电路图没发现什么问题,怀疑还是软件的问题。根据手册15页,

    1. 每次写操作后,需要有一个tLD,这个延时至少10ns。不过在你的程序里似乎没有发现这个延时。

    2. tLWD至少50ns,从手册看,每个写操作只能写一个通道。但是从你的程序看,是一次性写完4个通道再LDAC,这和手册不符,这可能是你的程序里最大的问题。

    3. CS在写操作后有一个拉低的动作,你的程序里似乎没有这个。

    建议时序严格遵照手册图4,每次写一个通道,再试试看。

  • 所用单片机一个指令周期就是0.27us,完全可以满足延时需要

    按您所说每写完一个通道就输出,结果还是不正确,而且我查资料,上面说可以通过控制A0、A1、RW、CS和LDAC来使LDAC为高电平,再依次修改A、B、C、D四通道数据;然后再使LDAC为低电平,从而完成四通道同时输出。

    CS拉低依然没有效果,而且只是一个片选,应该没有关系吧

  • 高手你再帮我看看吧,我已经要被逼疯了,小女子感激不尽啊

  • 女前辈,小弟也有遇到这个问题,能分享一下代码,借鉴一下吗