一、模块
HX711 采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的 24 位 A/D 转换芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端 MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道 A 或通道 B,与其内部的低噪声可编程放大器相连。
引脚介绍:
VCC和GND引脚分别为HX711芯片的电源输入端口。
VCC引脚是连接到5V或3.3V的正电源,GND引脚是连接到地的负电源。
DOUT是HX711芯片的数据输出端口,它输出经过A/D转换处理后的24位数据。
SCK是HX711芯片的时钟输入端口,用于控制A/D转换的时钟。
HX711介绍工作原理:
HX711传感器由一个二进制模数转换器(ADC)和一个放大器组成。ADC可以将模拟信号转换为数字信号,而放大器可以扩大信号的幅度,以便更精确地测量。在称重应用中,HX711传感器可以通过应变量来测量物体的质量。
应变量是由当物体受到压力时会发生应变的特殊材料制成的。将应变量粘贴到测量物体的表面,当物体受到压力并伸展时,应变量也会发生变化。压力越大,应变量的变化也越大。
HX711压力传感器的工作原理基于万用表电桥原理,利用压力传感器的阻值变化来实现重量的测量。
二、CubeMX配置
1.时钟及sys
2.IO口
注意:数据线DT配置为输入模式
注意:时钟线SCK配置为输出模式
3.串口
默认配置,不需要改变
4.后续配置
三、程序
1.main.c
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
delay_init(72);
/* 延时初始化 */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Get_Weight();
Get_Maopi();
uint32_t a=0;
printf("净重量 = %d g\r\n",Weight_Shiwu); //打印
printf("初始重量 = %d g\r\n",Weight_Maopi); //打印
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
2.hx711.c
/************************************************************************************
*************************************************************************************/
#include "HX711.h"
#include "delay.h"
uint32_t HX711_Buffer;
uint32_t Weight_Maopi;
uint32_t Weight_Shiwu;
uint32_t Flag_Error = 0;
//卡尔曼滤波
float KalmanFilter(float inData)
{
static float prevData = 0; //先前数值
static float p = 10, q = 0.001, r = 0.001, kGain = 0; // q控制误差 r控制响应速度
p = p + q;
kGain = p / ( p + r ); //计算卡尔曼增益
inData = prevData + ( kGain * ( inData - prevData ) ); //计算本次滤波估计值
p = ( 1 - kGain ) * p; //更新测量方差
prevData = inData;
return inData; //返回滤波值
}
//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
#define GapValue 106.5
//****************************************************
//读取HX711
//****************************************************
uint32_t HX711_Read(uint8_t pulse) //增益128 PULSE 脉冲
{
uint32_t count =0;
uint8_t i;
HX720_CLK_L();
if(HAL_GPIO_ReadPin(DAT_GPIO_Port,DAT_Pin)==0)
{
for(i=0;i<24;i++)
{
HX720_CLK_H();
delay_us(1);
count=count<<1;
HX720_CLK_L();
delay_us(1);
if(HAL_GPIO_ReadPin(DAT_GPIO_Port,DAT_Pin)==1)
{
count++;
}
}
for(i=0;i<pulse-24;i++)
{
HX720_CLK_H();
delay_us(1);
HX720_CLK_L();
delay_us(1);
}
count=count^0x800000;//第25个脉冲下降沿来时,转换数据
}
// HX720_CLK_H();
// count=count^0x800000;//第25个脉冲下降沿来时,转换数据
// delay_us(1);
// HX720_CLK_H();
return(count);
}
//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi(void)
{
Weight_Maopi = HX711_Read(25);
Weight_Maopi=KalmanFilter(Weight_Maopi);
}
//****************************************************
//称重
//****************************************************
void Get_Weight(void)
{
HX711_Buffer = HX711_Read(25);
if(HX711_Buffer > Weight_Maopi)
{
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。
Weight_Shiwu = ((float)Weight_Shiwu/GapValue)-478; //计算实物的实际重量
//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
Weight_Shiwu=KalmanFilter(Weight_Shiwu);
}
}
3.hx711.h
#ifndef __HX711_H
#define __HX711_H
#include "main.h"
#include "gpio.h"
#define HX720_CLK_H() HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,GPIO_PIN_SET) //时钟线置高电平
#define HX720_CLK_L() HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,GPIO_PIN_RESET)//时钟线置低电平
extern uint32_t HX711_Read(void);
extern void Get_Maopi(void);
extern void Get_Weight(void);
extern uint32_t HX711_Buffer;
extern uint32_t Weight_Maopi;
extern uint32_t Weight_Shiwu;
extern uint32_t Flag_Error;
#endif
4.串口重定向
/* USER CODE BEGIN 1 */
#include <stdio.h>
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
/* USER CODE END 1 */
5.实验结果
总结
提示:本文章学到的一个主要知识点写时序
通讯逻辑是先将数据线电平拉高,代表数据开始传输,等待接收完数据后,数据线电平置低,数据传输结束。