有关模数转换AD7822/7825/7829的问题,急~~~

时间:2021-05-23 16:33:30
最近搞了好几天AD7822模数转换芯片,但一直没有搞出来,已经是严格按照时序图来写代码了,但还是不知道出了什么问题,郁闷...请高人指点!小弟感激万分!!
现在出现的问题是:读AD数据时,用串口显示完全没有规律,当我用万用表测AD信号输入脚时,会影响到串口显示的数据.但有进入中断
我用示波器观察数据输入脚P0脚时,各个脚会经常出现从5V-0V的跳变行刺!就跟串口显示的数据几乎一样的结果...
程序如下:(为高速转换模式)

#include <12c5a60s2.h>
//#include <REG52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ADCLK = P3^5; //CONST
sbit CSAD = P3^4; //AD自选
sbit ADRD = P3^7; //读数据
sbit EOC = P3^2; //中断/转换完毕脚
sbit CSDA = P3^3;
sbit DAWR = P3^6;
sbit PD = P3^3; //模式更换脚,可切换到省电和高速模式
uchar i = 0xaa;
uchar temp = 0;

void delay_ns()                                        //约延时500ns
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void serial1_init() // 使用独立波特率发生器作为波特率发生器
{
SCON = 0x50; // 0101,0000 8 位可变波特率,无奇偶校验位
AUXR = 0x15; // T0x12,T1x12,UART_M0x6,BRTR|2SMOD,BRTx12,XRAM,S1BRS
BRT = 0xf4; // 22.1184下 BRTx12=1,波特率57600
}
main()
{
PD = 1; //高速模式
EA = 1;     //中断初始化
EX0 = 1;
// IP=0; //优先级
IT0=1;       //1:下降沿触发  0:电平触发
serial1_init();                     //串口发送初始化

CSAD = 0;
ADCLK = 1; //power-up
delay_ns(); //延时1us 等待上电稳定
delay_ns();
while(1)
{
EOC = 1;
ADRD = 1;
ADCLK = 0; //开始转换
delay_ns(); //适当延时等待转换完成
ADCLK = 1;
_nop_();_nop_();_nop_();_nop_();    
ADRD = 0;                           //读数据
_nop_();
ADRD = 1;  //当ADRD从0到1时,EOC自动清零
temp = P0;
SBUF = temp;                        //串口发送观察结果
while(TI == 0);
TI = 0;
delay_ns();                         //适当延时
}
}

void int0() interrupt 0 using 2
{
P1 = i++;                                    //进入中断后观察P1脚的8个灯,以便观察中断是否正常
}

9 个解决方案

#1


关注

#2


没有用过,看文档太耗时间了

#3


周末帮你看

#4


引用 2 楼 flypig8321 的回复:
没有用过,看文档太耗时间了

真的呀?太感谢啦!

#5


大致看了一下数据手册,基本流程是这样的:
1)启动转换 /CONVST负脉冲有效;
2)等待/ECO有效,
3)/CS,/RD有效,读取数据。
当然还要考虑时序和通道切换。


串口是另外一回事,先保证AD正常工作。另外,串口波特率设的太高了。

#6


引用 5 楼 zyzhang365 的回复:
大致看了一下数据手册,基本流程是这样的:
1)启动转换 /CONVST负脉冲有效;
2)等待/ECO有效,
3)/CS,/RD有效,读取数据。
当然还要考虑时序和通道切换。

串口是另外一回事,先保证AD正常工作。另外,串口波特率设的太高了。


5楼的提醒我了呀!波特率确实不宜太快,要保证发送正常才行.我再试试把波特率调低一点吧.
因为我是用宏晶新出的那快 STC12C5A60S2,定时器不12分频的,所以就想用最快的速率了,以缩短发送时间了...
谢啦!!

#7


改了波特率还是不行,测试过发送是正常的,但是AD转换出来的数据还是有问题...

奇怪是的,当我用万能表没AD7822的信号输入端时,读出来的数据就会有很大的变化,而放出万能表后又恢复正常,难道万能表会影响到信号吗?

#8


贴出来的程序是有问题的,AD转换的流程都不对,读懂文档再写代码吧。 告诉你先不要管串口。使用示波器看看吧。 

#9


引用 8 楼 zyzhang365 的回复:
贴出来的程序是有问题的,AD转换的流程都不对,读懂文档再写代码吧。 告诉你先不要管串口。使用示波器看看吧。

之前也试过用DA把数字量转换成模拟量,但结果还是一样...文档读了好几遍了,实在搞不出来才决定发帖.
不管怎样,谢谢你的回答!

#1


关注

#2


没有用过,看文档太耗时间了

#3


周末帮你看

#4


引用 2 楼 flypig8321 的回复:
没有用过,看文档太耗时间了

真的呀?太感谢啦!

#5


大致看了一下数据手册,基本流程是这样的:
1)启动转换 /CONVST负脉冲有效;
2)等待/ECO有效,
3)/CS,/RD有效,读取数据。
当然还要考虑时序和通道切换。


串口是另外一回事,先保证AD正常工作。另外,串口波特率设的太高了。

#6


引用 5 楼 zyzhang365 的回复:
大致看了一下数据手册,基本流程是这样的:
1)启动转换 /CONVST负脉冲有效;
2)等待/ECO有效,
3)/CS,/RD有效,读取数据。
当然还要考虑时序和通道切换。

串口是另外一回事,先保证AD正常工作。另外,串口波特率设的太高了。


5楼的提醒我了呀!波特率确实不宜太快,要保证发送正常才行.我再试试把波特率调低一点吧.
因为我是用宏晶新出的那快 STC12C5A60S2,定时器不12分频的,所以就想用最快的速率了,以缩短发送时间了...
谢啦!!

#7


改了波特率还是不行,测试过发送是正常的,但是AD转换出来的数据还是有问题...

奇怪是的,当我用万能表没AD7822的信号输入端时,读出来的数据就会有很大的变化,而放出万能表后又恢复正常,难道万能表会影响到信号吗?

#8


贴出来的程序是有问题的,AD转换的流程都不对,读懂文档再写代码吧。 告诉你先不要管串口。使用示波器看看吧。 

#9


引用 8 楼 zyzhang365 的回复:
贴出来的程序是有问题的,AD转换的流程都不对,读懂文档再写代码吧。 告诉你先不要管串口。使用示波器看看吧。

之前也试过用DA把数字量转换成模拟量,但结果还是一样...文档读了好几遍了,实在搞不出来才决定发帖.
不管怎样,谢谢你的回答!