一、硬件需求
- STM32F030K6T6
- 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、管脚说明

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