【检测技术课案】简易数显电子秤的设计与制作

传感器与检测技术课程设计【案例1】——简易数显电子秤的设计与制作


任务目标

称重技术是广泛应用于工业,农业,交通,贸易和科研等领域的重要技术,与社会发展、工业生产和人们生活息息相关,电子秤属于电子衡器,技术水平的高低,直接影响着生产生活质量和经济效益的发展。

技术指标 要求
量程 0-10kg
分辨率 1g
最大引用误差 <0.1%
绝对误差 <5g

以下是本篇文章正文内容,案例可供参考

一、数显电子秤的工作原理

电子秤采用单片机处理系统,通过称重传感器将被测量转换为电信号,经过对采样信号的处理和分析,实现重量信号的采集和转换,并利用单片机系统进行计算分析,最后通过显示设进行显示,能达到快捷,方便的重量信息显示。

总体设计方案如下图所示:
在这里插入图片描述

二、各模块设计

1.应变传感器

传感器模块选用10kg量程电阻应变式压力传感器,内部集成惠斯通电桥。实物图和具体技术参数如下图所示。
在这里插入图片描述
在这里插入图片描述
传感器灵敏度为1mV/V,若电桥的激励电压为10V,则满量程时电压差为10mV,假定电压差值与压力传感器受力呈线性关系,则变化率1uV/g。传感器模块与信号处理电路接线如下:

在这里插入图片描述

2.信号处理电路

在这里插入图片描述
信号调理电路大致可以分为桥路差动放大、跟随器、反向放大、低通滤波四部分。OPA2333搭建桥式放大器,AAD227搭建二级放大器。

原理图
在这里插入图片描述 首先通过差动放大,通过差分接法得到电桥差值并放大到合适的值。根据芯片数据手册定下放大倍数约100倍
在这里插入图片描述 电压跟随器在电路中可以作为隔离器,且具有高输入阻抗低输出阻抗的特点,可以防止前后电路产生干扰。由于芯片特性,输入电流不得大于20mA,因而在同相端串联一5kΩ电阻。该阻值对放大倍数不产生影响。
在这里插入图片描述 由于前面电桥产生差值为负电压,需要接入反相器使得电压转化为单片机可以测量的正电压,同时使受到放大器性能制约的差分放大电路可以进一步放大使得测量范围足够大。反相放大器的放大倍数Au = - ( Rf / Rin )

最终放大倍数 = (R2/(R1+350))(IN2-IN1)1(-R7/R6)≈300

3.单片机和AD采样

单片机部分选用STM32F103C8T6最小系统板,常用,便于快速编写。
由于需要采集uv级别的信号,芯片自带的12位ad不足以胜任任务的需要,编写SPI通信24位AD模块ADS1256。

驱动程序参考-》ADS1256驱动

主程序代码如下(示例):

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "exti.h" 
#include "ADS1256.h"

#define Au 300.0
int KeyState = 0;
char str[15],str2[15];

void Delay(vu32 nCount)
{
    
    
  for(; nCount != 0; nCount--);
}
//定时器3 500ms一次中断
void TIM3_Int_Init(u16 arr,u16 psc)
{
    
    
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM3, //TIM2
		TIM_IT_Update ,
		ENABLE  //使能
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
							 
}

void TIM3_IRQHandler(void)   //TIM3中断
{
    
    
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
	{
    
    
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
	  printf(str);
	}
}

int main(void)
{
    
    	
	long double vr,vout,vsum,v[50];
	unsigned char i=0,j=0;
	long ulResult;
	long double ldVolutage;
	
	delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(9600);	 //串口初始化为9600
	
	LED_Init();		  	 //初始化与LED连接的硬件接口 
  LEDx=0;				//点亮LED
	
	EXTIX_Init();		//外部中断初始化
	
	printf("OK\r\n");	
	
	Init_ADS1256_GPIO(); //初始化ADS1256 GPIO管脚 

	Delay(0x1ffFF);
	GPIO_SetBits(GPIOB, GPIO_Pin_11 );  
	ADS1256_Init();
	
	TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  
	
	for(i = 0;i < 20;i++) v[i]=0;
	
	while(1)
	{
    
    	    
		 for(i = 0;i < 1;i++)
		{
    
    
			 ulResult = ADS_sum( (i << 4) | ADS1256_MUXN_AINCOM);	
			//ulResult = ADS_sum( ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);	
			if( ulResult & 0x800000 )
			{
    
    
			 	ulResult = ~(unsigned long)ulResult;
				ulResult &= 0x7fffff;
				ulResult += 1;
				ulResult = -ulResult;
			}
			ldVolutage = (long double)ulResult*0.59604644775390625;
			//printf("第%d通道:",(i & 0x07)?(i & 0x07) - 1:7);
			//sprintf(str,"%lf\r\n",ldVolutage); 	//double
			//printf("uV\r");
			//printf("%x",(unsigned long)ulResult);//16
			Delay(0x3fFFF);
		}
		vsum = 0;
		for(i = 1;i < 20;i++)
		{
    
    
			v[i] = v[i-1];
			vsum += v[i];
			vsum /= 2.0;
		}
		v[0] = ldVolutage;
		vsum += v[0];
		vsum /= 2.0;
		if(j<20)
		{
    
    
			vr = vsum;
			j++;
		}
		vout = (vsum - vr) / Au;///20.0;
		sprintf(str,"%.0lf    ->   ",vsum);
		sprintf(str2,"%.0lf g\r\n",vout);
	} 
}
//END

滤波算法采用连续采样20个值(小样本)求平均,实际表现效果良好。

三、仿真和测试

1.硬件仿真

在这里插入图片描述
仿真时方案放大倍数为240,后实际方案修改为300

桥路输出电压(mv) 对应物体重量 仿真输出电压
0.001 1g 241.999uV
0.01 10g 2.402mV
0.1 100g 24.001mV
1 1kg 239.997V
10 10kg 2.4V

2.实际测试

3.改进与优化

a)可以考虑修改成三运放构建差动仪表放大的方案。
b)通过实际测试数据进行拟合提高检测精度。
……


总结

本文仅仅简单介绍了简易数显电子秤的设计和制作,为后续其他教学项目的开展提供了样本和案例。

猜你喜欢

转载自blog.csdn.net/Fmix_cjlu/article/details/125052173
今日推荐