HX711—称重模块

1、简介

        HX711 采用了海芯科技集成电路专利技术, 是一款专为高精度电子秤而设计的 24 位 A/D 转 换器芯片。

2、原理图

PCB参考设计原理图 

3、模块驱动代码(固件库)

数据读取代码分析

HX711信号读取时序

  1. 初始化

    • 将 PD_SCK(Power Down / Serial Clock)引脚设置为低电平。
    • 将 DOUT 引脚设置为输入模式。
  2. 等待 DOUT 变为高电平

    • 等待 DOUT 引脚变为高电平,这表明HX711准备好发送数据。
  3. 读取24位数据

    • 每个 PD_SCK 的上升沿,HX711 会在 DOUT 引脚上输出一位数据。
    • 每个 PD_SCK 的下降沿,数据线保持稳定,此时可以读取 DOUT 上的数据。
  4. 读取第25位(符号位)

    • 在读取完24位数据之后,通过 PD_SCK 的一次上升沿读取第25位数据(符号位)。
uint32_t HX711_ReadData(void)                          //读数据
{uint8_t i;uint32_t value = 0;    						//接收HX711采集的AD值HX711_W_DOUT(1); 									//初始DOUT为高电平HX711_W_PD_SCK(0); 							  //初始PD_SCK为低电平Delay_us(1);HX711_R_DOUT();                   //DOUT转换为输入while(HX711_R_DOUT());           //等待DOUT引脚变为高电平Delay_us(1);for(i=0;i<24;i++)                 //按照HX711时序接收数据{HX711_W_PD_SCK(1);              // PD_SCK置高,发送脉冲 value = value << 1;              //下降沿来时变量左移一位,右侧补零,Delay_us(1);HX711_W_PD_SCK(0);               // PD_SCK置低if(HX711_R_DOUT())               //读取一位数据,如果高电平,加一,低电平不变。value++;Delay_us(1);}HX711_W_PD_SCK(1);               //最后一个脉冲,增益为128value = value^0x800000;          //第25个脉冲转换数据,24位AD转换,最高位为符号位,其余为有效位Delay_us(1);HX711_W_PD_SCK(0);Delay_us(1);return value;
}

 4、驱动代码

HX711.c

#include "stm32f10x.h"                  // Device header
#include "HX711.h"
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"float	BiaoDing=384.7;       			//标定系数,根据自己的传感器调节
uint32_t pi_weight,weight;
uint32_t buffer[MEDIAN_LEN];   	        //中值滤波的数据缓存
int medleng = 0;          	            
uint32_t   num;					                  //数据对比大小中间变量
uint8_t Pi_flag=0;void HX711_GPIO_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //时钟线推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //数据线浮空输入     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}void HX711_W_PD_SCK(uint8_t BitValue)                  //写时钟线
{	GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)BitValue);
}void HX711_W_DOUT(uint8_t BitValue)                    //写数据线,开始时,需要拉高DOUT电平
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_WriteBit(GPIOA, GPIO_Pin_2, (BitAction)BitValue);
}uint8_t HX711_R_DOUT(void)                             //读数据
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);
}void HX711_Reset(void)                                 // 传感器复位,去皮
{HX711_W_PD_SCK(1);                                   //拉高,延时60usDelay_us(60);
}uint32_t HX711_ReadData(void)                          //读数据
{uint8_t i;uint32_t value = 0;    						//接收HX711采集的AD值HX711_W_DOUT(1); 									//初始DOUT为高电平HX711_W_PD_SCK(0); 							  //初始PD_SCK为低电平Delay_us(1);HX711_R_DOUT();                   //DOUT转换为输入while(HX711_R_DOUT());           //等待DOUT引脚变为高电平Delay_us(1);for(i=0;i<24;i++)                 //按照HX711时序接收数据{HX711_W_PD_SCK(1);              // PD_SCK置高,发送脉冲 value = value << 1;              //下降沿来时变量左移一位,右侧补零,Delay_us(1);HX711_W_PD_SCK(0);               // PD_SCK置低if(HX711_R_DOUT())               //读取一位数据,如果高电平,加一,低电平不变。value++;Delay_us(1);}HX711_W_PD_SCK(1);               //最后一个脉冲,增益为128value = value^0x800000;          //第25个脉冲转换数据,24位AD转换,最高位为符号位,其余为有效位Delay_us(1);HX711_W_PD_SCK(0);Delay_us(1);return value;
}uint32_t Get_Pi(void)                           //皮重函数  每次去皮需要再次重置一下
{                                               //中值滤波参数,冒泡排序法uint32_t   buffer[MEDIAN_LEN];              //储存数组uint32_t HX711_dat,pi_weight,num;           				uint8_t i,medleng = 0;for(i=0;i<MEDIAN_LEN;i++){HX711_dat=HX711_ReadData();	        	   if(medleng == 0)                           //第1个元素,直接放入,不需要排序{ buffer[0] = HX711_dat;medleng = 1; }else                            	           //中值滤波,取中间值,冒泡排序法{  for(i = 0; i < medleng; i ++)  {if( buffer[i] > HX711_dat) 	          { num = HX711_dat; HX711_dat = buffer[i]; buffer[i] = num;}}buffer[medleng] = HX711_dat;          	medleng++;}		if(medleng >= MEDIAN_LEN) 		           {HX711_dat = buffer[MEDIAN];	            //取排序好的中间值,medleng = 0; }}pi_weight=HX711_dat;      return pi_weight;
}uint32_t Get_Weight(uint32_t pi_weight)	               //称重函数
{uint32_t get_weight;uint32_t weight;get_weight=HX711_ReadData();		            //HX711数据采集函数if(get_weight>pi_weight){get_weight=HX711_ReadData();			                  //重新采集HX711数据					 														   weight=(uint32_t)(((float)(get_weight-pi_weight))/BiaoDing);//修改标定系数,根据传感器不同if(weight==11164458)weight=0;     //干扰值校准为0}else 				weight=0;return weight;
}void Show_weight(void)
{weight=Get_Weight(pi_weight);if(medleng == 0)                         //中值滤波,取中间值,冒泡排序法{ buffer[0] = weight; medleng = 1; }else                            	       {  for(int i = 0; i < medleng; i ++)  {if( buffer[i] > weight) 	           { num = weight; weight = buffer[i]; buffer[i] = num;}}buffer[medleng] = weight; 	            medleng++;}		if(medleng >= MEDIAN_LEN) 		             {weight = buffer[MEDIAN];	                //取中间值medleng = 0; OLED_ShowNum(1,6,weight,4);Delay_ms(500);}}

HX711.h 

#ifndef __HX711_H
#define __HX711_H#define MEDIAN_LEN       5  			              //中值滤波的滤波长度,一般取奇数
#define MEDIAN           3  			              //中值在滤波数组中的位置extern uint32_t buffer[];
extern int medleng;
extern uint32_t num,weight;
extern uint32_t pi_weight;void HX711_GPIO_Init(void);
void HX711_W_PD_SCK(uint8_t BitValue);
void HX711_W_DOUT(uint8_t BitValue);
void HX711_Reset(void);
uint8_t HX711_R_DOUT(void);
uint32_t HX711_ReadData(void);
uint32_t Get_Pi(void);
uint32_t Get_Weight(uint32_t pi_weight);
void Show_weight(void);#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include <stdio.h>
#include "HX711.h"int main(void)
{OLED_Init();Serial_Init();HX711_GPIO_Init();    //初始化HX711OLED_ShowChinese(1,1,4);OLED_ShowChinese(1,2,5);OLED_ShowString(1, 10, "g");OLED_ShowString(1, 5, ":");pi_weight=Get_Pi();  //获取一次皮重while (1){Show_weight();    //获取并显示重量·}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

COCO数据集缺失文件补全方法

COCO2017数据集图片文件缺失自动补全方法 一、前言 本文代码是以目标检测&#xff08;object detection&#xff09;和实例分割&#xff08;instance segmentation&#xff09;任务的标签文件为例&#xff0c;即instances_train/val/test2017.json文件。 其他任务的标签文件…

原生冻结进程分析(U)

一、概要 1.定义&#xff1a; 当应用切换到后台并且没有其他活动时&#xff0c;系统会在一定时间内通过状态判断&#xff0c;将进程 ID 迁移到冻结的 cgroup 节点上&#xff0c;实现冻结 CACHE 应用。这项功能可以减少活跃缓存应用在后台存在时所消耗的 CPU 资源&#xff0c;从…

armv8 memory model概述

概述 在armv8 架构中&#xff0c;它引入了更多的维度来描述内存模型&#xff0c;从而在此基础上进行硬件优化(但其中一些并未被主流的软件所接受)&#xff0c;在此做一些简单的整理&#xff0c;更多信息请参考 Arm spec 以及 AMBA 协议。下文主要是对Memory 和 Device 两大类的…

getopts(1) builtin command

文章目录 0.背景1.简介2.格式3.选项4.返回值5.特殊变量6.示例参考文献 0.背景 在执行 Shell 脚本时&#xff0c;可以像运行应用程序一样传入相应的参数&#xff0c;在脚本内部根据传入的参数内容执行对应的操作。 Shell 脚本中可以通过$1...$N形式的符号来引用传入的参数&…

基于nodejs+vue+uniapp的摄影竞赛小程序

开发语言&#xff1a;Nodejs框架&#xff1a;expressuniapp数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;VS Code 系统展示 管理员登录 管理员主界面 用户管理 书籍分类管理 书籍信息管理 系统管理…

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core flyfish 从一段代码的解释开始 template <typename T> class GlobalTensor { public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑} };语法的说明&#xff0c;主要用于…

fl studio 21/24破解版(水果音乐制作软件24) v24.1.1.4285附安装教程

fl studio 21/24破解版&#xff0c;又被国内网友称之为水果音乐制作软件24&#xff0c;是Image-Line公司成立26周年而发布的一个版本&#xff0c;是目前互联网上最优秀的完整的软件音乐制作环境或数字音频工作站&#xff0c;包含了编排&#xff0c;录制&#xff0c;编辑&#x…

在Ubuntu 20.04上安装MySQL的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 MySQL 是一个开源的数据库管理系统&#xff0c;通常作为流行的 LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xf…

Cmake之1.0版本重要特性及用法实例(八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

GoodSync Business - 企业级服务器同步与备份工具

现在越来越多公司会搭建服务器&#xff0c;或自建文件共享中心。那么如何才能实现对这些终端的高效管理、安全备份&#xff0c;以保障企业数据的安全呢&#xff1f; GoodSync Business 就是一款企业服务器同步与备份工具&#xff0c;适用于 Win / Mac 工作站&#xff0c;以及 …

Kafka【二】关于消费者组(Consumer Group)、分区(partition)和副本(replica)的理解

【1】概述 Apache Kafka 是一个分布式流处理平台&#xff0c;它允许你发布和订阅记录流&#xff0c;存储记录流&#xff0c;并且可以对这些记录流进行处理。在 Kafka 中&#xff0c;消息被发布到特定的主题&#xff08;topic&#xff09;&#xff0c;然后由消费者&#xff08;…

57-java csrf防御方案

CSRF&#xff08;跨站请求伪造&#xff09;是一种攻击手段&#xff0c;它迫使已登录用户的web应用在没有用户知情的情况下&#xff0c;发送未经授权的请求。在Java中&#xff0c;有多种方法可以用来防御CSRF攻击。 使用同步令牌&#xff08;Token&#xff09;&#xff1a; 同…

Datawhale X 李宏毅苹果书 AI夏令营 Task2打卡

线性模型&#xff08;Linear model&#xff09; 通常模型的修改来自于对问题的理解&#xff0c;即领域知识 基本定义&#xff1a;把输入特征x乘上一个权重&#xff0c;再加上一个偏置就可以得到预测的结果。 优点&#xff1a;简单易理解&#xff0c;可理解性好&#xff08;权重…

C++可调用对象

C11中有一个重要的概念&#xff0c;叫可调用对象&#xff0c; 可调用对象用途广泛&#xff0c;比如作为线程的执行对象&#xff0c;或者在使用一些基于范围的模版函数时&#xff08; sort()、all_of()、find_if()&#xff09;&#xff0c;常常需要我们传入一个可调用对象&…

算法基础-位运算

>> &#xff08;右移运算&#xff09; x >> y&#xff1a;表示将x的二进制值右移y位。 正数是直接右移y位&#xff0c;则高位&#xff08;最左边&#xff09;补y个0。 负数是求补码&#xff0c;然后右移y位&#xff0c;最高位补y个1&#xff0c;再求反码&#xff…

Gamma基线估算

在使用Gamma软件处理DInSAR数据时&#xff0c;基线估算是一个非常关键的步骤。Gamma软件提供了一系列工具来计算和处理基线信息&#xff0c;以确保干涉图像的准确性和后续形变分析的精度。以下是Gamma软件中基线估算的详细步骤&#xff1a; 1. 初始化基线计算 (base_init) 首…

更适合编写股票盯盘软件或者量化交易平台的语言是Python还是C

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…

集成电路学习:什么是DAC数模转换器

DAC&#xff1a;数模转换器 DAC&#xff0c;全称Digital-to-Analog Converter&#xff0c;即数模转换器&#xff0c;是一种电子设备或电路&#xff0c;用于将数字信号转换为相应的模拟信号。在现代电子系统中&#xff0c;DAC扮演着至关重要的角色&#xff0c;它实现了数字电路与…

如何在UE5.4中重新定位动画?

动画在游戏和电影制作中扮演着至关重要的角色&#xff0c;而在虚幻引擎5.4&#xff08;UE5.4&#xff09;这一强大的实时3D创作平台中&#xff0c;重新定位动画的能力更是将创意表达推向了新的高度。本文将引导您探索UE5.4中重新定位动画的技巧&#xff0c;确保您的动画作品不仅…

Unity | 基础知识

装箱和拆箱&#xff1a; 获取对方的类型&#xff1a; GetType通过打点调用 as进行类型转换 运用Convert进行类型转换&#xff1a; 二维数组的定义 结构体类型 不同名称空间来调用&#xff1a;