013【GD32F470】HX711模块压力传感器套装 称重传感器 电子秤模块20KG教程(有完整工程代码)

2.19 HX711称重传感器

该模块采用24位高精度的A/D转换器芯片hx711,是一款专为高精度电子秤而设计的,具有两路模拟通道输入,内部集成128倍增益可编程放大器。输入电路可配置为提供桥压的电桥式(如压力、称重)传感器模式,是一款理想的高精度、低成本采样前端模块。

2.19.1 模块来源

资料下载链接:

【完整代码资料见:https://pan.quark.cn/s/4bde52447785

2.19.2 规格参数

工作电压:2.6V-5.5V
工作电流:100~1500uA
ADC精度:24位
输出方式: 串行输出
管脚数量:4 Pin
工作电流:100~1500uA
ADC精度:24位
输出方式: 串行输出
管脚数量:4 Pin

2.19.3 移植过程

我们的目标是在梁山派GD32F470上能够判断测量10Kg以内的称重。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。

2.19.3.1 查看资料

在这里插入图片描述

2.19.3.2 引脚选择

压力传感器模块立创·梁山派
VCC3V3
SCKPB8
DTPB9
GNDGND

在这里插入图片描述

2.19.3.3 移植至工程

移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_hx711.c与bsp_hx711.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件bsp_hx711.c中,编写如下代码。

/********************************************************************************
  * 文 件 名: bsp_hx711.c
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2022年04月25日
  * 功能介绍:          
  ******************************************************************************
  * 开发板官网:www.lckfb.com        
*********************************************************************************/

#include "bsp_hx711.h"
#include "bsp_usart.h"
#include "stdio.h"
#include "systick.h"



unsigned int HX711_Buffer;
unsigned int Weight_Maopi;
int Weight_Shiwu;
unsigned char Flag_Error = 0;

//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
#define GapValue 208.05


/******************************************************************
 * 函 数 名 称:HX711_GPIO_Init
 * 函 数 说 明:HX711的引脚初始化
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void HX711_GPIO_Init(void)
{
  /* 使能时钟 */
    rcu_periph_clock_enable(RCU_SCK);
        rcu_periph_clock_enable(RCU_DT);
    
        /* 配置SCK为输出模式 */
        gpio_mode_set(PORT_SCK,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_SCK);
        /* 配置为推挽输出 50MHZ */
        gpio_output_options_set(PORT_SCK,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_SCK);
        
        /* 配置DT为输出模式 */
        gpio_mode_set(PORT_DT,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_DT);
}

/******************************************************************
 * 函 数 名 称:HX711_Read
 * 函 数 说 明:读取HX711
 * 函 数 形 参:无
 * 函 数 返 回:读取到的值
 * 作       者:LC
 * 备       注:无
******************************************************************/
unsigned int HX711_Read(void)        //增益128
{
        unsigned long count; 
        unsigned char i; 
          DT(1);
        delay_us(1);
          SCK(0);
          count=0; 
          while(DT_GET()); 
          for(i=0;i<24;i++)
        { 
                  SCK(1);
                  count=count<<1; 
                delay_us(1);
                SCK(0);
                  if(DT_GET())
                        count++; 
                delay_us(1);
        } 
         SCK(1);
    count=count^0x800000;//第25个脉冲下降沿来时,转换数据
        delay_us(1);
        SCK(0);
        return(count);
}

/******************************************************************
 * 函 数 名 称:Get_Maopi
 * 函 数 说 明:测量初始重量
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:后续的重量都是以该初始重量为0值,因此在初始化时,秤上不要放任何东西
******************************************************************/
void Get_Maopi(void)
{
        Weight_Maopi = HX711_Read();        
} 
/******************************************************************
 * 函 数 名 称:Get_Weight
 * 函 数 说 明:称重
 * 函 数 形 参:无
 * 函 数 返 回:称重值,单位g
 * 作       者:LC
 * 备       注:无
******************************************************************/
float Get_Weight(void)
{
    float Weight=0;
        HX711_Buffer = HX711_Read();
        if(HX711_Buffer > Weight_Maopi)                        
        {
                Weight_Shiwu = HX711_Buffer - Weight_Maopi;                                //获取实物的AD采样数值。
        Weight = (float)Weight_Shiwu / GapValue;//计算实物的实际重量
        //因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
        //当发现测试出来的重量偏大时,增加该数值。
        //如果测试出来的重量偏小时,减小改数值。
        }
    return Weight;
}

在文件bsp_hx711.h中,编写如下代码。

#ifndef _BSP_HX711_H_
#define _BSP_HX711_H_

#include "gd32f4xx.h"

//端口移植
#define RCU_SCK RCU_GPIOB
#define PORT_SCK GPIOB
#define GPIO_SCK GPIO_PIN_8

#define RCU_DT RCU_GPIOB
#define PORT_DT GPIOB
#define GPIO_DT GPIO_PIN_9

//设置DT输出模式
#define DT_OUT()        gpio_mode_set(PORT_DT,GPIO_MODE_OUTPUT,GPIO_MODE_OUTPUT,GPIO_DT)
//设置DT输入模式
#define DT_IN()        gpio_mode_set(PORT_DT,GPIO_MODE_INPUT,GPIO_MODE_OUTPUT,GPIO_DT)
//获取DT引脚的电平变化
#define DT_GET()        gpio_input_bit_get(PORT_DT,GPIO_DT)
//DT与SCK输出
#define DT(x)          gpio_bit_write(PORT_DT,GPIO_DT, (x?SET:RESET))
#define SCK(x)          gpio_bit_write(PORT_SCK,GPIO_SCK, (x?SET:RESET))

void HX711_GPIO_Init(void);
float Get_Weight(void);
void Get_Maopi(void);
#endif

2.19.4 移植验证

在自己工程中的main主函数中,编写如下。

【完整代码资料见:https://pan.quark.cn/s/4bde52447785

移植现象:往秤上放一个200g的砝码,输出称重后的结果。
在这里插入图片描述
移植成功示例:
【完整代码资料见:https://pan.quark.cn/s/4bde52447785

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GD32F470单通道ADC正负电压采样代码可以参考以下步骤: 1. 配置ADC模块,包括时钟、采样时间等; 2. 配置ADC通道,选择采样的通道和采样模式(单次/连续); 3. 配置ADC触发源(软件/硬件触发); 4. 开启ADC; 5. 等待ADC采样完成; 6. 读取ADC采样结果,并进行转换。 下面是一个简单的示例代码,可以参考: ```c #include "gd32f4xx.h" void adc_config(void) { /* 使能 ADC 时钟 */ rcu_periph_clock_enable(RCU_ADC0); /* 配置 ADC 时钟分频和工作模式 */ adc_clock_config(ADC_ADCCK_PCLK2_DIV8, ADC_MODE_FREE); /* 配置 ADC 采样时间 */ adc_sample_time_config(ADC0, ADC_CHANNEL_0, ADC_SAMPLETIME_15); /* 配置 ADC 通道 */ adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_15); /* 配置 ADC 触发源为软件触发 */ adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC_EXTERNAL_TRIGGER_SOURCE_SOFTWARE); /* 配置 ADC 工作模式为单次转换模式 */ adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE); adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE); adc_special_function_config(ADC0, ADC_DISCONTINUOUS_MODE, DISABLE); /* 使能 ADC */ adc_enable(ADC0); } uint16_t adc_sample(void) { /* 开始 ADC 转换 */ adc_software_trigger_enable(ADC0, ADC_INSERTED_CHANNEL); /* 等待转换完成 */ while (SET != adc_flag_get(ADC0, ADC_FLAG_EOC)); /* 读取采样结果 */ return adc_regular_data_read(ADC0); } int main(void) { /* 初始化 GPIO 和 ADC */ // ... /* 配置 ADC */ adc_config(); while (1) { /* 进行采样 */ uint16_t result = adc_sample(); /* 转换采样结果 */ float voltage = (float)result * 3.3 / 4096; /* 处理采样结果 */ // ... } } ``` 相关问题: 1. GD32F470支持哪些ADC采样模式? 2. 如何配置GD32F470的ADC通道? 3. 如何使用硬件触发进行ADC转换?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值