From a2230e764a26e3263460ae4e65ce9a7514cfd503 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Thu, 27 Jun 2024 16:27:13 +0800 Subject: [PATCH] ---- additional file for WS --- Core/Inc/sts_weight_scale.h | 63 +++++++++++ Core/Src/sts_weight_scale.c | 217 ++++++++++++++++++++++++++++++++++++ 2 files changed, 280 insertions(+) create mode 100644 Core/Inc/sts_weight_scale.h create mode 100644 Core/Src/sts_weight_scale.c diff --git a/Core/Inc/sts_weight_scale.h b/Core/Inc/sts_weight_scale.h new file mode 100644 index 0000000..2223e8b --- /dev/null +++ b/Core/Inc/sts_weight_scale.h @@ -0,0 +1,63 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file yunhorn_sts_weight_scale.h * + * @author Yunhorn (r) Technology Limited Application Team * + * @brief Yunhorn (r) SmarToilets (r) Product configuration file. * + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 Yunhorn Technology Limited. + * Copyright (c) 2024 Shenzhen Yunhorn Technology Co., Ltd. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + + +#ifndef YUNHORN_STS_WEIGHT_SCALE_H_ +#define YUNHORN_STS_WEIGHT_SCALE_H_ +#include "main.h" +#include "sys_app.h" + + + +typedef struct +{ + uint32_t weight_scale_value; + float pressure; /*!< in mbar */ + float temperature; /*!< in degC */ + float humidity; /*!< in % */ + int32_t latitude; /*!< latitude converted to binary */ + int32_t longitude; /*!< longitude converted to binary */ + int16_t altitudeGps; /*!< in m */ + int16_t altitudeBar; /*!< in m * 10 */ + /**more may be added*/ + /* USER CODE BEGIN sensor_t */ + + /* USER CODE END sensor_t */ +} sts_sensor_t; + + + +void sts_weight_scale_init(void); +void sts_weight_scale(sts_sensor_t *sensor_data); +void HX711_Init(void); +void Init_HX711pin(void); +uint32_t HX711_Read(void); +void Get_GrossWeight(void); +void Get_NetWeight(void); + +void delay_init(void); +void delay_ms(uint16_t nms); +void delay_us(uint32_t nus); + + + + +#endif /* YUNHORN_STS_WEIGHT_SCALE_H_ */ diff --git a/Core/Src/sts_weight_scale.c b/Core/Src/sts_weight_scale.c new file mode 100644 index 0000000..bdee0a7 --- /dev/null +++ b/Core/Src/sts_weight_scale.c @@ -0,0 +1,217 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file yunhorn_sts_weight_scale.c * + * @author Yunhorn (r) Technology Limited Application Team * + * @brief Yunhorn (r) SmarToilets (r) Product configuration file. * + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 Yunhorn Technology Limited. + * Copyright (c) 2024 Shenzhen Yunhorn Technology Co., Ltd. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +#include "sts_weight_scale.h" + +uint32_t HX711_Buffer; +volatile uint32_t gross_weight; +int32_t net_weight; +uint8_t Flag_Error; +volatile uint32_t last_net_weight=0; +volatile sts_sensor_t sts_sensor_data; +void sts_weight_scale_init(void) +{ + HX711_Init(); + Get_GrossWeight(); + HAL_Delay(500); + Get_GrossWeight(); +} + +void sts_weight_scale(sts_sensor_t *sts_sensor_data) +{ + + //while(1) + { + Get_NetWeight(); + APP_LOG(TS_OFF, VLEVEL_M, "Net Weight = %d g \r\n", net_weight); + sts_sensor_data->weight_scale_value=net_weight; + + last_net_weight = net_weight; + if (((last_net_weight - net_weight) > 100) && (net_weight > 100)) // re-calibrate + { + Get_GrossWeight(); + HAL_Delay(100); + Get_GrossWeight(); + //HAL_Delay(2000); + Get_NetWeight(); + } + //HAL_Delay(2000); + + } +} + +/************************************************************************************ + +*************************************************************************************/ + + +uint8_t Flag_Error = 0; + +//校准参数 +//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。 +//当发现测试出来的重量偏大时,增加该数值。 +//如果测试出来的重量偏小时,减小改数值。 +//该值可以为小数 +//#define GapValue 106.5 +#define GapValue 903.2 // for 1kg bar + +void HX711_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + __HAL_RCC_GPIOA_CLK_ENABLE(); + + GPIO_InitStruct.Pin = HX711_SCK_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(HX711_SCK_PORT, &GPIO_InitStruct); + + //HX711_DOUT + GPIO_InitStruct.Pin = HX711_DOUT_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(HX711_DOUT_PORT, &GPIO_InitStruct); + + HAL_GPIO_WritePin(HX711_SCK_PORT, HX711_SCK_PIN, GPIO_PIN_RESET); + +} + +//**************************************************** +//读取HX711 +//**************************************************** +uint32_t HX711_Read(void) //增益128 +{ + uint32_t count; + uint8_t i; + //HX711_DOUT=1; + HAL_GPIO_WritePin(HX711_DOUT_PORT, HX711_DOUT_PIN, GPIO_PIN_SET); + + delay_us(1); + //HX711_SCK=0; + HAL_GPIO_WritePin(HX711_SCK_PORT, HX711_SCK_PIN, GPIO_PIN_RESET); + + count=0; + + //while(HX711_DOUT); + while(HAL_GPIO_ReadPin(HX711_DOUT_PORT, HX711_DOUT_PIN)==GPIO_PIN_SET); + + for(i=0;i<24;i++) + { + //HX711_SCK=1; + HAL_GPIO_WritePin(HX711_SCK_PORT, HX711_SCK_PIN, GPIO_PIN_SET); + + count=count<<1; + delay_us(1); + + //HX711_SCK=0; + HAL_GPIO_WritePin(HX711_SCK_PORT, HX711_SCK_PIN, GPIO_PIN_RESET); + + //if(HX711_DOUT) + if (HAL_GPIO_ReadPin(HX711_DOUT_PORT, HX711_DOUT_PIN)==GPIO_PIN_SET) + count++; + + delay_us(1); + } + //HX711_SCK=1; + HAL_GPIO_WritePin(HX711_SCK_PORT, HX711_SCK_PIN, GPIO_PIN_SET); + count=count^0x800000;//第25个脉冲下降沿来时,转换数据 + + delay_us(1); + + //HX711_SCK=0; + HAL_GPIO_WritePin(HX711_SCK_PORT, HX711_SCK_PIN, GPIO_PIN_RESET); + + return(count); +} + +//**************************************************** +//Get Gross Weight +//**************************************************** +void Get_GrossWeight(void) +{ + gross_weight = HX711_Read(); + APP_LOG(TS_OFF, VLEVEL_M, "\r\n ##### Gross Weight =%d <<<<<< \r\n",gross_weight); +} + +//**************************************************** +//Weight Scale +//**************************************************** +void Get_NetWeight(void) +{ + HX711_Buffer = HX711_Read(); + + if(HX711_Buffer > gross_weight) + { + net_weight = HX711_Buffer; + net_weight = net_weight - gross_weight; //获取实物的AD采样数值。 + + net_weight = (int32_t)((float)net_weight/GapValue); //计算实物的实际重量 + //因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。 + //当发现测试出来的重量偏大时,增加该数值。 + + APP_LOG(TS_OFF, VLEVEL_M, "\r\n ##### Net Weight =%d \r\n", net_weight);//如果测试出来的重量偏小时,减小改数值。 + } +} + + +//延时nus +//nus为要延时的us数. +static uint8_t fac_us=0;//us延时倍乘数 +static uint16_t fac_ms=0;//ms延时倍乘数 + + +void delay_us(uint32_t nus) +{ + fac_us=SystemCoreClock/8000000; //为系统时钟的1/8 + uint32_t temp; + SysTick->LOAD=nus*fac_us; //时间加载 + SysTick->VAL=0x00; //清空计数器 + SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 + do + { + temp=SysTick->CTRL; + } + while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 //bit16置一说明时间到,跳出循环 + SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器 + SysTick->VAL =0X00; //清空计数器 +} +//延时nms +//注意nms的范围 +//SysTick->LOAD为24位寄存器,所以,最大延时为: +//nms<=0xffffff*8*1000/SYSCLK +//SYSCLK单位为Hz,nms单位为ms +//对72M条件下,nms<=1864 +void delay_ms(uint16_t nms) +{ + fac_us=SystemCoreClock/8000000; //为系统时钟的1/8 + fac_ms=(uint16_t)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数 + uint32_t temp; + SysTick->LOAD=(uint32_t)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) + SysTick->VAL =0x00; //清空计数器 + SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 + do + { + temp=SysTick->CTRL; + } + while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 + SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器 + SysTick->VAL =0X00; //清空计数器 +}