电子秤课程设计报告实验报告Word格式文档下载.docx
《电子秤课程设计报告实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《电子秤课程设计报告实验报告Word格式文档下载.docx(16页珍藏版)》请在冰点文库上搜索。
压力传感器,AD620N放大电路,ADC模数转换,STM32单片机,OLED显示屏,矩阵键盘,电子秤。
1.1引言
本课程设计的电子秤以单片机为主要部件,利用全桥测量原理,通过对电路输出电压和标准重量的线性关系,建立具体的数学模型,将电压量纲〔V〕改为重量纲〔g〕即成为一台原始电子秤。
其中测量电路中最主要的元器件就是电阻应变式传感器。
电阻应变式传感器是传感器中应用最多的一种,本设计采用全桥测量电路,是系统产生的误差更小。
输出的数据更准确。
而AD620N放大电路的作用就是把传感器输出的微弱的模拟信号进展一定倍数的放大,以满足A/D转换器对输入信号电平的要求。
A/D转换的作用是把模拟信号转变成数字信号,进展模拟量转数字量转换,然后把数字信号输送到显示电路中去,最后由OLED屏幕显示出测量结果。
配置有矩阵键盘可以对电子秤进展一定的操作如去皮,计价,并可当下手动录入价格,并显示价格。
1.2系统的设计与理论分析
根据设计要求,设计的主要内容如下:
1)利用电阻应变式传感器,并采用全桥测量电路
2)设计一款电子秤,利用OLED屏幕显示被称物体的重量
3)利用矩阵键盘对电子秤进展去皮,计价,录入价格的操作。
4)电路分成以下几个局部:
a.运放电路
b.电路的滤涉及电压跟随器电路
c.单片机数据处理及控制电路,包括矩阵键盘,OLED屏幕等。
d.双电源供电及变压电路。
图一:
根本硬件系统构造图
全桥电阻应变式传感器输入电压,当标准重物放置在传感器之上时,电阻值发生改变,使加载到全桥电路上的输出电压发生变化,变化范围约为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与别离元件组成的仪表放大器相比拟具有体积小,功耗低,精度高等优点。
电源电压上±
10V的双电源供电。
由此公式可计算出我们所需要的电阻,放大330倍约需要使用150Ω电阻。
2.4电压跟随器电路设计
由于精度要求,为了降低信号的噪声,此处增用一个电压跟随器电路已达成接近滤波的效果。
电压跟随器的显著特点就是,输入阻抗高,而输
出阻抗低。
一般来说,输入阻抗可以到达几兆欧姆,
而输出阻抗低,通常只有几欧姆,甚至更低。
在电路中,电压跟随器一般做缓冲级(buffer)及
隔离级。
因为,电压放大器的输出阻抗一般比拟高,
通常在几千欧到几十千欧,如果后级的输入阻抗比拟
小,那么信号就会有相当的局部损耗在前级的输出电
阻中。
在这个时候,就需要电压跟随器进展缓冲。
起到承上启下的作用。
电压跟随器还可以提高输入阻抗,可以大幅度减小输入电容的大小,为应用高品质的电容提供保证。
此处采用如以下图的电路。
经过电压跟随器处理的信号噪声有明显的减少,使数据的稳定性提高。
信号局部〔AD620N仪表放大器和LM358电压跟随器〕的电路如以下图
2.5单片机数据处理及控制电路
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单片机引脚图
单片机与矩阵键盘的连接:
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/D模数转换器电路、单片机控制电路、数码管显示电路的实物模拟,各个局部工作正常。
然后进展电路焊接,但是由于人为原因,电路存在虚焊、短接等错误,导致整个电路无法正常工作。
经过反复检查调试,电路还是不能正常工作。
4.3总结
在此次课程设计中,我们遇到了以下问题:
1、电桥偏位电压过大。
由于偏位电压过大,使电子秤量程大大降低。
因此,我们通过分压调零电路,消除偏位电压。
2、运算放大器小信号放大困难。
由于电桥输出的变量信号非常小,因此,我们必须将该小信号放大到到达A/D转换器的分辨率。
运放芯片我们先后尝试了LM358、OP07、LM741,经过比照发现,LM741对小信号的放大较为稳定,不会出现较大的跳跃。
经过八天的努力,最终如期完成任务,在做电子秤的过程中,我们碰到不少困难,但是经过请教教师、小组商讨、上网查资料,将困难一个个抑制。
1、熟悉AT89S52单片机