找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2340|回复: 6
收起左侧

使用stm32读取HX711的压电式传感器程序 重量显示负数?

[复制链接]
ID:967636 发表于 2022-3-25 17:45 | 显示全部楼层 |阅读模式
      使用100g的砝码修正,使用紫色的hx711,50kg的压电式力传感器,在串口打印助手中,显示的重量是一个负数。使用的是正点的串口打印函数,和购买时51单片机的HX711程序修改的。
不知道是延时函数的问题,还是这个计算公式的问题Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue);

#include "sys.h"
#include "usart.h"
#include "HX711.h"
#include "delay.h"
float Weight = 0;

int main(void)
{
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init();                //延时初始化
        uart_init(115200);        //串口初始化波特率为115200
        Init_Hx711();
        delay_ms(2000);
        Get_Maopi();
        delay_ms(100);
        
        while(1)
        {
        Weight = Get_Weight();
        Weight = (float)Weight/1000.0f;
        printf("%0.3f kg \r\n",Weight);        //串口显示重量
        delay_ms(1000);
        }
}



/****
void delay_us(u32 nus)
{               
        u32 temp;                     
        SysTick->LOAD=nus*fac_us;                                         //时间加载                           
        SysTick->VAL=0x00;                                                //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数         
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
        SysTick->VAL =0X00;                                               //清空计数器         
}

****/

HX711主要函数
#include "HX711.h"
#include "delay.h"

long HX711_Buffer = 0;
long Weight_Maopi = 0;
long Weight_Shiwu = 0;

#define GapValue 71.5  /50kg的量程                                                                                                                                                
/*
可以在产生 VAVDD 和 AGND 电压,即 711 模块上的 E+ 和 E- 电压。该电压通过 VAVDD=VBG(R1 +R2 )/R2 计算。VBG 为模块儿基准电压 1.25v,R1 = 20K,R2 = 8.2K。 因此得出 VAVDD = 4.3V
因传感器线性斜率不同而定。每个传感器都要校准。如果传感器测量值偏大,则需改大该数值,若传感器测量值偏小,则需改小该数值。(不断修正8)

*/
#define HIGH 1
#define LOW  0
#define HX711_GROUP GPIOB


void digitalWrite(GPIO_TypeDef * GPIO,int pin,int value)
{
        if(value==HIGH)//set 1
        {
                GPIO_SetBits(GPIO,pin);
        }
        if(value==LOW)//reset 0
        {
                GPIO_ResetBits(GPIO,pin);
        }
}

int digitalRead(GPIO_TypeDef * GPIO,int pin)
{
        return GPIO_ReadInputDataBit(GPIO,pin);
}

//****************************************************
//初始化HX711
//****************************************************

void Init_Hx711()
{


  GPIO_InitTypeDef  GPIO_InitStructure;
         
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PB端口时钟
        //pd_sck
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                 //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB0
GPIO_SetBits(GPIOB,GPIO_Pin_0);                                                 //PB0输出高
//DOUT
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                             // 端口配置, 推挽输出
         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING;//输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
GPIO_Init(GPIOE, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_1);                                                  //PB1 输出高
}


//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi()
{
        Weight_Maopi = HX711_Read();               
}

//****************************************************
//称重
//****************************************************
long Get_Weight()
{
        HX711_Buffer = HX711_Read();
        Weight_Shiwu = HX711_Buffer;
        Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                                //获取实物的AD采样数值。
        Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue);         
        return Weight_Shiwu;
}

//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)        //增益128
{
        unsigned long val = 0;
        unsigned char i = 0;

                GPIO_SetBits(GPIOB,GPIO_Pin_1);    //DOUT=1
                GPIO_ResetBits(GPIOB,GPIO_Pin_0);    //SCK=0
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1));//DOUT
        delay_us(1);   
        for(i=0;i<24;i++)
        {
                delay_us(100);
                GPIO_SetBits(GPIOB,GPIO_Pin_0);           //时钟高电平
                val=val<<1; //若DT位为左移一位
                delay_us(1);  
                GPIO_ResetBits(GPIOB,GPIO_Pin_0);           //时钟低电平
                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1))  
                        val++; //若DT位为高sck+1
                delay_us(1);
        }
        GPIO_SetBits(GPIOB,GPIO_Pin_0);
        val = val^0x800000;
        delay_us(1);
        GPIO_ResetBits(GPIOB,GPIO_Pin_0);
        delay_us(1);  
        return val;
}

回复

使用道具 举报

ID:94031 发表于 2022-3-26 13:29 | 显示全部楼层
把传感器信号输出两条线对调后再接上。
回复

使用道具 举报

ID:268826 发表于 2022-3-28 10:19 | 显示全部楼层
E+,E-接反了
回复

使用道具 举报

ID:967636 发表于 2022-3-28 10:32 | 显示全部楼层
xuyaqi 发表于 2022-3-26 13:29
把传感器信号输出两条线对调后再接上。

好像没啥用啊 不是这个问题吧
回复

使用道具 举报

ID:967636 发表于 2022-3-28 11:16 | 显示全部楼层
26.537]收←◆-0.101 kg

[11:16:27.539]收←◆-0.101 kg

[11:16:28.543]收←◆-0.101 kg

[11:16:29.547]收←◆-0.101 kg

[11:16:30.551]收←◆-0.102 kg
回复

使用道具 举报

ID:967636 发表于 2022-3-28 11:16 | 显示全部楼层
26.537]收←◆-0.101 kg

[11:16:27.539]收←◆-0.101 kg

[11:16:28.543]收←◆-0.101 kg

[11:16:29.547]收←◆-0.101 kg

[11:16:30.551]收←◆-0.102 kg
回复

使用道具 举报

ID:121859 发表于 2022-3-28 14:27 | 显示全部楼层
看看是不是去毛皮那里出问题了,要出现负数必然是去毛皮的重量大于了正常测重的重量所致。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表