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拉低依然没有效果,而且只是一个片选,应该没有关系吧
高手你再帮我看看吧,我已经要被逼疯了,小女子感激不尽啊
女前辈,小弟也有遇到这个问题,能分享一下代码,借鉴一下吗