电子秤课程设计实验报告文档格式.docx

上传人:b****5 文档编号:16264921 上传时间:2022-11-22 格式:DOCX 页数:16 大小:47.65KB
下载 相关 举报
电子秤课程设计实验报告文档格式.docx_第1页
第1页 / 共16页
电子秤课程设计实验报告文档格式.docx_第2页
第2页 / 共16页
电子秤课程设计实验报告文档格式.docx_第3页
第3页 / 共16页
电子秤课程设计实验报告文档格式.docx_第4页
第4页 / 共16页
电子秤课程设计实验报告文档格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

电子秤课程设计实验报告文档格式.docx

《电子秤课程设计实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《电子秤课程设计实验报告文档格式.docx(16页珍藏版)》请在冰豆网上搜索。

电子秤课程设计实验报告文档格式.docx

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基本工作原理及原理框图

OLED显示重量

单片机数据处理及控制

STM32的A/D模数转换

Ad620n信号放大电路

全桥电阻应变式传感器输出信号

图一:

基本硬件系统结构图

全桥电阻应变式传感器输入电压,当标准重物放置在传感器之上时,电阻值发生改变,使加载到全桥电路上的输出电压发生变化,变化范围约为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)

±

非线性(%F.S)

输入电阻(Ω)

1000±

50

重复性(%F.S)

输出电阻(Ω)

滞后(%F.S)

绝缘电阻(MΩ)

≥2000(100VDC)

蠕变(%F.S/3min)

推荐激励电压(V)

3~12

零点漂移(%F.S/1min)

工作温度范围(℃)

-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"

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<

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;

n-1;

i++)

{a=x[i+1];

j=i;

while(a<

x[j]){

x[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<

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);

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);

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);

if(qupi_point==0){

OLED_ShowCHinese(0,5,17);

OLED_ShowCHinese(16,5,18);

OLED_ShowCHinese(32,5,19);

Main.c如下:

Prohead.h"

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{

update_key();

//printf("

Iamarobot."

);

mass=%f\r\n"

mass);

第四节结论与分析

确定设计方案后,在调试阶段经过电桥连接,调零电路、运放模拟、A

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1