赞
踩
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传感器由一个二进制模数转换器(ADC)和一个放大器组成。ADC可以将模拟信号转换为数字信号,而放大器可以扩大信号的幅度,以便更精确地测量。在称重应用中,HX711传感器可以通过应变量来测量物体的质量。
应变量是由当物体受到压力时会发生应变的特殊材料制成的。将应变量粘贴到测量物体的表面,当物体受到压力并伸展时,应变量也会发生变化。压力越大,应变量的变化也越大。
HX711压力传感器的工作原理基于万用表电桥原理,利用压力传感器的阻值变化来实现重量的测量。
注意:数据线DT配置为输入模式
注意:时钟线SCK配置为输出模式
默认配置,不需要改变
-
- 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 */
- }

- /************************************************************************************
-
- *************************************************************************************/
- #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);
- }
-
- }

- #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

- /* 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 */

提示:本文章学到的一个主要知识点写时序
通讯逻辑是先将数据线电平拉高,代表数据开始传输,等待接收完数据后,数据线电平置低,数据传输结束。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。