21ic电子技术开发论坛

标题: HX711_dout不能被拉低 一直等待 求帮助 [打印本页]

作者: ST零点    时间: 2014-7-7 17:35
标题: HX711_dout不能被拉低 一直等待 求帮助
一直在这里等待
作者: MOn51    时间: 2014-7-7 18:17
//                                 参考C程序:
//************************************************************************
#include "USE.H"
#include "Ver.h"
//************************************************************************
extern void Delay10(void);
//************************************************************************
sbit Hx711_DAT1=P2^1;
sbit Hx711_CLK1=P2^0;                         //P0.24和P0.25
#define Hx711_BUSY        (Hx711_DAT1)
//************************************************************************
#define Hx711_DAT(x)        ((x>0) ? (Hx711_DAT1=1) : (Hx711_DAT1=0));        //设置1,0
#define Hx711_CLK(x)        ((x>0) ? (Hx711_CLK1=1) : (Hx711_CLK1=0));        //设置1,0
/******************************************************************
。管脚PD_SCK 输入用来控制HX711
的断电。当PD_SCK 为低电平时,芯片处于正常工作状态。
读取HX711的AD值,依次是A,B
PD_SCK 脉冲数输入通道         增益
25      A                128
26      B                64
27      A                64
******************************************************************/

//*****************************************************************
void Ready_HX711(void){
        Hx711_DAT(1);
        Hx711_CLK(0);
}
/**************************************************************
查询HX711是否转换完毕   Hx711_DAT=0
***************************************************************/
unsigned char Jb_HX711_OK(void){
        return Hx711_DAT1;                                       
}
/*****************************************************************************
//控制通道和增益
//flag=0 不改变通道
//flag=1 A通道  128
//flag=2 B通道        64
//flag=3 A通道        64
*******************************************************************************/
unsigned long Rd_Hx711_A_64(unsigned char ch){
        unsigned long Count;
        unsigned char i;
        Count=0;
        for(i=0;i<24;i++){
                Count<<=1;
                Hx711_CLK(1);
                Hx711_CLK(0)
                if(Jb_HX711_OK())        Count++;
        }
        Hx711_CLK(1)
        Hx711_CLK(0);  //必须变0

        Hx711_CLK(1)
        Hx711_CLK(0);  //必须变0

        if(ch==0){           // A通道=0,必须加入!
                Hx711_CLK(1)
                Hx711_CLK(0);  //必须变0
        }
        return(Count);
}
/*********************************************************************
补吗处理程序 ,返回电压值!uV
**********************************************************************/
float GetFloat_BuMa(unsigned long dat){
        #define MAX_REF                        (3300)//单位MV
        float u,f;

        f=1;                                        //正负号的处理               
        if(dat & 0x00800000l){         //是补吗
                dat=~(dat-1);
                dat &=0x00ffffffl;
                f=-1;
        }
        u=(float)dat*MAX_REF/0x00800000l/64;           //只有一半的数据
        u *=f;
        return u*1000;                        //必须是uV
}
//*********************************************************************
//计算累加和
//*********************************************************************
unsigned long Count_AD(unsigned long ad,unsigned char no){
        return (ad/no);
}
/**********************************************************************
启动AD  返回=0 没有数据;=1数据可用!
***********************************************************************/
unsigned char GetHX711(float *u0,float *u1){
        #define MAX_HX711_No        32                //采集的次数
        static char  A_B_CH=0;                        //2个通道的转换
        static unsigned long xdata ad_Hx711[2]={0,0};
        static unsigned char  n=0,m=0;                        //采集的次数
        unsigned long ad;
        float u;

        //************************************************
        if(m==1){           //首次切换通道!
                if (Jb_HX711_OK()==0){
                        m=2;
                        A_B_CH=0;
                        Rd_Hx711_A_64(0);//读取A通道!
                        //tDelay(3);
                }
        }
        //********************************************
        if(m==3){           //切换B通道!
                if (Jb_HX711_OK()==0){
                        m=2;
                        Rd_Hx711_A_64(1);//读取A通道!
                        //tDelay(3);
                }
        }
        //********************************************
        if (m==0){
                Ready_HX711();        //首次上电先初始化HX711
                m=1;
        }
        //*********************************************
        //转化完毕则采集
        if(m ==2){
                if (Jb_HX711_OK()==0){
                        ad_Hx711[A_B_CH] +=Rd_Hx711_A_64(A_B_CH);//读取A,B通道!
                        //***************************************************
                        if(++n >=MAX_HX711_No){
                                n=0;
                                //*************************************************
                                //计算AD值
                                ad=Count_AD(ad_Hx711[A_B_CH],MAX_HX711_No);
                                ad_Hx711[A_B_CH]=0;                                  //清除原数据
                                //*************************************************
                                u=GetFloat_BuMa(ad);                         //补码数据处理
                                //*************************************************
                                if(A_B_CH==0) *u0=u;
                                if(A_B_CH==1) *u1=u; //传出数据
                                //*************************************************
                                A_B_CH = (++A_B_CH)%2;                                //切换
                                //必须从新切换通道!等待稳定!
                                if(A_B_CH==1)         m=3;//读取B通道!
                                if(A_B_CH==0){
                                        m=0;                                       
                                         return 1;                        //2个通道全部测量完毕 数据可用
                                }       
                        }
                }
        }
        return 0;
}
//***************************************************************
//计算数据
void CountAdData(float u,unsigned char ch){
        float u0;
        u0=Mp1.Pt[ch].a*u+Mp1.Pt[ch].b;
        //************************************
        //y=kx+b-->y=ax+b
        //************************************
        if(u0>AdData[ch].Max) AdData[ch].Max=u0;
        if(u0<AdData[ch].Min) AdData[ch].Min=u0;
        //************************************
        AdData[ch].SUM +=u0;                                                         //计算累加值
        AdData[ch].Mont = u0;                                                        //瞬时值!
        AdData[ch].cnt++;                                                                //次数加一!
}
//****************************************************************
//标定AD转换的数据
unsigned char  GetHx711Data(void){
        static float u0,u1;

        if(0==GetHX711(&u0,&u1)) return 0;
        //************************************
        //y=kx+b-->y=ax+b
        //************************************
        CountAdData(u0,0);
        CountAdData(u1,1);
        return 1;
}
//****************************************************************
//通讯完毕后,必须清空原来的参数
//****************************************************************
void ClrAdData(void){
        memset((unsigned char *)&AdData[0],0,sizeof(AD_DATA));
        memset((unsigned char *)&AdData[1],0,sizeof(AD_DATA));
        AdData[0].Max=AD_MIN;
        AdData[1].Max=AD_MIN;
        AdData[0].Min=AD_MAX;
        AdData[1].Min=AD_MAX;
}
//**********************************************************************
//ad采集
//**********************************************************************
void Get_Ad_Data(void){
       
        if(1==GetHx711Data()){ //采集完后返回1
                Wr_IAP_AD();        //写入EEROM
                Turn_PT_ON (OFF);
                Turn_AD_ON (OFF);
                LedMenu.Power=PWR_WAKEUP;        //等待               
//                Led_ON(1);
        }
}




作者: MOn51    时间: 2014-7-7 18:17
这是正常使用的代码。希望有用。
作者: xyz769    时间: 2014-7-7 21:32
楼主看错文档了,SCK才会被拉低,不是DOUT!

作者: ST零点    时间: 2014-7-8 09:28
xyz769 发表于 2014-7-7 21:32
楼主看错文档了,SCK才会被拉低,不是DOUT!

但是这条语句怎么办? while(hx711_dout); 跳转不出去。
作者: ST零点    时间: 2014-7-8 09:29
#include "HX711.h"


//****************************************************
//延时函数
//****************************************************
void Delay__hx711_us(void)
{
        _nop_();
        _nop_();
}

//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)        //增益128
{
        unsigned long count;
        unsigned char i;
          HX711_DOUT=1;
        Delay__hx711_us();
          HX711_SCK=0;
          count=0;
          while(HX711_DOUT);
          for(i=0;i<24;i++)
        {
                  HX711_SCK=1;
                  count=count<<1;
                HX711_SCK=0;
                  if(HX711_DOUT)
                        count++;
        }
        HX711_SCK=1;
    count=count^0x800000;//第25个脉冲下降沿来时,转换数据
        Delay__hx711_us();
        HX711_SCK=0;  
        return(count);
}

作者: ST零点    时间: 2014-7-8 09:34
MOn51 发表于 2014-7-7 18:17
这是正常使用的代码。希望有用。

嗯嗯  谢谢诶:P
作者: ayb_ice    时间: 2014-7-8 09:36
主程序的那个goto好猛啊
作者: ST零点    时间: 2014-7-8 10:39
ayb_ice 发表于 2014-7-8 09:36
主程序的那个goto好猛啊

能走到主程序那里了? 好厉害  怎么做到的? 为什么我一直在 数据转换那里
作者: ST零点    时间: 2014-7-8 10:44
ST零点 发表于 2014-7-8 10:39
能走到主程序那里了? 好厉害  怎么做到的? 为什么我一直在 数据转换那里 ...

在线等啊  急求
作者: ST零点    时间: 2014-7-9 11:15
@51armfpga :lol帮我看看呗
作者: ST零点    时间: 2014-7-9 11:16
@21ic小跑堂 帮我看看呗 :lol
作者: ST零点    时间: 2014-7-9 11:17
@21小跑堂  
作者: xyz549040622    时间: 2014-7-9 11:36
ST零点 发表于 2014-7-9 11:17
@21小跑堂

:lol小跑堂还有这个作用,哈哈
作者: xyz549040622    时间: 2014-7-9 11:37
Dout拉高后会自动拉低的,如果你的程序一直在哪里执行,请检查硬件
作者: ST零点    时间: 2014-7-9 15:20
xyz549040622 发表于 2014-7-9 11:37
Dout拉高后会自动拉低的,如果你的程序一直在哪里执行,请检查硬件

我也感觉是硬件出了问题。 那这样子的话就必须要重新做下硬件了啊?怎么确定HX711模块没有采集到数据呢
作者: ST零点    时间: 2014-7-9 15:21
xyz549040622 发表于 2014-7-9 11:36
小跑堂还有这个作用,哈哈

  原谅我的@@@xyz549040622
作者: ST零点    时间: 2014-7-9 15:24
while(HX711_DOUT); //问题就出在这条语句了   一直不能被拉低  所以这个函数unsigned long HX711_Read(void)  不能正常执行,然后直接导致重量传感器的数据不能被采集到。。。
作者: xyz549040622    时间: 2014-7-9 15:28
ST零点 发表于 2014-7-9 15:20
我也感觉是硬件出了问题。 那这样子的话就必须要重新做下硬件了啊?怎么确定HX711模块没有采集到数据呢 ...

只好读数据看了
作者: ST零点    时间: 2014-7-10 11:09
xyz549040622 发表于 2014-7-9 15:28
只好读数据看了

怎么读数据 还望版主大人指教。。。我是菜鸟。。。
作者: xyz549040622    时间: 2014-7-10 11:40
ST零点 发表于 2014-7-10 11:09
怎么读数据 还望版主大人指教。。。我是菜鸟。。。
复制
  1. //****************************************************
  2. //读取HX711
  3. //****************************************************
  4. unsigned long HX711_Read(void)        //增益128
  5. {
  6.         unsigned long count;
  7.         unsigned char i;
  8.           HX711_DOUT=1;
  9.         Delay__hx711_us();
  10.           HX711_SCK=0;
  11.           count=0;
  12.           while(HX711_DOUT);
  13.           for(i=0;i<24;i++)
  14.         {
  15.                   HX711_SCK=1;
  16.                   count=count<<1;
  17.                 HX711_SCK=0;
  18.                   if(HX711_DOUT)
  19.                         count++;
  20.         }
  21.         HX711_SCK=1;
  22.     count=count^0x800000;//第25个脉冲下降沿来时,转换数据
  23.         Delay__hx711_us();
  24.         HX711_SCK=0;  
  25.         return(count);
  26. }

这个不就是读数据么
作者: ST零点    时间: 2014-7-10 14:52
xyz549040622 发表于 2014-7-10 11:40
这个不就是读数据么

事实证明 我读不出数据来。。。。。。。
作者: xyz769    时间: 2014-7-10 21:25
while(HX711_DOUT);

这个换成

while(HX711_SCK);

作者: ST零点    时间: 2014-7-12 10:24
xyz769 发表于 2014-7-10 21:25
while(HX711_DOUT);

这个换成

不行啊,还是不显示重量。。。
作者: xb402471851    时间: 2014-8-5 11:24
楼主问题解决了吗?同求
作者: xb402471851    时间: 2014-8-6 17:50
终于解决了,我的原因好像是用P1或P3口控制的时候,时钟和数据口不能与单片机正常通信,单P2口就可以。不知道谁能解释一下原因?
作者: xb402471851    时间: 2014-8-6 17:51
@xyz549040622  
作者: xyz549040622    时间: 2014-8-6 21:20
xb402471851 发表于 2014-8-6 17:50
终于解决了,我的原因好像是用P1或P3口控制的时候,时钟和数据口不能与单片机正常通信,单P2口就可以。不知 ...

一摸一样的端口,为什么P2就可以呢。。。
作者: xb402471851    时间: 2014-8-7 10:07
我看了下我开发板的原理图,所有的IO口都外接了上拉电阻,唯独我用的两个口没接,原因是在这吗?
作者: xb402471851    时间: 2014-8-7 10:08
xyz549040622 发表于 2014-8-6 21:20
一摸一样的端口,为什么P2就可以呢。。。


我看了下我开发板的原理图,所有的IO口都外接了上拉电阻,唯独我用的两个口没接,原因是在这吗?
作者: xyz549040622    时间: 2014-8-7 10:15
这个必须是重要原因
作者: xb402471851    时间: 2014-8-7 15:52
xyz549040622 发表于 2014-8-7 10:15
这个必须是重要原因

能否指点一二?
作者: xyz549040622    时间: 2014-8-7 16:16
xb402471851 发表于 2014-8-7 15:52
能否指点一二?

你是指你接无上拉的IO,HX711正常工作
接有上拉的IO,HX711不正常工作,对吧
作者: xb402471851    时间: 2014-8-7 16:23
xyz549040622 发表于 2014-8-7 16:16
你是指你接无上拉的IO,HX711正常工作
接有上拉的IO,HX711不正常工作,对吧 ...

是的
作者: xyz549040622    时间: 2014-8-7 17:00
xb402471851 发表于 2014-8-7 16:23
是的

与DOUT相连的MCU接口应设置为输入口,并且不接任何拉高或拉低电阻,以减少MCU与ADC之间的电流交换(干扰)。 这句话来自官网。。。
作者: xb402471851    时间: 2014-8-8 09:09
xyz549040622 发表于 2014-8-7 17:00
与DOUT相连的MCU接口应设置为输入口,并且不接任何拉高或拉低电阻,以减少MCU与ADC之间的电流交换(干扰 ...

看到了,3Q!
作者: ST零点    时间: 2014-8-8 10:58
xb402471851 发表于 2014-8-5 11:24
楼主问题解决了吗?同求

我的问题是硬件问题,程序什么的什么都没改,换了两次HX711模块才好。。只想说硬件怎么坏掉的我好好奇。。。而且还坏了俩。。。
作者: 秋思    时间: 2015-3-20 14:47
我也遇到相同问题了,在while(ADDO);这里死循环。
ADDO=P0^0,P0^0没有接上拉或下拉。
作者: laoxu    时间: 2015-3-21 06:20
估计HX711 数据控制线接错的可能性极大。
作者: ninicaoyuan    时间: 2015-12-31 18:08
我的原因是没给电,郁闷惨了,不过还是发现了!
作者: deviney    时间: 2016-3-23 13:18
请问楼主解决没有   急急急急急急
作者: 混吃等死的熊    时间: 2017-1-19 11:19
我也遇得到这问题,求帮助
作者: 混吃等死的熊    时间: 2017-1-19 11:27
deviney 发表于 2016-3-23 13:18
请问楼主解决没有   急急急急急急

拟解决了吗
作者: 地方女大夫    时间: 2023-8-27 08:43
标题:
本帖最后由 地方女大夫 于 2023-8-29 09:26 编辑

,同样的情况,我发现买的HX711板,传感器E-的接线没和GND连一起,和芯片标准的接法不一致,加了连接线后程序可以往下走了,今天发现实际是我的一对杜邦线电源和地线接触不好的关系。和板子没关系




欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/) Powered by Discuz! X3.5