打印
[产品应用]

【CW32L031CxTx StartKit评估板测评】电子秤

[复制链接]
227|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lulugl|  楼主 | 2023-10-7 17:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。
本次硬件电路主要是基于单片机CW32L031为核心的控制单元实现数据的处理,采用压力传感器对数据进行采集,电子秤专用24位AD转换芯片HX711对传感器采集到的模拟量进行AD转换,转换后的数据送到单片机进行处理显示,数据显示由OLED液晶实现。
1、HX711我采用成品的设计套件,原理图如下:

2、OLED采用SSD1306 128*64的显示,采用硬件I2C驱动。接口原理图为:

3、为电子秤增加去皮的功能,我们采用了开发板上的KEY1,按键原理图为:

4、代码编写
HX711数据采集部分代码:
HX711.c
/************************************************************************************
*************************************************************************************/
#include "hx711.h"
#include "stdio.h"
#include "main.h"
uint32_t HX711_Buffer;
uint32_t Weight_Maopi;
int32_t Weight_Shiwu;
unsigned char Weight_buffer[10];
uint8_t Flag_Error = 0;
//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
#define GapValue 212.5
void delay_1us(void)
{
  __NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
}
void Init_HX711pin(void)
{
        __RCC_GPIOB_CLK_ENABLE();
        GPIO_InitTypeDef GPIO_InitStructure;
        //HX711_SCK
        GPIO_InitStructure.Pins = GPIO_PIN_9;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.Pins = GPIO_PIN_8;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
        GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
        GPIO_WritePin(CW_GPIOB,GPIO_PIN_9,0);                                        //初始化设置为0
}
//****************************************************
//读取HX711
//****************************************************
uint32_t HX711_Read(void)        //增益128
{
unsigned long count;
unsigned char i;
//HX711_DOUT=1;
CW_GPIOB->ODR_f.PIN8 = 1;
CW_GPIOB->ODR_f.PIN9 = 0;
while(HX711_DOUT);
for(i=0;i<24;i++)
{
//HX711_SCK=1;
CW_GPIOB->ODR_f.PIN9 = 1;
count=count<<1;
delay_1us();
CW_GPIOB->ODR_f.PIN9 = 0;
if(HX711_DOUT)
count++;
delay_1us();
}
  CW_GPIOB->ODR_f.PIN9 = 1;;
count=count^0x800000;//第25个脉冲下降沿来时,转换数据
delay_1us();
CW_GPIOB->ODR_f.PIN9 = 0;  
return(count);
}
//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi(void)
{
        Weight_Maopi = HX711_Read();        
}
//****************************************************
//称重
//****************************************************
void Get_Weight(void)
{
        HX711_Buffer = HX711_Read();
        if(HX711_Buffer > Weight_Maopi)                        
        {
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi;          //获取实物的AD采样数值。
Weight_Shiwu = (int32_t)((float)Weight_Shiwu/GapValue);    //计算实物的实际重量
//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
sprintf(Weight_buffer, "%6dg", Weight_Shiwu);                                                                                                                                //当发现测试出来的重量偏大时,增加该数值。
        }
}
HX711.h:
#ifndef __HX711_H
#define __HX711_H
#include "main.h"
#include "cw32l031_gpio.h"
#include "cw32L031_rcc.h"
//PB09 SCK
//PB08 DOUT
#define HX711_SCK  CW_GPIOB->ODR_f.PIN9
#define HX711_DOUT GPIO_ReadPin(CW_GPIOB, GPIO_PIN_8)
extern void Init_HX711pin(void);
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 int32_t Weight_Shiwu;
extern unsigned char Weight_buffer[10];
extern uint8_t Flag_Error;
#endif
去皮按键采用中断输入来实现。主要是配置按键与中断函数的实现:
//按键初始化
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
  __RCC_GPIOA_CLK_ENABLE();    // 使能GPIO的配置时钟
__disable_irq();
  NVIC_EnableIRQ(GPIOA_IRQn); //便能GPIOA中断
  __enable_irq();
GPIO_InitStruct.IT =  GPIO_IT_FALLING;  //下降沿触发
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;  //配置为中断上拉输入
  GPIO_InitStruct.Pins = GPIO_PIN_2;
  GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
}
//中断回调函数
void GPIOA_IRQHandlerCallback(void)
{
    if (CW_GPIOA->ISR_f.PIN2)
    {
        CW_GPIOA->ICR_f.PIN2 = 0; // 清中断标志位
        Get_Maopi();            // 重新去皮。
    }
}
效果图如下:

100g法码较准:

项目小结:
CW32L031CxTx StartKit 评估板为用户提供一种经济且灵活的方式使用 芯片构建系统原型。 可进行性能、功耗、功能等各方面快速验证。该开发板提供了丰富的例程,方便开发板快速搭建好开发环境。
视频链接:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

712

帖子

9

粉丝