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,转换成了无符号数更加好计算。

stm32使用HX711读电子秤的值_第1张图片
stm32使用HX711读电子秤的值_第2张图片

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

你可能感兴趣的:(stm32)