打印

大家好,请问ADS1242为什么一直输出65535???

[复制链接]
4568|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qyihan|  楼主 | 2013-6-28 12:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qyihan 于 2013-6-28 16:06 编辑

公司用ADS1242芯片,现在做了一个实验板,ADS1242芯片5V供电,参考电压是2.5V,遇到一个问题,AD输出值一直是65535,不会变,不知道是怎么回事,请大家帮忙指导一下!!!

下面是我写的驱动程序:
ADS1242.h
#ifndef __ADS1242_H__
#define __ADS1242_H__  
              
#include <reg52.h>               //头文件的包含
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
#define  _Nop()  _nop_()        //定义空指令

/*定义ADS1242的寄存器地址   */
#define ADS1242_SETUP     0x00
#define ADS1242_MUX       0x01
#define ADS1242_ACR       0x02
#define ADS1242_ODAC      0x03
#define ADS1242_DIO       0x04
#define ADS1242_DIR       0x05
#define ADS1242_IOCON     0x06
#define ADS1242_OCR0      0x07
#define ADS1242_OCR1      0x08
#define ADS1242_OCR2      0x09
#define ADS1242_FSR0      0x0a
#define ADS1242_FSR1      0x0b
#define ADS1242_FSR2      0x0c
#define ADS1242_DOR2      0x0d
#define ADS1242_DOR1      0x0e
#define ADS1242_DOR0      0x0f

/*定义ADS1242的寄存器地址   */
#define ADS1242_CMD_RDATA    0x01
#define ADS1242_CMD_RDATAC   0x03
#define ADS1242_CMD_STOPC    0x0f
#define ADS1242_CMD_RREG     0x10
#define ADS1242_CMD_WREG     0x50
#define ADS1242_CMD_SELFCAL  0xf0
#define ADS1242_CMD_SELFOCAL 0xf1
#define ADS1242_CMD_SELFGCAL 0xf2
#define ADS1242_CMD_SYSOCAL  0xf3
#define ADS1242_CMD_SYSGCAL  0xf4
#define ADS1242_CMD_WAKEUP   0xfb
#define ADS1242_CMD_DSYNC    0xfc
#define ADS1242_CMD_SLEEP    0xfd
#define ADS1242_CMD_RESET    0xfe


/*配置寄存器位*/
#define BUFFER_ON     (1<<4)          /*ACR寄存器BUFFER启用*/
#define BUFFER_OFF    (0<<4)          /*ACR寄存器BUFFER不用*/

#define RANGE_0    (0<<2)                /*配置ACR寄存器的RANGE位为0*/
#define RANGE_1    (1<<2)    /*配置ACR寄存器的RANGE位为1*/

#define SPEED_0       (0<<5)    /**/
#define SPEED_1       (1<<5)

#define DATARATE_3_75 (0x10)       /*配置ACR寄存器的Data Rate为3.75HZ*/
#define DATARATE_7_5  (0x01)    /*配置ACR寄存器的Data Rate为7.5HZ*/
#define DATARATE_15   (0x00)    /*配置ACR寄存器的Data Rate为15HZ*/

#define PGA_1         (0x00)    /*配置SETUP寄存器的PGA为1   */
#define PGA_2         (0x01)    /*配置SETUP寄存器的PGA为2   */
#define PGA_4         (0x02)    /*配置SETUP寄存器的PGA为4   */
#define PGA_8         (0x03)    /*配置SETUP寄存器的PGA为8   */
#define PGA_16        (0x04)    /*配置SETUP寄存器的PGA为16  */
#define PGA_32        (0x05)    /*配置SETUP寄存器的PGA为32  */
#define PGA_64        (0x06)    /*配置SETUP寄存器的PGA为64  */
#define PGA_128       (0x07)    /*配置SETUP寄存器的PGA为128 */


/*定义IO口*/
sbit IO_PDWN=                P1^0;
sbit IO_DRDY=                P1^1;
sbit IO_SCLK=                P1^2;
sbit IO_DOUT=                P1^3;
sbit IO_DIN=                 P1^4;
sbit IO_CS=                  P1^5;


void ADS1242Init();
/*写一个字节的数据            */
void WriteByte(uchar Dat);
/*读一个字节的数据            */
uchar ReadByte();

/*写寄存器            */
void WriteReg(uchar RegAdd,uchar RegDat);


/*读寄存器            */
uchar ReadReg(uchar RegAdd);
/*选择AD通道  */
void SelectChannel(uchar PosChannel,uchar NegChannel);
/*等待AD转换完成  */
void WaitADConComplete();
/*从DOR寄存器读取转换结果  */
ulong ReadDataFromDOR(uchar PosChannel,uchar NegChannel);
/*上电自校正*/
void SelfCalibrate();
/*供主程序调用*/
ulong ADS1242Convert(uchar PosChannel,uchar NegChannel);

#endif

ADS1242.C
#include "ads1242.h"
#include "delay.h"

uchar errcounter = 0;
void ADS1242Init()
{
  IO_PDWN = 1;
  IO_DOUT = 0;
}
/*写一个字节的数据            */
void WriteByte(uchar Dat)
{
  uchar i;
  IO_CS = 0;
  IO_SCLK = 0;
  _nop_();
  for(i=0;i<8;i++)
   {
    Dat = Dat<<1;
    IO_DIN = CY;
    IO_SCLK = 1;
    _nop_();
    _nop_();
    IO_SCLK = 0;
    _nop_();
   }
  IO_CS = 1;
}
/*读一个字节的数据            */
uchar ReadByte()
{
  uchar i,RDat;
  RDat = 0;
  IO_CS = 0;
  IO_SCLK = 0;
  _nop_();
  for(i=0;i<8;i++)
   {
   
    IO_SCLK = 1;
    _nop_();
    RDat = (RDat<<1)|IO_DOUT;
    IO_SCLK = 0;
    _nop_();
    _nop_();
//   DelayUs2x(2);
   }
  IO_CS = 1;
  return RDat;
}
/*写寄存器            */
void WriteReg(uchar RegAdd,uchar RegDat)                              /*寄存器地址,写入数据*/
{
  WriteByte(ADS1242_CMD_WREG + RegAdd);                         /*写寄存器命令+寄存器地址*/
  WriteByte(0x00);
  WriteByte(RegDat);
}


/*读寄存器            */
uchar ReadReg(uchar RegAdd)                                           /*寄存器地址  */
{
  WriteByte(ADS1242_CMD_RREG + RegAdd);                         /*读寄存器命令+寄存器地址*/
  WriteByte(0x00);
  return (ReadByte());
}
/*选择AD通道  */
void SelectChannel(uchar PosChannel,uchar NegChannel)                 /*正向通道,负向通道*/
{
  WriteReg(ADS1242_MUX,((PosChannel<<4)+NegChannel));
}
/*等待AD转换完成  */
void WaitADConComplete()
{
while(!IO_DRDY);                                                   /*DRDY为0表示转换完成*/
while(IO_DRDY);
}
/*从DOR寄存器读取转换结果  */
ulong ReadDataFromDOR(uchar PosChannel,uchar NegChannel)              /*正负通道号*/
{
  ulong temp;
  uchar DataMSB,DataMid,DataLSB;
  IO_CS = 0;
  SelectChannel(PosChannel,NegChannel);                         /*选择通道*/
  WaitADConComplete();
  WriteByte(0x01);
  IO_CS = 0;
  DelayMs(1);                                              /*发送读数据命令*/
  DataMSB = ReadReg(ADS1242_DOR2);
  DataMid = ReadReg(ADS1242_DOR1);
  DataLSB = ReadReg(ADS1242_DOR1);
  IO_CS = 1;
  temp = (DataMSB<<16) + (DataMid<<8) + DataLSB;
  temp = DataLSB;
  return temp;
}
/*上电自校正*/
void SelfCalibrate()
{
  IO_PDWN = 1;
  WriteByte(ADS1242_CMD_RESET);
  WriteReg(ADS1242_SETUP,PGA_1);
  WriteReg(ADS1242_ACR,BUFFER_OFF + RANGE_0 + DATARATE_3_75);   /*配置ACR寄存器*/
        WriteReg(ADS1242_SETUP,PGA_1);
  WriteReg(ADS1242_ODAC,0x00);                                  /*上电自校正*/
  IO_CS = 0;
  while(IO_DRDY);                                               /*等待校正完成*/
  IO_CS = 1;
  WriteReg(ADS1242_ACR,BUFFER_ON + RANGE_0 + DATARATE_3_75);    /*配置ACR寄存器*/
               
}
/*供主程序调用*/
ulong ADS1242Convert(uchar PosChannel,uchar NegChannel)
{
  ulong temp;
  ADS1242Init();
  SelfCalibrate();
  temp = ReadDataFromDOR(PosChannel,NegChannel);
  temp = ReadDataFromDOR(PosChannel,NegChannel);                /*取第二个数据*/
  return temp;
}

相关帖子

沙发
huangxz| | 2013-6-28 14:22 | 只看该作者
看起来像ads没有工作起来,ADOUT一直输出高电平

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
qyihan + 1
板凳
qyihan|  楼主 | 2013-6-28 14:41 | 只看该作者
huangxz 发表于 2013-6-28 14:22
看起来像ads没有工作起来,ADOUT一直输出高电平

应该是工作了  我试验了一下,对某一个寄存器写一个数,能正确的读出

使用特权

评论回复
地板
ayb_ice| | 2013-6-28 14:46 | 只看该作者
输入电压太高

使用特权

评论回复
5
refee| | 2013-6-28 14:50 | 只看该作者
话说65535=0xFFFF 等于输出一直是高电平 楼主查一下硬件先

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
qyihan + 1
6
qyihan|  楼主 | 2013-6-28 15:54 | 只看该作者
refee 发表于 2013-6-28 14:50
话说65535=0xFFFF 等于输出一直是高电平 楼主查一下硬件先

会不会是程序的问题,24位的AD应该是0xFFFFFF,为什么是4个F呢

使用特权

评论回复
7
qyihan|  楼主 | 2013-6-28 16:00 | 只看该作者
ayb_ice 发表于 2013-6-28 14:46
输入电压太高

DATASHEET上要求是2.7V到5.25V呀

使用特权

评论回复
8
marshallemon| | 2013-6-28 19:20 | 只看该作者
一直用这个片子感觉还不错,PGA设置多少?DRDY有信号吗?

使用特权

评论回复
9
qyihan|  楼主 | 2013-6-29 11:17 | 只看该作者
kimfufree 发表于 2013-6-28 16:48
虽然没做过ADS1242,但是看你读值程序,字节变量再怎么样也不会达到FFFF吧。左移16位前不需要类型转换为32 ...

谢谢   这个确实有问题   

使用特权

评论回复
10
qyihan|  楼主 | 2013-6-29 11:18 | 只看该作者
marshallemon 发表于 2013-6-28 19:20
一直用这个片子感觉还不错,PGA设置多少?DRDY有信号吗?

PGA我设置的是1,DRDY从示波器中看到有一个上升沿,大部分时间是低电平

使用特权

评论回复
11
qyihan|  楼主 | 2013-6-29 11:20 | 只看该作者
marshallemon 发表于 2013-6-28 19:20
一直用这个片子感觉还不错,PGA设置多少?DRDY有信号吗?

我调了一周了,一直没出来,很着急,你能帮我好好看看吗,谢谢了

使用特权

评论回复
12
wh6ic| | 2013-6-29 15:47 | 只看该作者
----》 RDat = (RDat<<1)|IO_DOUT;
                        IO_DOUT 是定义的P1.3!编译出来是什么东西?!哪能这样写。

使用特权

评论回复
13
qyihan|  楼主 | 2013-6-29 16:22 | 只看该作者
wh6ic 发表于 2013-6-29 15:47
----》 RDat = (RDat

可以这样写的吧  每次写进去一位  

使用特权

评论回复
14
marshallemon| | 2013-6-29 19:29 | 只看该作者
qyihan 发表于 2013-6-29 11:20
我调了一周了,一直没出来,很着急,你能帮我好好看看吗,谢谢了

忘了说一件事,最初的时候我也是用51来测试的,但当时发现AD并不能正常的工作,每次必须给板子上的大电容放电然后再上电才能正常工作,后来咋查都无果,索性换了AVR,用硬件SPI模式,一次搞定

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
qyihan + 1
15
qyihan|  楼主 | 2013-7-1 09:17 | 只看该作者
非常感谢大家  我跳出来了  我可能是犯了一个错误,在自校正里加入了复位指令
WriteByte(ADS1242_CMD_RESET);
去掉以后就可以了

使用特权

评论回复
16
qyihan|  楼主 | 2013-7-1 09:19 | 只看该作者
marshallemon 发表于 2013-6-29 19:29
忘了说一件事,最初的时候我也是用51来测试的,但当时发现AD并不能正常的工作,每次必须给板子上的大电容 ...

嘿嘿  谢谢,我用51调出来了,你知道PGA怎么用吗,PGA设置不同,最大量程范围应该不一样啊,我的都一样,都是2.5V

使用特权

评论回复
17
marshallemon| | 2013-7-1 16:58 | 只看该作者
qyihan 发表于 2013-7-1 09:19
嘿嘿  谢谢,我用51调出来了,你知道PGA怎么用吗,PGA设置不同,最大量程范围应该不一样啊,我的都一样, ...

恩,这个片子我现在经常用,但MCU是用的AVR,PGA是用于设置增益的,我现在用AVR驱动这个片子主要是使用PGA=16或32的,既然你设置了PGA没道理不能用啊,设置为PGA=32时最大输入只有78.125mV,麻烦把你调好的程序发我一下,我也测试下当时我的那个未调试成功的板子marshallemon@126.com谢谢了

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
qyihan + 1
18
qyihan|  楼主 | 2013-7-5 18:09 | 只看该作者
marshallemon 发表于 2013-7-1 16:58
恩,这个片子我现在经常用,但MCU是用的AVR,PGA是用于设置增益的,我现在用AVR驱动这个片子主要是使用PGA ...

这两天有点忙  没上论坛  已经发给你了

使用特权

评论回复
19
xyz549040622| | 2013-7-5 19:10 | 只看该作者
marshallemon 发表于 2013-6-29 19:29
忘了说一件事,最初的时候我也是用51来测试的,但当时发现AD并不能正常的工作,每次必须给板子上的大电容 ...

我的Da也用这个试试

使用特权

评论回复
20
marshallemon| | 2013-7-10 08:43 | 只看该作者
qyihan 发表于 2013-7-5 18:09
这两天有点忙  没上论坛  已经发给你了

好的,谢谢了

使用特权

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

本版积分规则

13

主题

284

帖子

0

粉丝