微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > DAC7724多路模拟量输出问题

DAC7724多路模拟量输出问题

时间:10-02 整理:3721RD 点击:

通过单片机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拉低依然没有效果,而且只是一个片选,应该没有关系吧

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

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top