电子秤课程设计实验报告材料.docx
《电子秤课程设计实验报告材料.docx》由会员分享,可在线阅读,更多相关《电子秤课程设计实验报告材料.docx(20页珍藏版)》请在冰豆网上搜索。
![电子秤课程设计实验报告材料.docx](https://file1.bdocx.com/fileroot1/2023-2/6/0aa73e16-70dd-44d2-b675-a07a8e9ab418/0aa73e16-70dd-44d2-b675-a07a8e9ab4181.gif)
电子秤课程设计实验报告材料
电
子
设
计
实
验
报
告
电子科技大学
设计题目:
电子称
姓名:
学生姓名
任务与要求
一、任务
使用电阻应变片称重传感器,实现电子秤。
用砝码作称重比对。
二、要求
准确、稳定称重;
称重传感器的非线性校正,提高称重精度;
实现“去皮”、计价功能;
具备“休眠”与“唤醒”功能,以降低功耗。
电子秤
第一节绪论
摘要:
随着科技的进步,在日常生活以及工业运用上,对电子秤的要求越来越高。
常规的测试仪器仪表和控制装置被更先进的智能仪器所取代,使得传统的电子测量仪器在远离、功能、精度及自动化水平定方面发生了巨大变化,并相应的出现了各种各样的智能仪器控制系统,使得科学实验和应用工程的自动化程度得以显著提高。
影响其精度的因素主要有:
机械结构、传感器和数显仪表。
在机械结构方面,因材料结构强度和刚度的限制,会使力的传递出现误差,而传感器输出特性存在非线性,加上信号放大、模数转换等环节存在的非线性,使得整个系统的非线性误差变得不容忽视。
因此,在高精度的称重场合,迫切需要电子秤能自动校正系统的非线性。
此外,为了保证准确、稳定地显示,要求所采用的ADC具有足够的转换位数,而采用高精度的ADC,自然增加了系统的成本。
基于电子秤的现状,本文提出了一种简单实用并且精度高的智能电子秤设计方案。
通过运用很好的集成电路,使测量精度得到了大大提高,由于采用数字滤波技术,使稳态测量的稳定性和动态测量的跟随性都相当好。
并取得了令人满意的效果。
关键词:
压力传感器,AD620N放大电路,ADC模数转换,STM32单片机,OLED显示屏,矩阵键盘,电子秤。
1.1引言
本课程设计的电子秤以单片机为主要部件,利用全桥测量原理,通过对电路输出电压和标准重量的线性关系,建立具体的数学模型,将电压量纲(V)改为重量纲(g)即成为一台原始电子秤。
其中测量电路中最主要的元器件就是电阻应变式传感器。
电阻应变式传感器是传感器中应用最多的一种,本设计采用全桥测量电路,是系统产生的误差更小。
输出的数据更精确。
而AD620N放大电路的作用就是把传感器输出的微弱的模拟信号进行一定倍数的放大,以满足A/D转换器对输入信号电平的要求。
A/D转换的作用是把模拟信号转变成数字信号,进行模拟量转数字量转换,然后把数字信号输送到显示电路中去,最后由OLED屏幕显示出测量结果。
配置有矩阵键盘可以对电子秤进行一定的操作如去皮,计价,并可当下手动录入价格,并显示价格。
1.2系统的设计与理论分析
1.2.1系统设计
根据设计要求,设计的主要内容如下:
1)利用电阻应变式传感器,并采用全桥测量电路
2)设计一款电子秤,利用OLED屏幕显示被称物体的重量
3)利用矩阵键盘对电子秤进行去皮,计价,录入价格的操作。
4)电路分成以下几个部分:
a.运放电路
b.电路的滤波及电压跟随器电路
c.单片机数据处理及控制电路,包括矩阵键盘,OLED屏幕等。
d.双电源供电及变压电路。
1.2.2基本工作原理及原理框图
图一:
基本硬件系统结构图
全桥电阻应变式传感器输入电压,当标准重物放置在传感器之上时,电阻值发生改变,使加载到全桥电路上的输出电压发生变化,变化范围约为3mV到10mV运用AD620N仪表放大电路将微弱模拟信号放大,并经过LM358搭建的电压跟随器电路滤波。
送至STM32单片机中进行A/D模数转换,将模拟信号转变成单片机能够识别的数字信号,并且利用单片机控制整个电路的同时,处理数字信号,并且控制在OLED中显示实时结果。
图二:
部分控制电路基本结构图
矩阵键盘上的按键被按下后,单片机识别并判断指令内容(如:
去皮,计价,录入单价等),并向OLED屏发出改变显示内容的指令。
第二节硬件电路的设计与选择
2.1传感器的选择
电阻应变式传感器是将被测量的力,通过它产生的金属弹性形变转换成电阻变化的元件。
由电阻应变片和测量线路两部分组成。
本次设计中使用YZC-133压力传感器。
下表为相关技术参数。
注:
该技术参数为店家提供,本小组并未将所有参数进行检验。
量程(kg)
3kg
综合误差(%F.S)
0.05
额定输出温度飘移(%F.S/10℃)
≤0.15
灵敏度(mv/v)
1.0±0.1
零点输出(mV/V)
±0.1
非线性(%F.S)
0.05
输入电阻(Ω)
1000±50
重复性(%F.S)
0.05
输出电阻(Ω)
1000±50
滞后(%F.S)
0.05
绝缘电阻(MΩ)
≥2000(100VDC)
蠕变(%F.S/3min)
0.05
推荐激励电压(V)
3~12
零点漂移(%F.S/1min)
0.05
工作温度范围(℃)
-10~+50
零点温度漂移(%F.S/10℃)
0.2
过载能力(%F.S)
150
由于其激励电压越高,准确度越高的特性,本次设计使用10V电源供电。
2.2信号放大电路的设计与选择
由上文中可知,10V单电源供电的压力传感器输出最大值只有10mV,stm32的AD量程为0~3.3V,则可以放大330倍。
此处由于信号源仅有10mV,并且放大倍数较大,选用AD620N仪表放大器而非一般的运算放大器做放大电路,以得到较高的精确度和输出电压的良好的线性性。
放大电路为:
图3运算放大器电路
AD620是一种低功耗,高精度的仪表放大器,它只需要一个外界电阻,即可设置各种增益(1到1000)。
AD620N与分离元件组成的仪表放大器相比较具有体积小,功耗低,精度高等优点。
电源电压上±15V均可以。
之前曾经使用正5V的单电源供电,但是使用时发现输出电压在1.3V到3.6V之间,由于分度值的要求,不能满足本题的要求,故选用双电源供电。
此处使用±10V的双电源供电。
由此公式可计算出我们所需要的电阻,放大330倍约需要使用150Ω电阻。
2.4电压跟随器电路设计
由于精度要求,为了降低信号的噪声,此处增用一个电压跟随器电路已达成接近滤波的效果。
电压跟随器的显著特点就是,输入阻抗高,而输
出阻抗低。
一般来说,输入阻抗可以达到几兆欧姆,
而输出阻抗低,通常只有几欧姆,甚至更低。
在电路中,电压跟随器一般做缓冲级(buffer)及
隔离级。
因为,电压放大器的输出阻抗一般比较高,
通常在几千欧到几十千欧,如果后级的输入阻抗比较
小,那么信号就会有相当的部分损耗在前级的输出电
阻中。
在这个时候,就需要电压跟随器进行缓冲。
起到承上启下的作用。
电压跟随器还可以提高输入阻抗,可以大幅度减小输入电容的大小,为应用高品质的电容提供保证。
此处采用如图所示的电路。
经过电压跟随器处理的信号噪声有明显的减少,使数据的稳定性提高。
信号部分(AD620N仪表放大器和LM358电压跟随器)的电路如图所示
2.5单片机数据处理及控制电路
2.5.1STM32
STM32系列芯片是由ST公司开发并发布一系列相关固件库以方便开发人员进行开发的一款实用性强,功能强大,开发较容易的32位微处理器(单片机)。
在工业上适用于高性能、低成本、低功耗的嵌入式开发。
作为一款32位单片机芯片,它使用了ARM公司的Cortex-M3高性能内核,并集成了12通道的DMA处理器,定时器,3个12位的us级的A/D转换器,2通道12位D/A转换器,3个SPI接口,2个IIC接口和串行接口UART,并因其集成度之高及价格低廉而被广泛使用。
在目前的时代发展中,电子产品对于传感器的使用逐渐增多,ADC功能也相应变得重要。
而在这方面,STM32系列芯片上集成的外设ADC也可以算得上非常强大。
增强型产品(STM32F103xC,STM32F103xD,STM32F103xE系列为ST推出的增强型产品)内嵌3个12位的ADC,每个多达21个外部通道,可以实现单次或多次扫描转换。
ADC的结果可以左对齐或右对齐的方式存储在16位数据寄存器中。
对于ADC来说,分辨率,转换时间和ADC类型是最重要的。
32的外设ADC有12位的分辨率,不能直接测量负电压;转换时间是可编程的,采样时间最短为1μm;ADC类型则是逐次比较性的ADC。
ADC的参考电压引脚分别为VREF+(模拟参考量正极),VDDA(模拟电源),VREF-(模拟参考负极),VSSA(模拟电源地)和模拟量输入脚(16个)。
在过程中,输入信号经过通道被送到ADC部件,ADC部件需要收到触发信号才开始进行转换,如EXTI触发,定时器触发或软件触发。
ADC部件接收到触发信号后,在ADCCLK时钟的驱动下对输入通道信号进行采样,并进行模数转换,其中ADCCLK是来自ADC预分频器的。
得到的数据被保存在16位的规则通道寄存器中,可以通过CPU指令或DMA把它读取到内存(变量)中。
在ADC的程序设置上,可以设置多种模式,如同步注入模式,同步规则模式等,并可以进行多通道的轮流采集等设置,功能强大,简便易用。
32系列芯片不仅有强大的ADC,还有同样强大的定时器功能。
在定时器方面,STM32有8个16位的定时器,其中TIM6,TIM7为基本定时器,TIM1,TIM8是高级定时器,其他为通用定时器。
这些定时器有定时,信号频率测量,信号的PWM测量,PWM输出,三相六步电机控制及编码器接口等功能。
图6.STM32单片机引脚图
2.5.2单片机的引脚连接关系
单片机与矩阵键盘的连接:
GPIOPC1--PIN1PC2--PIN2
PC3--PIN3PC4--PIN4
PC5--PIN5PC6--PIN6
PC7--PIN7PC8--PIN8
单片机与OLED屏幕的连接:
GPIOPA3--CSPA4--RST
PA5--DCPA6--SCLK(D0)
PA7--SDIN(D1)3.3V--VDD+(非单片机引脚)
GND--GND(非单片机引脚)
单片机与传感电路的连接:
VCC--3.3VGND--GND
PA1--电压跟随器的信号口
其中PA1复用ADC1功能。
第三节软件程序的设计与选择
3.1软件程序计算
经过放大,滤波与电压跟随器的信号电压从adc中取值,经过20组测量数据,我们测量出了电源电压(伏)与重量(千克)的关系(数据没有保存,测试成功之后只留下了变换函数),经过非线性校准之后的函数为
()/1000。
3.2最终软件程序(部分)
RCC.c,OLED.c,ADC.c,TIM.c,keyboard.c,main.c。
其中adc.c如下:
#include"ProHead.h"
#include"ADC.h"
externfloatmass;
externfloatmass0;
externfloatmass_get;
externu8danjia[4];
externu8danjia_point;
floatadc_get[1000];
externfloatmass00;
externfloatadc;
u8x;
voidADC_Config(void){
GPIO_InitTypeDefGPIO_InitStructure;
ADC_InitTypeDefADC_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//连续多通道模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//连续转换
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换不受外界决定
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//右对齐
ADC_InitStructure.ADC_NbrOfChannel=1;//扫描通道数
ADC_Init(ADC1,&ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_71Cycles5);//通道X,采样时间为1.5周期,1代表规则通道第1个这个1是啥意思我不太清楚只有是1的时候我的ADC才正常。
ADC_Cmd(ADC1,ENABLE);//使能或者失能指定的ADC
ADC_ResetCalibration(ADC1);//重置ADC1校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
ADC_StartCalibration(ADC1);//开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能或者失能指定的ADC的软件转换启动功能
voidADC_Read(void){
staticu16i;
floathe=0;
u16j;
mass=0;
for(i=0;i<1000;i++){
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//检查制定ADC标志位置1与否ADC_FLAG_EOC转换结束标志位
mass_get=((float)ADC_GetConversionValue(ADC1))/4096*3.3;
adc_get[i]=mass_get;
}
for(j=0;j<1000;j++){
he=he+adc_get[j];
}
mass_get=he/1000;
mass_get=mass_get-mass00;
adc=mass_get-mass0;
mass=(0.7835*adc*adc*adc-1.3802*adc*adc+1010.3*adc)/1000;
}
voidinsertsort(floatx[],intn){
inti,j;
floata;
for(i=0;i{a=x[i+1];
j=i;
while(ax[j+1]=x[j];
j--;
}
x[j+1]=a;
}
}
Keyboard.c部分程序如下:
voidupdate_key(void){
unsignedchari,j;
for(i=0;i<4;i++)//i?
?
?
?
?
?
?
?
?
?
{GPIO_ResetBits(key_output[i].GPIO_x,key_output[i].GPIO_pin);
for(j=0;j<4;j++)//j?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
{
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x,key_input[j].GPIO_pin)==0){
u16t=40000;
while(t--);
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x,key_input[j].GPIO_pin)==0){
key[i][j]=1;
key_down(i,j);
//printf("i=%d\r\n",i);
//printf("j=%d\r\n",j);
//keypoint=0;
//delay_ms(300);
}
}
else{key[i][j]=0;
}
}
GPIO_SetBits(key_output[i].GPIO_x,key_output[i].GPIO_pin);
}
}
Oled.c中部分程序如下:
voidshow_mass(void){
switch(oled_point){
case1:
//正常显示重量
show_string_and_mass();
break;
case0:
//显示系统内存已有单价,可以进行价格选择
OLED_ShowCHinese(0,0,14);
OLED_ShowCHinese(16,0,15);
OLED_ShowNum(28,3,danjia[0],1,1);
OLED_ShowNum(36,3,danjia[1],1,1);
OLED_ShowNum(44,3,danjia[2],1,1);
OLED_ShowNum(52,3,danjia[3],1,1);
break;
case2:
//键入单价界面
break;
case3:
//计价界面
jiage=mass*(danjia[0]*10+danjia[1]+danjia[2]*0.1+danjia[3]*0.01);
get_char(price,jiage);
OLED_ShowNum(20,3,price[4],1,1);
OLED_ShowNum(28,3,price[3],1,1);
OLED_ShowNum(36,3,price[2],1,1);
OLED_ShowNum(44,3,price[1],1,1);
OLED_ShowNum(52,3,price[0],1,1);
OLED_ShowCHinese(60,3,16);//¼¼
}
}
voidshow_m_by_number(void){
get_char(fanhaoyang,mass);
OLED_ShowNum(20,3,fanhaoyang[4],1,1);
OLED_ShowNum(28,3,fanhaoyang[3],1,1);
OLED_ShowNum(36,3,fanhaoyang[2],1,1);
OLED_ShowNum(44,3,fanhaoyang[1],1,1);
OLED_ShowNum(52,3,fanhaoyang[0],1,1);
}
voidget_char(u8get[],floatfrom){
u16i=(u16)(from*1000);
get[4]=(u8)(i/10000);
get[3]=(u8)((i-get[4]*10000)/1000);
get[2]=(u8)((i-get[4]*10000-get[3]*1000)/100);
get[1]=(u8)((i-get[4]*10000-get[3]*1000-get[2]*100)/10);
get[0]=(u8)(i-get[4]*10000-get[3]*1000-get[2]*100-get[1]*10);
get[5]='\0';
}
voidshow_string_and_mass(void){
OLED_ShowString(0,0,weight);
OLED_ShowString(68,3,weight2);
get_char(fanhaoyang,mass);
OLED_ShowNum(20,3,fanhaoyang[4],1,1);
OLED_ShowNum(28,3,fanhaoyang[3],1,1);
OLED_ShowNum(36,3,fanhaoyang[2],1,1);
OLED_ShowNum(44,3,fanhaoyang[1],1,1);
OLED_ShowNum(52,3,fanhaoyang[0],1,1);
if(qupi_point==0){
OLED_ShowCHinese(0,5,17);
OLED_ShowCHinese(16,5,18);
OLED_ShowCHinese(32,5,19);
}
}
Main.c如下:
#include"Prohead.h"
#include"bmp.h"
floatmass_get;
floatmass0;
floatmass;
floatmass00=0;
u8keypoint;
u8oled_point;
u8get[5];
u8stop_point=1;
floatadc;
externu8fanhaoyang[5];
voidALL_Config(void){
RCC_Config();
LED_Config();
USART_Config();
ADC_Config();
keyboard_init();
oled_point=1;
OLED_Init();
OLED_Clear();
mass0=0;
}
intmain(){
delay_ms(5000);
ALL_Config();
ADC_Read();
mass00=adc;
while
(1){
TIM4_Int_Init(10,7199);
if(stop_point){
delay_ms(300);
update_key();
ADC_Read();
show_mass();}
else{
OLED_Clear();
update_key();
}
//printf("Iamarobot.");
//printf("mass=%f\r\n",mass);
}
}
第四节结论与分析
确定设计方案后,在调试阶段经过电桥连接,调零电路、运放模拟、A/D模数转换器电路、单片机控制电路、数码管显示电路的实物模拟,各个部分工作正常。
然后进行电路焊接,但是由于人为原因,电路存在虚焊、短接等错误,导致整个电路无法正常工