网站建设总结与心得体会,网络团队建设,wordpress轻拟物主题,软件网站开发平台目录
原理图#xff1a;
引脚介绍#xff1a;
HX711介绍工作原理:
程序讲解#xff1a;
整套工程#xff1a;
发送的代码工程#xff0c;与博客的不一致#xff0c;如果编译有报错请按照报错和博客进行修改
原理图#xff1a; 引脚介绍#xff1a;
VCC和GND引…目录
原理图
引脚介绍
HX711介绍工作原理:
程序讲解
整套工程
发送的代码工程与博客的不一致如果编译有报错请按照报错和博客进行修改
原理图 引脚介绍
VCC和GND引脚分别为HX711芯片的电源输入端口。
VCC引脚是连接到5V或3.3V的正电源GND引脚是连接到地的负电源。
DOUT是HX711芯片的数据输出端口它输出经过A/D转换处理后的24位数据。
SCK是HX711芯片的时钟输入端口用于控制A/D转换的时钟。
后两个用于接单片机的GPIO口 HX711介绍工作原理:
HX711传感器由一个二进制模数转换器ADC和一个放大器组成。ADC可以将模拟信号转换为数字信号而放大器可以扩大信号的幅度以便更精确地测量。在称重应用中HX711传感器可以通过应变量来测量物体的质量。
应变量是由当物体受到压力时会发生应变的特殊材料制成的。将应变量粘贴到测量物体的表面当物体受到压力并伸展时应变量也会发生变化。压力越大应变量的变化也越大。
HX711压力传感器的工作原理基于万用表电桥原理利用压力传感器的阻值变化来实现重量的测量。
具体的工作流程如下 通过引脚A和A-接入压力传感器。在未加载的情况下两个引脚之间的电阻为R1。 在HX711芯片中使用一个基准电压通常为VCC/2来作为压力传感器电桥电路的中心点。 当压力传感器开始承受载荷时电桥电路会产生一个微小的电压差。 这个电压差通过A和A-引脚输入到HX711芯片中并经过内置的差分放大器放大。 放大之后的信号被送到24位的A/D转换器中进行数字化处理并通过DOUT引脚输出。 PD_SCK引脚则是用于通过时钟信号来同步转换器的输出数据。 最终通过对输入信号的放大和数字化处理HX711芯片可以输出重量数据。 程序讲解
1.HX711初始化
void Init_HX711pin(void)//初始化
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PF端口时钟//HX711_SCKGPIO_InitStructure.GPIO_Pin GPIO_Pin_0; // 端口配置GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOB, GPIO_InitStructure); //根据设定参数初始化GPIOB//HX711_DOUTGPIO_InitStructure.GPIO_Pin GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;//输入上拉GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_0); //初始化设置为0
}
2.读取HX711
u32 HX711_Read(void) //增益128
{unsigned long count; unsigned char i; HX711_DOUT1; delay_us(1);HX711_SCK0; count0; while(HX711_DOUT); for(i0;i24;i){ HX711_SCK1; countcount1; delay_us(1);HX711_SCK0; if(HX711_DOUT)count; delay_us(1);} HX711_SCK1; countcount^0x800000;//第25个脉冲下降沿来时转换数据delay_us(1);HX711_SCK0; return(count);
}
解释讲解
函数中定义了三个变量count、i和一个延时值。其中count是一个无符号长整型变量用于存储从HX711获取的数据。i是一个无符号字符型变量用于循环计数。delay_us(1)表示延时1微秒用于确保时序的准确性。
然后函数通过设置HX711_DOUT和HX711_SCK的电平使HX711传感器进入读取状态。
接下来函数使用while语句来等待DOUT的第一个脉冲到来。当DOUT为高电平时表示HX711传感器还没有准备好此时需要等待。当DOUT为低电平时表示HX711传感器已经准备好可以开始读取数据了。
然后函数使用一个for循环来读取HX711传感器的24个数据位。在每个时钟周期中函数将SCK设为高电平然后将count左移一位。如果此时DOUT为高电平则表示在该时钟周期内HX711传感器向count的当前位中写入了1此时需要将count的最低位设为1。如果此时DOUT为低电平则表示在该时钟周期内HX711传感器向count的当前位中写入了0此时可以不用进行操作。最后函数将SCK设为低电平并延时一个周期。
读取完24个数据位后此时count变量中存储着24位的数据。此时需要将count的最高位设为1以便扩展到32位。这可以通过将count异或0x800000来实现。
最后函数将SCK设为高电平并延时一个周期然后将SCK设为低电平。该函数返回count变量作为结果即为从HX711传感器读取到的数据。
增益数值不同意味着循环的次数不同【增益128-循环24次增益32-循环25次增益64循环26次】 3.称重
void Get_Weight(void)
{HX711_Buffer HX711_Read();if(HX711_Buffer Weight_Maopi) {Weight_Shiwu HX711_Buffer;Weight_Shiwu Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。Weight_Shiwu (s32)((float)Weight_Shiwu/GapValue)-478; //计算实物的实际重量//因为不同的传感器特性曲线不一样因此每一个传感器需要矫正这里的GapValue这个除数。//当发现测试出来的重量偏大时增加该数值。//如果测试出来的重量偏小时减小改数值。}
}
至于为什么要在最后的减去478因为我在测试的时候发现原始数据是478要去皮就是减478
温馨提示压力传感器上面不能有东西否则初始状态以有东西为0的初始态。举个例子水瓶放到传感器上启动单片机这样传感器以有水瓶的状态为初始状态若我把水拿开则显示是负数
整套工程
HX711.C
/*************************************************************************************************************************************************************************/
#include HX711.h
#include delay.hu32 HX711_Buffer;
u32 Weight_Maopi;
s32 Weight_Shiwu;
u8 Flag_Error 0;float P1;
float P_; //对应公式中的p
float X0;
float X_; //X
float K0;
float Q0.01;//噪声
//float R0.2; //R如果很大更相信预测值那么传感器反应就会迟钝反之相反
float R0.5;
float distance0;
float distance10;
float KLM(float Z)
{X_X0;P_PQ;KP_/(P_R);XX_K*(Z-X_);PP_-K*P_;return X;
}//校准参数
//因为不同的传感器特性曲线不是很一致因此每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时增加该数值。
//如果测试出来的重量偏小时减小改数值。
//该值可以为小数
#define GapValue 106.5void Init_HX711pin(void)//初始化
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PF端口时钟//HX711_SCKGPIO_InitStructure.GPIO_Pin GPIO_Pin_0; // 端口配置GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOB, GPIO_InitStructure); //根据设定参数初始化GPIOB//HX711_DOUTGPIO_InitStructure.GPIO_Pin GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;//输入上拉GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_0); //初始化设置为0
}//****************************************************
//读取HX711
//****************************************************
u32 HX711_Read(void) //增益128
{unsigned long count; unsigned char i; HX711_DOUT1; delay_us(1);HX711_SCK0; count0; while(HX711_DOUT); for(i0;i24;i){ HX711_SCK1; countcount1; delay_us(1);HX711_SCK0; if(HX711_DOUT)count; delay_us(1);} HX711_SCK1; countcount^0x800000;//第25个脉冲下降沿来时转换数据delay_us(1);HX711_SCK0; return(count);
}//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi(void)
{Weight_Maopi HX711_Read();
} //****************************************************
//称重
//****************************************************
void Get_Weight(void)
{HX711_Buffer HX711_Read();if(HX711_Buffer Weight_Maopi) {Weight_Shiwu HX711_Buffer;Weight_Shiwu Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。Weight_Shiwu (s32)((float)Weight_Shiwu/GapValue)-478; //计算实物的实际重量//因为不同的传感器特性曲线不一样因此每一个传感器需要矫正这里的GapValue这个除数。//当发现测试出来的重量偏大时增加该数值。//如果测试出来的重量偏小时减小改数值。Weight_ShiwuKLM(Weight_Shiwu);}
}文中用到了卡尔曼滤波减少了数值的波动 HX711.H
#ifndef __HX711_H
#define __HX711_H#include sys.h#define HX711_SCK PBout(0)// PB0
#define HX711_DOUT PBin(1)// PB1extern void Init_HX711pin(void);
extern u32 HX711_Read(void);
extern void Get_Maopi(void);
extern void Get_Weight(void);extern u32 HX711_Buffer;
extern u32 Weight_Maopi;
extern s32 Weight_Shiwu;
extern u8 Flag_Error;#endif
main
/*************************************************************************************************************************************************************************/
#include stm32f10x.h
#include delay.h
#include HX711.h
#include usart.h
#include OLED.Hint main(void)
{ Init_HX711pin();delay_init();NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级2位响应优先级uart_init(9600); //串口初始化为9600Get_Maopi(); //称毛皮重量delay_ms(1000);delay_ms(1000);Get_Maopi(); //重新获取毛皮重量while(1){Get_Weight();printf(净重量 %d g\r\n,Weight_Shiwu); //打印 delay_ms(100);}
}
展示 需要工程文件的麻烦您点赞、收藏、关注留下邮箱即可
MSP432P401R版本HX711压力传感器学习二MSP432P401R版_三马分享家的博客-CSDN博客