返回信息流我们现在使用了这个芯片进行DA转换,但是下了程序之后,芯片无法输出电压。。。求助!
这是一条镜像帖。来源:北邮人论坛 / circuit / #17428同步于 2011/6/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
有没有人用过DAC7512的芯片?
Moster
2011/6/4镜像同步16 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
什么程序啊……
【 在 Moster (Moster_nb) 的大作中提到: 】
: 我们现在使用了这个芯片进行DA转换,但是下了程序之后,芯片无法输出电压。。。求助!
【 在 UZ 的大作中提到: 】
: 什么程序啊……
: 【 在 Moster (Moster_nb) 的大作中提到: 】
: : 我们现在使用了这个芯片进行DA转换,但是下了程序之后,芯片无法输出电压。。。求助!
: ...................
我把程序发您站内了···现在的问题是我们无法证明芯片是否工作。。。求指导呀!
贴在这里吧,我没用过52单片机?我从你代码里猜测的。
你是移植的还是哪里来的代码?总不能一上来就用吧。
【 在 Moster (Moster_nb) 的大作中提到: 】
: 我把程序发您站内了···现在的问题是我们无法证明芯片是否工作。。。求指导呀!
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DAC_SYNC=P3^3;
sbit DAC_SCLK=P3^1;
sbit DAC_DIN=P3^0;
Delay_us()
{
//_nop_();_nop_();_nop_();_nop_();_nop_();//
int x,y;
for(x=0; x <1000; x++)
{
for(y= 100; y > 0; y--)
{
_nop_();
}
}
}
void send(uint dacdata)
{
uint i,dach,dacl,dacsend,text;
text = dacdata / 256;
dacl = dacdata % 256; //DAC7512 输入 数字量 低字节
if(text&0x30==0)
dach = text; //DAC7512 输入 数字量 高字节
else
{text=text&0x0f;
dach= text;
}
DAC_SCLK = 0; //下降沿
//****************************发送数据(高字节)给DAC7512
for(i=0;i<8;i++)
{
//********************
dacsend = dach & 0x80;
if(dacsend == 0x80)
DAC_DIN=1;
else DAC_DIN=0;
dach = dach << 1;
//********************
DAC_SCLK = 1; //下降沿
Delay_us();
DAC_SCLK = 0;
}
//****************************发送数据(低字节)给DAC7512
DAC_SCLK = 0; //下降沿
for(i=0;i<8;i++)
{
dacsend = dacl & 0x80;
if(dacsend == 0x80)
DAC_DIN=1;
else
DAC_DIN=0;
dacl = dacl << 1;
//********************
DAC_SCLK = 1; //下降沿
Delay_us();
DAC_SCLK = 0;
}
}
main(void)
{
DAC_SYNC = 1; //SYNC 置高电平, 并至少保持 33ns
Delay_us();
DAC_SYNC = 0; //启动 写周期
while(1)
{
send(0x8888);
}
}
我们看到网上的一个程序,之后改的。。不是直接用的。。。我觉得逻辑没问题的呀。。。
【 在 UZ 的大作中提到: 】
: 贴在这里吧,我没用过52单片机?我从你代码里猜测的。
: 你是移植的还是哪里来的代码?总不能一上来就用吧。
: 【 在 Moster (Moster_nb) 的大作中提到: 】
: ...................
不是这个意思哈~~是我们初级阶段,水平不行,所以注释的比较多哈···
1.Delay_us是你自己改的吧。太长了。拿示波器配合IO翻转把这个函数重写了试试
2.三个IO口定义是P3^0这样的吗?我没用过52……不过我好像记得是P3.0这样的?
3.text&0x30这句话含义有点诡异。不过这不是大问题
暂时看到这么多问题,Delay_us函数问题比较大
【 在 Moster (Moster_nb) 的大作中提到: 】
: #include <reg52.h>
: #include <intrins.h>
: #define uint unsigned int
: ...................
我看了Datasheet,你的程序除了我上面说的地方之外,有两个逻辑错误
1.
for(i=0;i<8;i++)
{
//********************
dacsend = dach & 0x80;
if(dacsend == 0x80)
DAC_DIN=1;
else DAC_DIN=0;
dach = dach << 1;
//********************
DAC_SCLK = 1; //下降沿
Delay_us();
DAC_SCLK = 0;
}
这段,DAC_SCLK=0;之后还需要插入一个Delay_us();不然你出来的就不是方波了。
2.
你的SYNC线在发送完16位数据后没有拉高,也没有延时。
好好再看看Datasheet里的时序,然会对着示波器看CLK+Din以及CLK+SYNC的信号。
【 在 Moster (Moster_nb) 的大作中提到: 】
: #include <reg52.h>
: #include <intrins.h>
: #define uint unsigned int
: ...................
【 在 UZ 的大作中提到: 】
: 我看了Datasheet,你的程序除了我上面说的地方之外,有两个逻辑错误
: 1.
: for(i=0;i<8;i++)
: ...................
我修改了···但是还是没有出现任何变化···