锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

基于STM32设计的数字电子秤

时间:2022-07-22 11:00:00 传力悬臂梁传感器

1. 项目介绍

称重计量是当今社会活动中不可缺少的一部分,随着国际交流的发展,称重计量的国际统一越来越重要。

电子称重技术是现代称重测量和控制系统工程的重要基础之一。近年来,随着现代科学技术的进步,电子称重技术取得了快速的发展,电子秤在测量领域也发挥着越来越重要的作用。特别是商用电子衡器,具有精度高、反应灵敏、性能稳定、结构简单、环境适应性强、电子计算机结合方便、称重测量和过程控制自动化的特点,广泛应用于工商贸易、能源交通、冶金矿

电子秤的工作原理是通过称重传感器收集被测物体的重量,并将其转换为电压信号。输出电压信号通常很小,需要通过前端信号处理电路准确线性放大。放大后的模拟电压信号通过A/D转换电路转换成数字量,送入主控电路的单片机,然后由单片机控制OLED显示屏显示被测物体的重量。为了提高实际应用中数据采集的精度,并在传感器和A/D芯片之间加上信号调理电路。

采用当前项目STM32 称重模块 OLED实现了简单的电子秤项目,称重模块采用24位ADC芯片,精度高。实现称重、校准、去皮等功能。

硬件介绍:

MCU:STM32F103ZET6,只要是STM32F1X本系列工程代码通用。

称重模块: 淘宝购买的称重模块

OLED: SPI接口的0.96寸OLED中景园电子屏幕OLED屏。

完整工程下载地址: https://download.csdn.net/download/xiaolong1126626497/63993934

视频演示地址: https://live.csdn.net/v/182608

项目运行效果:

image-20211221160445064

image-20211221160459187

image-20211221160520611

2. 项目实现

2.1 称重传感器

称重传感器是一种压力传感器,也称为悬臂梁压力传感器。安装时需要一端固定,另一端受力。内部有四个应变电阻片,共同形成电桥。当受力端施加压力时,传感器外壳会变形,从而影响应变电阻片的电阻值。

下面是称重传感器的原理图:

image-20211221160603395

称重传感器实物图:

image-20211221160642622

用于称重传感器CS1237 作为一种转换芯片,用于将微小的电压信号转换为具有 24 位精度的数字信号。模块信号输入端可接受差分信号,内部有可编程操作放大器放大输入端的弱信号。模块内置的温度传感器可以粗略估计周围的温度。该模块可用于各种工业过程控制场合,如电子秤、血液计、智能变换器等。

CS1237中有1路ADC,集成1路差分输入,信号输入可以是差分输入信号AINP、AINN,它也可以是温度传感器的输出信号,由寄存器切换输入信号(ch_sel控制。

CS1237是采用2线SPI串行通信,通过SCLK和DRDY/DOUT可实现数据接收和功能配置。

实现代码如下:

#include  "ADC-CS1237.h"static  long  AD_Res_Last=0;                                    //上一轮ADC数值保存/*定义CS1237使用的GPIO口CLK PB14 时钟线OUT PB15 数据输出线*/void  CS1237_GPIO_INIT(void){       RCC->APB2ENR |=  0x01  <<  3;                              //打开PB口    GPIOB->CRH &=  0xF0FFFFFF;                            ///清零寄存器  GPIOB->CRH |=  0x03000000;                            ///通用推拉输出 5000MHz  GPIOB->ODR |=  1<<  14;                                //拉高CLK电平}void  CS1237_DRDY(void)                                //配置PB15为输入{       GPIOB->CRH &=  0x0FFFFFFF;														//寄存器清零	GPIOB->CRH |= 0x80000000;														//上下拉输入模式}void CS1237_DOUT(void)																//配置PB15为输出{
     	GPIOB->CRH &= 0x0FFFFFFF;														//寄存器清零	GPIOB->CRH |= 0x30000000;														//通用推挽输出 50MHz}//CS1237进入低功耗模式void CS1237_Power_Down(void){
     	CLK_HIGH	delay_us(200);                											//CLK上拉时间应超过100us,恢复后下拉时间至少10us}//配置CS1237芯片void Con_CS1237(void){
     	u8 i;	u8 dat;	u8 count_i=0;																				//溢出计时器	dat = CS_CON;																				// 0100 1000	CS1237_DOUT();	OUT_HIGH	delay_ms(310);																			//上电建立时间	CS1237_DRDY();																			//配置PB15为输入 	CLK_LOW																							//时钟拉低	while(INT)																					//芯片准备好数据输出 时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好	{
     		printf("123\r\n");		delay_ms(100);																		//10HZ下转换时间是100ms		count_i++;		if(count_i > 150)		{
     			CLK_HIGH;			CS1237_DOUT();			OUT_HIGH			return;																					//超时,则直接退出程序		}	}	for(i=0;i<29;i++)																	  // 1 - 29	{
     		One_CLK;	}	CS1237_DOUT();	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//30	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//31	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);		//32	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);		//33	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//34	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);		//35	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//36	One_CLK;																						//37 写入了0x65	for(i=0;i<8;i++)																		// 38 - 45个脉冲了,写8位数据	{
     		CLK_HIGH;		delay_us(6);		if(dat&0x80)			OUT_HIGH		else			OUT_LOW		dat <<= 1;		CLK_LOW;		delay_us(6);	}	CS1237_DRDY();	One_CLK;												//46个脉冲拉高数据引脚}//读取芯片的配置数据u8 Read_CON(void){
     	u8 i;	u8 dat=0;												//读取到的数据	u8 count_i=0;										//溢出计时器	CS1237_DOUT();	OUT_HIGH	CS1237_DRDY();									//配置PB15为输入 	CLK_LOW													//时钟拉低	while(INT)											//芯片准备好数据输出 时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好	{
     		delay_ms(100);		count_i++;		if(count_i > 150)		{
     			CLK_HIGH;			CS1237_DOUT();			OUT_HIGH;			return 1;										//超时,则直接退出程序		}	}	for(i=0;i<29;i++)								// 1 - 29	{
     		One_CLK;	}	CS1237_DOUT()元器件数据手册、IC替代型号,打造电子元器件IC百科大全!
          

相关文章