使用STM32控制HX711称重传感器

本项目使用主控stm32f103c8t6(最小系统核心板),称重模块hx711,串口打印到电脑端显示数值。

 

这个传感器内部是一组半桥应变片,使用方法可以有以下三种:

1、使用一只传感器配合外接电阻组成全桥测量,量程为一个传感器的量程:50kg。对外接电阻要求较高。

2、使用二只传感器组成全桥测量,量程为两只传感器的量程之和:50kgx2=100kg

3、使用四只传感器组成全桥测量,量程为四只传感器的量程之和:50kgx4=200kg

我的称重组成是4个应变片半桥传感器串联组成一个桥路,供电后输出一组模拟电压信号。

连线: 黑线连信号正    白(黄)线连信号负   红线连 电源 。这里的V+连接E+,V-连接E-,Vout+连A+,Vout-连A-;hx711的另一边vcc接5V,gnd连gnd,SCK 和DT连自己设的引脚

桥结构图如下:

 

单片机称重AD模块-HX711

       这个模块采用24位高精度的A/D转换器芯片hx711,是一款专为高精度电子称而设计的,具有两路模拟通道输入,内部集成128倍增益可编程放大器。输入电路可配置为提供桥压的电桥式(如压力、称重)传感器模式,是一款理想的高精度、低成本采样前端模块;

代码:

void Init_HX711pin(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    //HX711_SCK
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;          //端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //IO口速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);             //根据设定参数初始化GPIOC

    //HX711_DOUT
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      //输入上拉
    GPIO_Init(GPIOB, & GPIO_InitStructure);

    //GPIO_SetBits(GPIOB, GPIO_Pin_1);   //初始化设置为0
}

u32 HX711_Read(void)                   //增益128
{
    u32 count;
    u8 i;
    HX711_DOUT = 1;
    delay_us(1);
    HX711_SCK = 0;
    count = 0;
    while (HX711_DOUT);
    for (i = 0; i < 24; i++)
    {
        HX711_SCK = 1;
        count = count << 1;
        delay_us(1);
        HX711_SCK = 0;
        if (HX711_DOUT)
            count++;
        delay_us(1);
    }
    HX711_SCK = 1;
    count=count^0x800000;//第25个脉冲下降沿来时,转换数据
    delay_us(1);
    HX711_SCK = 0;
    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采样数值。
		printf("实物ad值是:%d\r\n",Weight_Shiwu);
	
		Weight_Shiwu = (s32)((float)Weight_Shiwu/GapValue-0.0383); 	//计算实物的实际重量
																		//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
																		//当发现测试出来的重量偏大时,增加该数值。
																		//如果测试出来的重量偏小时,减小改数值。
	}
}
int main(void)
{	
  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  /* 初始化RGB彩灯 */
  LED_GPIO_Config();
	delay_init();
  
  /* 初始化USART 配置模式为 115200 8-N-1 */
  USART_Config();
	Init_HX711pin();               //HX711初始化
	Get_Maopi();
	delay_ms(1000);
	Get_Maopi();
	printf("皮毛值是:%d\r\n",Weight_Maopi);
  while(1)
	{	
		LED0 =~LED0; 
		 Get_Weight();
		delay_ms(4000);
		weight=(float)Weight_Shiwu/1000;
		printf("重量值是:%0.3fkg\r\n",weight);
		printf("ad值是:%d\r\n",Weight_Shiwu);
		 
	}	
}

 代码中GapValue要自己根据传感器值的不同来调试,我是用一个5kg和一个20kg的重物来测的,因为ad值的重物的重量是有着线性关系的,相当于解一个二元一次方程组,提供二元一次方程计算器。    2个重物之间的值尽量大一些,准度会稍微准一点。

 程序源码和电子秤HX711AD模块资料 :

链接:https://pan.baidu.com/s/1-tT6jRfDV8SAvVVFOBH8qg 
提取码:dd11

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32控制HX711称重传感器

发表评论