智能车制作

标题: 用K60玩过HX711电子称的ad模块 [打印本页]

作者: 樱月樱诗    时间: 2014-9-9 18:38
标题: 用K60玩过HX711电子称的ad模块
本帖最后由 樱月樱诗 于 2014-9-9 19:05 编辑

RT.以下是自己写的(读出来的值都是2的N次方-1)

用K60做的有问题。有没有大神高搞过,或者是k60设置IO输出输入方向也行?


为啥我写的K60的不行呢(附程序)
#define ADDO0   PTE5_OUT=0
#define ADDO1   PTE5_OUT=1
#define ADSK0   PTE6_OUT=0
#define ADSK1   PTE6_OUT=1
#define ADDIN   PTE5_IN



unsigned long ReadAD()  //读AD芯片输出的数据。
{
        unsigned long val = 0;
        unsigned char i = 0;
        ADDO1;
        delayus(3);
        ADSK0;
        val = 0;
     //  PORTC|=BIT(7);
         PORTE_PCR1 = ( PORT_PCR_MUX(1) );
        while(GPIO_GET_1bit(PORTE,6));   //DDRE0
        //delayus(3);
        for(i=0;i<24;i++)
        {
                ADSK1;
                delayus(10);//asm("nop");
                val=val<<1;
                 ADSK0;
                 delayus(3);
                   PORTE_PCR1 = ( PORT_PCR_MUX(1) );
                if(GPIO_GET_1bit(PORTE,6))
                {
                val++;
                delayus(3);
                }
        }
        ADSK1;
        delayus(3);
        val =(int)(val>>8);
        //val=val^0x800000;
         ADSK0;
        delayus(3);
         printf("%d\n",val);
        return val;
}



、、-------------------------------------------------------------------------------
以下是mp430的HX711AD读写正确的模块

#define ADDO0 P2OUT&=~BIT0;  //输出低电平P2.0
#define ADDO1 P2OUT|=BIT0;   //输出高电平
#define ADSK0 P2OUT&=~BIT1;  //输出低电平
#define ADSK1 P2OUT|=BIT1;  //输出低电平
#define ADDIN (P2IN&BIT0)   // P2.0引脚
/**********************************************************
延时子函数
**********************************************************/
void delayms(unsigned int ms)
{
  unsigned char t;
  while (ms--)
  {
    for (t = 0; t < 114; t++);
  }
}
/**********************************************************

读711 AD数据子程序

**********************************************************/
unsigned long ReadCount(void)
{
        unsigned long Count;
        unsigned int ADval;
        unsigned char i;
        P2DIR|=BIT0;           //设置p2.o  输出
        ADDO1;
        _NOP();_NOP();_NOP();
        ADSK0;
        Count=0;
        P2DIR&=~BIT0;           //设置pP2.0输入
        while(ADDIN==BIT0);
        for(i=0;i<24;i++)   //读24个bit
        {
          ADSK1;_NOP();_NOP();_NOP();
          Count=Count<<1;
          ADSK0;_NOP();_NOP();_NOP();
          P2DIR&=~BIT0;       设置pP2.0输入  
          if(ADDIN==BIT0)     
          {
            Count++;
          }
        } P3OUT&=~BIT0;   输出低电平     

        ADSK1; //发送第25个脉冲,表示下次转换使用A通道128db
        _NOP();_NOP();_NOP();
        ADval = (int)(Count>>8);        
        ADSK0;_NOP();_NOP();_NOP();         

        //ADval=Count^0x800000;
        return(ADval);
        //return Count;
}


求大神指点迷津或者求教K60 IO方向设置



作者: 樱月樱诗    时间: 2014-9-10 13:49
就这么沉了么=== 没人玩过么?
作者: 木鱼丶    时间: 2015-4-7 10:21
解决了吗
作者: 樱月樱诗    时间: 2015-4-10 22:31
木鱼丶 发表于 2015-4-7 10:21
解决了吗

解决了。

作者: ljinli    时间: 2016-7-26 15:34
楼主右修改后的程序吗

作者: 樱月樱诗    时间: 2016-7-26 15:47
本帖最后由 樱月樱诗 于 2016-7-26 16:00 编辑

有,开源吧。
/*******************************************************

本文件中,是操作称重传感器专用AD芯片 HX711 的程序。

********************************************************/
#include "HX711_AD.h"
#include "include.h"
#include "Nokia5110.h"
#include "common.h"
#include "delay.h"
#include "gpio_cfg.h"


#define N 12           //
unsigned long BUF[N];  
unsigned long SUM=0;        
int i=0;      

#define SCK_1(x)  PTC0_OUT=(x);
#define DOUT_1(x) PTC1_OUT=(x);

#define SCK_2(x)  PTE0_OUT=(x);
#define DOUT_2(x) PTE1_OUT=(x);


void HX711_Init()
{
  //-------------1-------------//
  gpio_init  (PORTC,0,GPO,HIGH);//SCK
  gpio_init  (PORTC,1,GPO,HIGH);//DOUT
  //-------------2-------------//
  gpio_init  (PORTE,0,GPO,HIGH);//SCK
  gpio_init  (PORTE,1,GPO,HIGH);//DOUT

}


unsigned long HX711_GET1()
{
  unsigned long int value=0;
  unsigned int x16;
  char i=0;
  DOUT_1(1);
  delayus(10);
  SCK_1(0);
  value=0  ;

  gpio_init  (PORTC,1,GPI,HIGH);//DOUT

  while(gpio_get(PORTC,1));
    for(i=0;i<24;i++)
    {
      SCK_1(1);   delayus(17);
      value=value<<1;
      SCK_1(0);   delayus(17);
      gpio_init  (PORTC,1,GPI,HIGH);
      if(gpio_get(PORTC,1))
      {
        value++;
      }
    }
      SCK_1(1); delayus(17);
   // value=value>>8;
    //  value = value^0x800000;
      SCK_1(0); delayus(17);
   //  x16 = value&0x0000ffff;
      //printf("%d\n",x16);

      return   value;
}


unsigned long HX711_GET2()
{
  unsigned long int value=0;
  unsigned int x16;
  char i=0;
  DOUT_2(1);
  delayus(10);
    SCK_2(0);
    value=0  ;

  gpio_init  (PORTE,1,GPI,HIGH);//DOUT

  while(gpio_get(PORTE,1));
    for(i=0;i<24;i++)
    {
      SCK_2(1);   delayus(17);
      value=value<<1;
      SCK_2(0);   delayus(17);
      gpio_init  (PORTE,1,GPI,HIGH);
      if(gpio_get(PORTE,1))
      {
        value++;
      }
    }
      SCK_2(1); delayus(17);
    value=value>>8;
   //   value = value^0x800000;
      SCK_2(0); delayus(17);
  //   x16 = value&0x0000ffff;
    //  printf("%d\n",x16);

  //    LCD_Write_Num(0, 1, x16,7);

      return   value;
}


void BUFInit(void)    //初始化队列数组BUFFSUM,即往里面存入N个采样值求和
{
        int j=0;

        for(j=0;j<N;j++)
        {
                BUF[j] = HX711_GET1();
                SUM+=BUF[j];
        }
}

long double filter(void)      //滑动均值滤波函数
{
        unsigned long temp=0,max=0,min=0;
        int j=0;

        temp = HX711_GET1();

        SUM = SUM+temp-BUF;
        BUF=temp;
        i++;
        if(i == N)
                i=0;

        max=BUF[0];
        min=BUF[0];
        for(j=0;j<N;j++)
        {
                if(max<BUF[j])        max=BUF[j];
                if(min>BUF[j])        min=BUF[j];
        }



        return (SUM-max-min)/(N-2);
}


//---------------------------------------------------------//
//AD采样处理——算术平均数字滤波
//--------------------------------------------------------//
unsigned long Sampling(void)
{
  unsigned int Sam[12],tmpmax,tmpmin,sum=0,Average;
  unsigned char i;

  for(i=0;i<12;i++)
  {
    Sam= HX711_GET1();            //赋值处
    if(i==0)
    {
      tmpmax=Sam[0];
      tmpmin=Sam[0];
    }
    if(i>0)
    {
      if(Sam>tmpmax)tmpmax=Sam;
      if(Sam<tmpmin)tmpmin=Sam;
    }
  }

  for(i=0;i<12;i++)
  {
    if(!(Sam==tmpmax||Sam==tmpmin))
    {
      sum=sum+Sam;
    }
  }
  Average=sum/10;

  return(Average);
}

void Get_Maopi()
{
        HX711_Buffer_1 = HX711_GET1();
        Weight_Maopi = HX711_Buffer_1/1000;
}

void Get_Weight()
{
        HX711_Buffer_1 = HX711_GET1();
        HX711_Buffer_1 = HX711_Buffer_1/1000;
        if(HX711_Buffer_1 >= Weight_Maopi+120)
        {
                Weight_Shiwu = HX711_Buffer_1;
                Weight_Shiwu = Weight_Shiwu - Weight_Maopi;
                Weight_Shiwu = (unsigned long int)((float)Weight_Shiwu/0.223);

        }
        else
                {
                 Weight_Shiwu=0;
                }
         Weight=Weight_Shiwu;
          LCD_Write_String(1, 2, "体重:")  ;
           LCD_Write_Num(36, 2, Weight_Shiwu%100000/10000,1);     //wan
       LCD_Write_Num(42, 2, Weight_Shiwu%100000%10000/1000,1);     //qian
       LCD_Write_Num(48, 2, Weight_Shiwu%100000%10000%1000/100,1);     //bai
        LCD_Show_Char(54,2, '.');
        LCD_Write_Num(60, 2, Weight_Shiwu%100000%10000%1000%100/10, 1);
        LCD_Write_Num(66, 2, Weight_Shiwu%10, 1);
      //  LCD_Write_Num(60, 2, Weight_Shiwu%1000, 3);     //小数点后
        LCD_Write_String(72, 3, "Kg")  ;
}
注意传感器电压是5V,主函数开始while(1)之前调用 HX711_Init();  Get_Maopi();

作者: ljinli    时间: 2016-7-26 17:03
樱月樱诗 发表于 2016-7-26 15:47
有,开源吧。
/*******************************************************

大神你这个是有两个的采集吧。谢谢大神。

作者: ljinli    时间: 2016-7-26 18:21
樱月樱诗 发表于 2016-7-26 15:47
有,开源吧。
/*******************************************************

试了一下可以用。但是数据一直在跳动。求大神。滤波后效果也不是很好。
有什么好的建议吗

作者: 樱月樱诗    时间: 2016-7-27 08:30
ljinli 发表于 2016-7-26 18:21
试了一下可以用。但是数据一直在跳动。求大神。滤波后效果也不是很好。
有什么好的建议吗

数据不会跳,不滤波都不会跳。跳检查你的电压必须是5V,不能是3.3V

作者: 樱月樱诗    时间: 2016-7-27 08:33
ljinli 发表于 2016-7-26 18:21
试了一下可以用。但是数据一直在跳动。求大神。滤波后效果也不是很好。
有什么好的建议吗

是的。两个写法一样的。直接是从我前面电赛里面抽出来的。滤波其实不用加的。只是为了精度才加的





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2