基于STM32的电子秤制作

一、硬件需求

  1. STM32F030K6T6
  2. HX711

二、HX711说明

1、时钟选择

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

2、串口通讯

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

二、管脚以及连接

1、管脚说明

HX711管脚说明(SOP-16L 封装)

2、整体电路连接说明

整体电路设计

三、代码实现

1、初始化主控IO

void HX711_Init(void)
{
    GPIO_InitTypeDef hx711_gpio_struct;
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    //SCK
    hx711_gpio_struct.Mode=GPIO_MODE_OUTPUT_PP;
    hx711_gpio_struct.Pin=GPIO_PIN_7;
    hx711_gpio_struct.Speed=GPIO_SPEED_HIGH;
    HAL_GPIO_Init(GPIOA,&hx711_gpio_struct);
    
    //DOUT
    hx711_gpio_struct.Mode=GPIO_MODE_INPUT;
    hx711_gpio_struct.Pin=GPIO_PIN_0;
    hx711_gpio_struct.Pull=GPIO_PULLUP;
    HAL_GPIO_Init(GPIOB,&hx711_gpio_struct);
    
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
    
}

2、读取HX711数据驱动编写

unsigned long HX711_Read(void)
{
    unsigned long Count;
    unsigned char i;
    HX711_SCK(0);
    Count=0;
    while(HX711_DOUT);
    for (i=0;i<24;i++)
    {
        HX711_SCK(1);
        Count=Count<<1;
        HX711_SCK(0);
        if(HX711_DOUT) 
            Count++;
    }
    HX711_SCK(1);
    Count=Count^0x800000; //最高位取反,其他位不变
    HX711_SCK(0);
    return(Count);
}

3、获取重量代码(校准)

void Get_Maopi(void)
{
    Weight_Maopi = HX711_Read();
}

void Get_Weight(void)
{
    HX711_Buffer = HX711_Read();
    if(HX711_Buffer > Weight_Maopi)
    {
        Weight_Zhengshu = HX711_Buffer;
        Weight_Zhengshu = Weight_Zhengshu - Weight_Maopi;     //获取实物的AD采样数值。
        Weight_Zhengshu = (int32_t)(((float)Weight_Zhengshu/GapValue)*10/1.082);     //weight(x)=x*5kg/2^24
        Weight_tmp = ((float)Weight_Zhengshu/GapValue)*10/1.082;
        Weight_tmp -= Weight_Zhengshu;
        if(Weight_tmp<0)
        {
            Weight_tmp = -Weight_tmp;
        }
        Weight_xiaoshu = (int32_t)(Weight_tmp*10);
    }
}

注:需要根据传感器调整上面校准因子(1.082)的值

4、主函数

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    OLED_Init();    //OLED初始化
    HX711_Init();
    Get_Maopi();    //称毛皮重量
    HAL_Delay(2000);
    Get_Maopi();    //重新获取毛皮重量
    
    OLED_ShowString(2,1,"Weight:");
    OLED_ShowString(2,13,".");
    OLED_ShowString(2,16,"g");
    
    while (1)
    {
        Get_Weight();
        OLED_ShowSignedNum(2,8,Weight_Zhengshu,4);
        OLED_ShowNum(2,14,Weight_xiaoshu,1);
        OLED_ShowSignedNum(3,8,Weight_xiaoshu,6);
    }
}

注:OLED相关函数就不写了

四、代码开源

链接:百度网盘 请输入提取码

提取码:8ufm

  • 27
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值