电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动

这篇具有很好参考价值的文章主要介绍了电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实物照片

stm32 hx711,stm32,单片机,嵌入式硬件,压力传感器,HX711

模块简介

HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的32增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

模块特点

  • 两路可选择差分输入
  • 片内低噪声可编程放大器,可选增益为64 和128
  • 片内稳压电路可直接向外部传感器和芯片内A/D 转换器提供电源
  • 片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
  • 上电自动复位电路
  • 简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程
  • 可选择10Hz 或80Hz 的输出数据速率
  • 同步抑制50Hz 和60Hz 的电源干扰
  • 耗电量(含稳压电源电路):典型工作电流:<1.7mA, 断电电流:<1μA
  • 工作电压范围:2.6 ~ 5.5V
  • 工作温度范围:-20 ~ +85℃
  • 16 管脚的SOP-16 封装

硬件

HX711 内部方框图
stm32 hx711,stm32,单片机,嵌入式硬件,压力传感器,HX711

在protues中 如下图
stm32 hx711,stm32,单片机,嵌入式硬件,压力传感器,HX711
管脚说明如下图:
stm32 hx711,stm32,单片机,嵌入式硬件,压力传感器,HX711

stm32 hx711,stm32,单片机,嵌入式硬件,压力传感器,HX711

模拟输入

通道A模拟差分输入可直接与桥式传感器的差分输出相接。由于桥式传感器输出的信号较小,为了充分利用A/D转换器的输入动态范围,该通道的可编程增益较大,为128或64。这些增益所对应的满量程差分输入电压分别±20mV或±40mV。通道B为固定的32增益,所对应的满量程差分输入电压为±80mV。通道B应用于包括电池在内的系统参数检测。

供电电源

数字电源(DVDD)应使用与MCU芯片相同的的数字供电电源。HX711芯片内的稳压电路可同时向A/D转换器和外部传感器提供模拟电源。稳压电源的供电电压(VSUP)可与数字电源(DVDD)相同。稳压电源的输出电压值(VAVDD)由外部分压电阻R1、R2 和芯片的输出参考电压 VBG决定(图1),VAVDD=VBG(R1+R2)/R2。应选择该输出电压比稳压电源的输入电压(VSUP)低至少100mV。如果不使用芯片内的稳压电路,管脚VSUP和管脚AVDD应相连,并接到电压为2.6~5.5V的低噪声模拟电源。管脚VBG上不需要外接电容,管脚VFB应接地,管脚BASE 为无连接。

时钟选择

如果将管脚XI接地,HX711将自动选择使用内部时钟振荡器,并自动关闭外部时钟输入和晶振的相关电路。这种情况下,典型输出数据速率为10Hz或80Hz。如果需要准确的输出数据速率,可将外部输入时钟通过一个20pF的隔直电容连接到XI管脚上,或将晶振连接到XI和XO管脚上。这种情况下,芯片内的时钟振荡器电路会自动关闭,晶振时钟或外部输入时钟电路被采用。此时,若晶振频率为11.0592MHz,输出数据速率为准确的10Hz或80Hz。输出数据速率与晶振频率以上述关系按比例增加或减少。使用外部输入时钟时,外部时钟信号不一定需要为方波。可将MCU芯片的晶振输出管脚上的时钟信号通过20pF的隔直电容连接到XI管脚上,作为外部时钟输入。外部时钟输入信号的幅值可低至150mV。

串口通讯

串口通讯线由管脚PD_SCK和DOUT组成,用来输出数据,选择输入通道和增益。当数据输出管脚DOUT为高电平时,表明A/D转换器还未准备好输出数据,此时串口时钟输入信号PD_SCK应为低电平。当DOUT从高电平变低电平后,PD_SCK应输入25至27个不等的时钟脉冲。其中第一个时钟脉冲的上升沿将读出输出24位数据的最高位(MSB),直至第24个时钟脉冲完成,24位输出数据从最高位至最低位逐位输出完成。第25至27个时钟脉冲用来选择下一次A/D转换的输入通道和增益。

复位和断电

当芯片上电时,芯片内的上电自动复位电路会使芯片自动复位。管脚PD_SCK输入用来控制HX711的断电。当PD_SCK为低电平时,芯片处于正常工作状态。

如果PD_SCK从低电平变高电平并保持在高电平超过60μs,HX711 即进入断电状态

如使用片内稳压电源电路,断电时,外部传感器和片内A/D 转换器会被同时断电。当PD_SCK 重新回到低电平时,芯片会自动复位后进入正常工作状态。芯片从复位或断电状态进入正常工作状态后,通道A和增益128会被自动选择作为第一次A/D转换的输入通道和增益。随后的输入通道和增益选择由PD_SCK的脉冲数决定,参见串口通讯一节。芯片从复位或断电状态进入正常工作状态后,A/D 转换器需要4个数据输出周期才能稳定。DOUT在4个数据输出周期后才会从高电平变低电平,输出有效数据。

HX711相关部分的 PCB 设计

HX711相关部分的 PCB 板参考设计线路图
stm32 hx711,stm32,单片机,嵌入式硬件,压力传感器,HX711

软件驱动

串口通讯线由管脚PD_SCK和DOUT组成,用来输出数据,选择输入通道和增益。当数据输出管脚DOUT为高电平时,表明A/D转换器还未准备好输出数据,此时串口时钟输入信号PD_SCK应为低电平。当DOUT从高电平变低电平后,PD_SCK应输入25至27个不等的时钟脉冲。其中第一个时钟脉冲的上升沿将读出输出24位数据的最高位(MSB),直至第24个时钟脉冲完成,24位输出数据从最高位至最低位逐位输出完成。第25至27个时钟脉冲用来选择下一次A/D转换的输入通道和增益。
stm32 hx711,stm32,单片机,嵌入式硬件,压力传感器,HX711
PD_SCK的输入时钟脉冲数不应少于25或多于27,否则会造成串口通讯错误。当A/D转换器的输入通道或增益改变时,A/D转换器需要4个数据输出周期才能稳定。DOUT在4个数据输出周期后才会从高电平变低电平,输出有效数据。

数据输出,输入通道和增益选择时序图
stm32 hx711,stm32,单片机,嵌入式硬件,压力传感器,HX711

通过测得的AD值,转为重力原理如下

假设重力为 A Kg,(x<5Kg),测量出来的 AD 值为 y
传感器输出,发送给 AD 模块儿的电压为 A Kg * 4.3mV / 5Kg = 0.86A mV
经过 128 倍增益后为 128 * 0.86A = 110.08AmV
转换为 24bit 数字信号为 110.08A mV * 224 / 4.3V = 429496.7296A
所以 y = 429496.7296A
因此得出 A = y / 429496.7296
所以得出程序中计算公式

Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/429.5)文章来源地址https://www.toymoban.com/news/detail-630363.html

C51软件代码

sbit ADDO = P1^5;
sbit ADSK = P0^0;
unsigned long ReadCount(void)
{
unsigned long Count;
unsigned char i;
ADSK=0;
//使能AD(PD_SCK 置低)
Count=0;
while(ADDO);
//AD转换未结束则等待,否则开始读取
for (i=0;i<24;i++)
{
ADSK=1;
//PD_SCK 置高(发送脉冲)
Count=Count<<1; //下降沿来时变量Count左移一位,右侧补零
ADSK=0;
//PD_SCK 置低
if(ADDO) Count++;
}
ADSK=1;
Count=Count^0x800000;//第25个脉冲下降沿来时,转换数据
ADSK=0;
return(Count);
}

STM32软件代码




#define  DWT_CYCCNT  *(volatile unsigned int *)0xE0001004
#define  DWT_CR      *(volatile unsigned int *)0xE0001000
#define  DEM_CR      *(volatile unsigned int *)0xE000EDFC
#define  DBGMCU_CR   *(volatile unsigned int *)0xE0042004

#define  DEM_CR_TRCENA               (1 << 24)
#define  DWT_CR_CYCCNTENA            (1 <<  0)

#define		WEIGHT_CAP_NUM							1		//重量采集数量 滤波使用

uint8_t		ucWeightCapCompleteFlag= 0;     //重量采集完成标志
uint8_t		ucWeightCapCount 			 = 0;			//重量采集计数
int32_t   ilWeightRawDataAddToal = 0;			//重量AD数据累计
int16_t		iWeightRawData = 0;							//重量AD数据


/*
*********************************************************************************************************
*	函 数 名: bsp_InitDWT
*	功能说明: 初始化DWT. 
*********************************************************************************************************
*/
void bsp_InitDWT(void)
{
	DEM_CR         |= (unsigned int)DEM_CR_TRCENA;   /* Enable Cortex-M4's DWT CYCCNT reg.  */
	DWT_CYCCNT      = (unsigned int)0u;
	DWT_CR         |= (unsigned int)DWT_CR_CYCCNTENA;
}

/*
*********************************************************************************************************
*	函 数 名: DWT_DelayUS
*	功能说明: 这里的延时采用CPU的内部计数实现,32位计数器
*             	OSSchedLock(&err);
*				bsp_DelayUS(5);
*				OSSchedUnlock(&err); 根据实际情况看看是否需要加调度锁或选择关中断
*	形    参: _ulDelayTime  延迟长度,单位1 us
*********************************************************************************************************
*/
void DWT_DelayUS(uint32_t _ulDelayTime)
{
  uint32_t tCnt, tDelayCnt;
	uint32_t tStart;
		
	tStart = DWT_CYCCNT;                                     /* 刚进入时的计数器值 */
	tCnt = 0;
	tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000);	 /* 需要的节拍数 */ 		      

	while(tCnt < tDelayCnt)
	{
		tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */	
	}
}


/*
*********************************************************************************************************
*	函 数 名: HX711_GPIOInit
*	功能说明: 重量芯片HX711 GPIO初始化
*********************************************************************************************************
*/
void  HX711_GPIOInit(void)
{

	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//使能PORTA

 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;				      //PA7 推挽输出 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;				      //PA6 推挽输出 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		  	//上拉输入
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}


/*
*********************************************************************************************************
*	函 数 名: HX711_Init
*	功能说明: 重量芯片HX711初始化
*********************************************************************************************************
*/

void HX711_Init(void)
{
	CH376_SPI_SCS = 1;					//CH376 片选失能	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, DISABLE);	
	SPI_Cmd(SPI1, DISABLE);			//禁止SPI
	HX711_GPIOInit();						//初始化IO
}


/*
*********************************************************************************************************
*	函 数 名: Task_WeightCap
*	功能说明: 重量采集任务
*********************************************************************************************************
*/
void Task_WeightCap(void)
{
	uint32_t	count = 0;
	int16_t		raw_data = 0;
	uint8_t		i;	
	HX711_Init();						//HX711重新初始化
	
	
	ADSK = 0;
	count= 0;
	while(ADDO);
	
	for(i=0; i<24; i++)
	{	
		ADSK = 1;
		DWT_DelayUS(1);
		count = count << 1;
		ADSK = 0;
		DWT_DelayUS(1);

		if(ADDO) 
		{
			count++;		
		}
	}
	
	//第25个时钟信号
	ADSK=1;
	DWT_DelayUS(1);
	ADSK=0;
	DWT_DelayUS(1);

	raw_data = count >> 8;
	
	ilWeightRawDataAddToal = raw_data + ilWeightRawDataAddToal;
	ucWeightCapCount++;
	
	if(ucWeightCapCount == WEIGHT_CAP_NUM)
	{
		ucWeightCapCount 				= 0;
		iWeightRawData = ilWeightRawDataAddToal / WEIGHT_CAP_NUM;
		ilWeightRawDataAddToal  = 0;
		ucWeightCapCompleteFlag = 1;
	}

}

/*
*********************************************************************************************************
*	函 数 名: GetWeightRawData
*	功能说明: 得到重量的原始值 
*	形    参: iRawData 原始值
*	返 回 值: 1 已经得到 0 没有得到
*********************************************************************************************************
*/
uint8_t  GetWeightRawData(int16_t *iRawData)
{
		if(ucWeightCapCompleteFlag == 1)
		{
			*iRawData = iWeightRawData;
			ucWeightCapCompleteFlag = 0;
			return 1;
		}
		
		return 0;
}

到了这里,关于电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HX711压力传感器(基于STM32F103C8T6)

    HX711模块是我们目前比较常见的压力传感器模块,主要的作用是用来做压力检测,重量监测等等。博主的这篇博文主要实现功能为,在对重量或者压力进行监测的同时,可以累加或者清零数值,在此基础上就可以对比如饮水量进行统计等等。 HX711模块是市面上比较常见的模块

    2024年02月11日
    浏览(58)
  • 称重传感器的24位A/D模块——HX711

    HX711是一种专门用于称重传感器的24位A/D模块。该模块可以将接收到的模拟信号转换为数字值,以便进行后续的处理和数据分析。下面是HX711计算公式: 首先,HX711采样得到的原始值是一个带符号的24位整数,它由以下3个字节组成:DOUT[23:0]、PD_SCK和GAIN。 通过向HX711模块发送脉

    2024年02月11日
    浏览(48)
  • stm32+hx711+称重传感器

    本项目使用主控stm32f103c8t6(最小系统核心板),称重模块hx711,串口打印到电脑端显示数值。   这个传感器内部是一组半桥应变片,使用方法可以有以下三种: 1、使用一只传感器配合外接电阻组成全桥测量,量程为一个传感器的量程:50kg。对外接电阻要求较高。 2、使用二只传

    2024年02月08日
    浏览(49)
  • 物联网AI MicroPython传感器学习 之 HX711称重传感器

    学物联网,来万物简单IoT物联网!! 下图是一款量程为5kg的称重传感器,采用悬臂梁方式安装。传感器主体结构是一个开孔金属条,金属条上下表面各贴有两个应变电阻,当金属条受力发生变形时时,应变电阻的阻值也会随之发生变化。电子秤的原理便是根据测量到的电阻变

    2024年02月03日
    浏览(73)
  • Arduino开发之如何连接压力传感器模块?

      在利用Arduino开发过程中,若需知道设备能感知到受到外部按压,设备可以通过压力传感器模块来感知周围环境。本文在【Arduino如何进行开发?】基础上,借鉴现有网络资料,阐述Arduino如何连接压力传感器模块。      压力传感器模块为电阻式薄膜压力传感器模块。

    2023年04月15日
    浏览(58)
  • 51单片机电子秤(HX711模块 + LCD1602)

    (简单易懂) 1.---------------序 2.HX711测重模块 3.LCD1602显示模块 4.电子秤整体实现原理 5.模块升级去皮与还原 6.源代码 零.先来一个效果展示 这里可以看到3个20g砝码加上去显示60g的重量 5个20g砝码加上去显示100g的重量,精度是比较准的 一.首先考虑如何把这样一个项目设计出来

    2023年04月08日
    浏览(44)
  • LabVIEW多通道压力传感器实时动态检测

    LabVIEW多通道压力传感器实时动态检测 介绍了一种基于LabVIEW的多通道压力传感器实时动态检测系统,解决压阻式压力传感器温度补偿过程的复杂度,提高测量的准确性。通过自动轮询检测方法,结合硬件检测模型和多通道检测系统设计,本系统能够实时、准确地测量压阻式压

    2024年02月22日
    浏览(47)
  • 基于LabVIEW的压力传感器测试系统

    现在各类压力传感器已广泛应用于各种工业自控环境,对压力传感器的研究 及应用,既可以体现一个国家的科技发展水平,又可以提升国家的综合国力,还 可以在丰富、方便和智能化人们的生活方面做出重要的贡献。而针对不同仪器组 成计算机测试辅助系统也显得颇为重要

    2024年01月20日
    浏览(47)
  • 【hx717称重传感器采集芯片】双输入通道高精度 24 位模/数(A/D)转换器芯片(附芯片手册)

    以下是官方文档的简介 HX717A/B 采用了海芯科技专利技术,是一款专为高精度电子计量仪表而设计的 24 位 A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优

    2024年02月17日
    浏览(64)
  • 误差放大器的作用(自动调节压差传感器的压力)

    提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档   文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入

    2024年02月05日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包