打印

51MCU+3路A/D 转换 ,为何结果相同?

[复制链接]
2556|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ningling_21|  楼主 | 2009-10-10 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现象:三路采集引脚加不同电压,但是A/D转换数据相同,为何?程序如下:
#include <reg52.h> //51芯片管脚定义头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
sbit led=P3^5;
sbit out1=P1^0;
sbit out2=P1^1;
sbit clk=P2^0;
sbit ale=P2^1;
sbit oed=P1^4;
sbit eoc=P3^2;
sbit start=P1^5;
sbit chaa =P2^2;
sbit chbb =P2^3;
sbit chcc =P2^4;
bit  flag;
uchar ch1,ch2,ch3;

/**********************************************************
延时t毫秒
**********************************************************/
void delay(uint s)
{
  uchar k;
  while(--s)
  {
    for(k=0; k<125; k++);
   }
}

/**********************************************************
读通道3
**********************************************************/
read_ch3(void)
{
  oed=0;
  P0=0xff;
  start=0;
  chaa=0;
  chbb=1;
  chcc=0;
  ale=0;
  start=1;
  nop;
  start=0;
  nop;
  while(eoc); //AD结束?
  oed=1;
  nop;
  ch3=P0;
  oed=0;
}
/**********************************************************
读通道2
**********************************************************/
read_ch2(void)
{
  oed=0;
  P0=0xff;
  start=0;
  chaa=0;
  chbb=0;
  chcc=1;
  ale=0;
  start=1;
  nop;
  start=0;
  nop;
  while(eoc);
  oed=1;
  nop;
  ch2=P0;
  oed=0;
}
/**********************************************************
读通道1
**********************************************************/
read_ch1(void)
{
  oed=0;
  P0=0xff;
  start=0;
  chaa=0;
  chbb=0;
  chcc=0;
  ale=0;
  start=1;
  nop;
  start=0;
  nop;
  while(eoc);
  oed=1;
  nop;
  ch1=P0;
  oed=0;
}
/**********************************************************
读3通道AD数据
**********************************************************/
read_3ch_adc(void)
{
read_ch1();
read_ch2();
read_ch3();
}
/**********************************************************
数据发送到电脑
**********************************************************/
void send_to_pc(void)
{

  TI=0;
  SBUF=ch1;
  while(!TI);
  TI=0;
  SBUF=ch2;
  while(!TI);
  TI=0;
  SBUF=ch3;
  while(!TI);
  TI=0;

}
/**********************************************************
主函数
**********************************************************/
void  main( void)
{
uchar i,j;
i=0;j=0;
out1=0;
out2=0;
led=0;
TMOD =0X21;
TL0=0XFA;
TH0=0X00;
TH1=0XFD;
TL1=0XFD;
SCON=0X50;
IE=0X82;
TR1=1;
TR0=1;
ch1=0,ch2=0,ch3=0;  
delay(1000);
led=1;
while(1)
{

  if(flag==1)
  {
   led=0;
   read_3ch_adc();
   led=1;
   }
  send_to_pc();
  delay(15);
}
}
/**********************************************************
T0中断函数
**********************************************************/
void  time0(void) interrupt 1 using 1
{
   uint i;
   i++;
   clk=!clk;
   if(i==10)
   {
     i=0;
  flag=1;
  }
   TL0=0XFA;
   TH0=0X00;

}

相关帖子

沙发
ningling_21|  楼主 | 2009-10-10 18:04 | 只看该作者
本帖最后由 ningling_21 于 2009-10-10 18:08 编辑

没有显示程序,结果发送到电脑,看到三路AD转换数据相同....

使用特权

评论回复
板凳
ningling_21|  楼主 | 2009-10-10 19:46 | 只看该作者
例如:一般情况下,三路电压在1.6V左右   AD值是4AH

但是把其中一个电压升高后,三个电压的A/D值仍然是一样的,应该不同才对....

使用特权

评论回复
地板
chen3bing| | 2009-10-10 20:19 | 只看该作者
会不会你的程序有问题?
要不然就是硬件问题。

使用特权

评论回复
5
sjg_mcu| | 2009-10-10 21:02 | 只看该作者
老兄,改改你的编程风格吧,没有详细注释的程序,看起真的很累,
我没看你程序,根据经验是每路AD切换通道时要加延时,另外如果只有一点点小差别,因为芯片的工艺误差也会有的.我用PIC芯片,测量220V电压,不同的芯片,最多就有10V误差.

使用特权

评论回复
6
ningling_21|  楼主 | 2009-10-10 21:51 | 只看该作者
例如:三个数据都是 A9 A9 A9(8位AD)  这样的
按照测量的电压值,三个数据应该是:A9h(-b2h),  46(-48h)h,   46(-48h)h

使用特权

评论回复
7
sjg_mcu| | 2009-10-10 22:02 | 只看该作者
老兄,先用proteus做个仿真文件,然后连同HEX文件,一起发上来看看,

使用特权

评论回复
8
ningling_21|  楼主 | 2009-10-11 08:13 | 只看该作者
没用过那个仿真软件,HEX文件和原理图文件都传上。

TEMP_0809C.rar

503 Bytes

HEX文件

temp_0809.rar

3.8 KB

原理图

使用特权

评论回复
9
ningling_21|  楼主 | 2009-10-11 11:34 | 只看该作者
如果只打开一路,只转换一路AD,把转换数据发送到电脑,则AD转换数据能够正常变化...

使用特权

评论回复
10
hero4422| | 2009-10-11 14:42 | 只看该作者
应该是切换另外1路时时间太短;可以在切换每路时先加一个大延时;确定变化后再调整延时时间

使用特权

评论回复
11
shuizhongyu| | 2009-10-11 15:35 | 只看该作者
是不是程序有问题

使用特权

评论回复
12
ningling_21|  楼主 | 2009-10-11 17:04 | 只看该作者
程序检查过,没查到什么问题...

使用特权

评论回复
13
ningling_21|  楼主 | 2009-10-12 19:08 | 只看该作者
举例:

只打开一路AD转换时,发送到电脑的数据是这样的:00 ,00,4AH (未转换的数据填充为00)
                                               00 ,B4H,00(第二通道)
                                                                      02H, 00   ,00 (第三通道)

同时打开三路AD转换时,电脑收到的数据是这样的:02H,02,02H (全部都是第一通道的数据)


期待中...

使用特权

评论回复
14
hanneswu| | 2009-10-13 10:13 | 只看该作者
随便调节其中一路的电压值,看采出来的AD怎么变化,如果还是第一路的数据,那就检查下电路..不过首先还是检查下你的采样程序,看采出来的值和实际电压是否一样.

使用特权

评论回复
15
awmc_m| | 2009-10-13 11:43 | 只看该作者
看了一下你的程序,好像时序不对,ale并没有脉冲变化,所以每次的地址应该都是不变的。
你的clk是用定时器实现的,最好速度再快点,或者ale、start等慢点。

使用特权

评论回复
16
程序匠人| | 2009-10-13 15:35 | 只看该作者
串口程序有没有问题呢?

使用特权

评论回复
17
ningling_21|  楼主 | 2009-10-13 18:25 | 只看该作者
回 匠人  串口程序没问题

感谢16楼,经改程序增加10MS延时,调试OK,问题解决....

使用特权

评论回复
18
awmc_m| | 2009-10-13 21:49 | 只看该作者
18# ningling_21

看adc0809的datasheet,它的采样通道地址选择是在ale信号上升沿的时候才改变的。
写这类驱动最好按着它给的时序图去写,那样可以避免很多失误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5013

主题

17735

帖子

51

粉丝