自学内容网 自学内容网

STM32F407接HX711称重传感器

在许多嵌入式项目中,如智能家居、物流管理等,都需要用到精确的重量测量功能。STM32F407作为一款高性能的微控制器,搭配HX711称重传感器,可以轻松实现这一需求。本文将详细介绍如何将STM32F407与HX711称重传感器进行连接和编程,以实现重量数据的采集和显示。

一、硬件准备

STM32F407开发板 :作为主控芯片,负责数据处理和通信。
HX711称重传感器模块:用于将重量信号转换为数字信号。
RS232打印 :用于显示重量数据,方便直观读取。
杜邦线 :用于连接各个模块。
电源适配器 :为开发板和传感器模块供电。

二、硬件连接

1、连接STM32F407与HX711
2、将STM32F407的PE7引脚连接至HX711的SCK引脚。
3、将STM32F407的PE5引脚连接至HX711的DT引脚。
4、将STM32F407的5V和GND引脚分别连接至HX711的VCC和GND引脚。
5、将RS232接电脑

三、软件设计

  1. 开发环境搭建
    软件工具:使用Keil uVision5进行项目开发和编译。
    固件库:导入STM32HAL库。
  2. 驱动代码编写
hx711.c
#include "stm32f4xx_hal.h"
#include "hx711.h"
#include "./usart/bsp_debug_usart.h"


// HX711引脚定义
#define HX711_SCK_PIN GPIO_PIN_7
#define HX711_SCK_PORT GPIOE
#define HX711_DT_PIN GPIO_PIN_5
#define HX711_DT_PORT GPIOE

#define W_SCK(X) HAL_GPIO_WritePin(HX711_SCK_PORT, HX711_SCK_PIN, (GPIO_PinState)(X))
#define R_DT HAL_GPIO_ReadPin(HX711_DT_PORT, HX711_DT_PIN)

// 校准参数
#define GapValue 3125.91

uint32_t HX711_Buffer;
uint32_t Weight_Maopi;
int32_t Weight_Zhengshu;

void HX711_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 使能GPIOB时钟
    __HAL_RCC_GPIOE_CLK_ENABLE();

    // SCK引脚配置
    GPIO_InitStruct.Pin = HX711_SCK_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(HX711_SCK_PORT, &GPIO_InitStruct);

    // DT引脚配置
    GPIO_InitStruct.Pin = HX711_DT_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(HX711_DT_PORT, &GPIO_InitStruct);

    // 初始化SCK为高电平
    W_SCK(1);
}

unsigned long HX711_Read(void) {
    unsigned long Count = 0;
    uint8_t i;

    W_SCK(0);  // 拉低SCK
    while (R_DT);  // 等待DT拉低

    for (i = 0; i < 24; i++) {
        W_SCK(1);
//Delay_us(2); 
        Count = Count << 1;  // 左移一位
        W_SCK(0);
        if (R_DT) {
            Count++;
        }
    }

    W_SCK(1);
    Count = Count ^ 0x800000;  // 最高位取反
    W_SCK(0);

    return Count;
}

void Get_Maopi(void) {
    Weight_Maopi = HX711_Read();
//printf("Weight_Maopi=%d\n",Weight_Maopi);
}

unsigned long HX711_Read_Stable(uint8_t readTimes) {
    unsigned long sum = 0;
    uint8_t i;

    for (i = 0; i < readTimes; i++) {
        sum += HX711_Read();
    }
    return (sum / readTimes);
}

unsigned long Get_Weight(void) {
float Weight_tmp;
int32_t xiaoshu;
    HX711_Buffer = HX711_Read_Stable(10);
    
    if (HX711_Buffer > Weight_Maopi) {
        Weight_Zhengshu = HX711_Buffer - Weight_Maopi;
        Weight_Zhengshu = (int32_t)(((float)Weight_Zhengshu / GapValue) * 20 * 0.8 / 1.082);
        return Weight_Zhengshu;
    } else {
        return 0;
    }
}
hx711.h
#ifndef __HX711_H
#define __HX711_H
#include "stm32f4xx_hal.h" 

unsigned long HX711_Read(void);
void HX711_Init(void);
void Get_Maopi(void);
unsigned long Get_Weight(void);
#endif

四、效果如下:

在这里插入图片描述
接线在这里插入图片描述
在这里插入图片描述


原文地址:https://blog.csdn.net/weixin_41700578/article/details/145188755

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!