stm32使用HX711读电子秤的值

使用HX711变送器模块+5kg的传感器。


#define HX711_DATA  PEin(0)
#define HX711_SCK   PEout(1)



void HX711_init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_1);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}


uint8_t HX711_GetValue(uint32_t *value)
{
    int retry = 0;
    uint32_t ret = 0;

    HX711_SCK = 0;
    while (retry < 200)
    {
        delay_us(1);
        if (HX711_DATA == 0)
            break;
        else
            retry++;
    }
    if (retry == 200)  return 1;

    for (int i = 0; i < 24; i++)
    {
        HX711_SCK = 1;
        delay_us(1);
        ret = ret << 1;
        HX711_SCK = 0;
        ret |= HX711_DATA;
        delay_us(1);
    }

    HX711_SCK = 1;
    delay_us(1);
    *value = ret ^ 0x800000;
    //*value = ret;
    HX711_SCK = 0;
    delay_us(1);

    return 0;
}



int main(void)
{
    u16 t;
    u16 len;
    u16 times = 0;
    uint32_t value = 0;
    delay_init();            //延时函数初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);   //串口初始化为115200
    LED_Init();              //LED端口初始化
    KEY_Init();          //初始化与按键连接的硬件接口
    HX711_init();
    HX711_GetValue(&value);
    printf("0x%x\r\n", value);
    delay_ms(500);
    HX711_GetValue(&value);
    printf("0x%x\r\n", value);
    delay_ms(500);
    HX711_GetValue(&value);
    printf("0x%x\r\n", value);
    delay_ms(500);
    HX711_GetValue(&value);
    printf("0x%x\r\n", value);
    delay_ms(500);
    HX711_GetValue(&value);
    printf("0x%x\r\n", value);
    delay_ms(500);
    uint32_t zero = value;
    printf("0x%x\r\n", value);
    while (1)
    {
        if (HX711_GetValue(&value) == 0)
        {
            printf("0x%x\t%d\r\n", value, value - zero);
            if (value < zero) value = zero;
            uint32_t weight = (value - zero) / 430;
            weight = weight / 0.89;
            printf("%d\t\r\n", weight);
        }
        else
        {
            printf("read error\r\n");
        }
        delay_ms(1000);
    }
}

代码中的*value = ret^0x800000;相当于把传感器读到的值加了0x800000,即原来的差分读出来假设是-2.5V ~ +2.5V,现在变成了0V ~ 5V,转换成了无符号数更加好计算。

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

测量出来的重量uint32_t weight = (value - zero) / 430;,由于应变片工艺问题,可能其值并不等效于,最终通过砝码标定,得出重量:weight = weight / 0.89;

设计步骤如下: 1. 选择合适的HX711芯片。HX711是一款高精度、低成本的模拟-数字转换器(ADC)芯片,可用于电子秤、压力传感器等应用。它具有24位ADC分辨率,可以实现高精度的称重测量。 2. 选择合适的称重传感器。称重传感器可以根据不同的量程和精度来选择。常用的称重传感器有电阻式称重传感器和应变式称重传感器。根据具体需求选择合适的称重传感器。 3. 连接HX711芯片和称重传感器。HX711芯片有5个引脚,包括VCC、GND、DT、SCK和PD_SCK。其中VCC和GND是电源引脚,DT和SCK是数据传输引脚,PD_SCK是电源控制引脚。称重传感器一般有4个线,包括红色、白色、绿色和黑色。红色和黑色是电源线,白色和绿色是信号线。将称重传感器的信号线连接到HX711芯片的DT和SCK引脚上。 4. 编写程序使用STM32开发板,编写程序HX711芯片的输出数据,并将其转换为称重。可以使用定时器来控制HX711芯片的数据传输频率,以提高数据采集的稳定性和精度。将测量到的称重通过串口或LCD显示出来。 5. 调试和优化。进行实际测量时,需要进行校准,以提高称重的精度和准确性。可以使用已知质量的物体进行校准,将取到的称重与实际质量进行比较,调整程序中的系数以实现准确的测量。 以上是基于STM32HX711电子秤的设计步骤,希望能对你有所帮助。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值