基于R的失重秤设计Word格式.docx

上传人:b****8 文档编号:22304997 上传时间:2023-02-03 格式:DOCX 页数:26 大小:503.37KB
下载 相关 举报
基于R的失重秤设计Word格式.docx_第1页
第1页 / 共26页
基于R的失重秤设计Word格式.docx_第2页
第2页 / 共26页
基于R的失重秤设计Word格式.docx_第3页
第3页 / 共26页
基于R的失重秤设计Word格式.docx_第4页
第4页 / 共26页
基于R的失重秤设计Word格式.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

基于R的失重秤设计Word格式.docx

《基于R的失重秤设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于R的失重秤设计Word格式.docx(26页珍藏版)》请在冰豆网上搜索。

基于R的失重秤设计Word格式.docx

为放入砝码的重量,

为放入未知重物后的AD值,

为未知重物的重量)计算出托盘里面重物的重量,然后输出到键盘显示板上进行显示。

具体方案:

a、每隔20ms通过A/D对输入的电压进行采样,在采样50次以后求出所有采样和的平均值

b、在每次系统启动后自动进入校零和校满程序并保存

c、在校零和校满以后进入测量程序,根据每次采样出来的AD值运用计算公式将重量通过键盘显示板显示出来

4器件选择

4.1稳压电源器件的选择

在本系统中需要两种不同电压值的直流电源,分别为12V和3.3V。

a、稳压管LM7812具有输出稳定性好、使用方便、输出过流、过热自动保护,最大输入电压为35V,最大输出电流为1.5A,最高结温为150℃,适用于各种电源稳压电路,而且采用TO-220封装形式,便于在万能板上进行焊接,故采用LM7812作为电桥及放大电路的供电稳压管。

b、LM317是通过调节端口1的电压就可以调节输出电压的可调稳压管,最大输出可调电压可达37V,最大输出电流可达2A,因此选择将其输出调为3.3V为逻辑控制器件提供电压。

4.2八位移位寄存器芯片与数码显示管的选择

键盘显示板的核心部分是八位移位寄存器芯片,它完成了数码显示与按键扫描这两个任务。

74LS164为8位移位寄存器(串行输入,并行输出),串行数据输入端可控制数据,当清除端(CLEAR)为低电平时,输出端(QA-QH)均为低电平。

当A、B任意一个为低电平是可禁止新的数据输入,在时钟端(CLOCK)脉冲上升沿的作用下QA为低电平。

当A、B端有一个为高电平,则另一个允许输入数据,并在CLOCK上升沿的作用下决定QB的状态。

其时序图如下:

图174LS164时序图

四共阴极的LED数码显示管,四个共阴极数码显示管的a~h段是分别连接在一起,共同引出公共的a~h段的控制线。

其连接图如下:

图2四共阴极LED数码显示管连接图

4.3压力传感器与运算放大器的选择

a、将压力的信号转换为电信号需要使用压力传感器来进行转换,在这里使用应变片压力传感器(图3),将压力信号转换为差动电压信号输出,只需要在传感器的电源端接入12V的电压,两条信号输出端就会输出差动电压信号。

b、LM324是四运放集成电路,它采用14脚双列直插塑料封装,便于在万用板上焊接。

它的内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独立。

每一组运算放大器可用图4所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“Vo”为输出端。

两个信号输入端中,Vi-(-)为反相输入端,表示运放输出端Vo的信号与该输入端的相位相反;

Vi+(+)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。

图3应变片压力传感器图4运算放大器

4.4逻辑控制器的选择

LPC2131是基于一个支持实时仿真和嵌入式跟踪的32/16位ARMTTDMI-STMCPU的微控制器,并带有32KB的嵌入的高速Flash存储器。

128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。

对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。

LPC2131的主要特性如下:

a)8KB片内静态RAMl

b)32KB片内Flash程序存储器。

c)1个8路10位A/D转换器共包含8/16个模拟输入,每个通道的转换时间低至2.44us。

d)2个32位定时器(带4路捕获和4路比较通道)、PWM单元(6路输出)和看门狗。

e)多个串行接口,包括2个16C550工业UART、2个高速I2C接口(400Kbits/s)、SPI接口。

f)向量中断控制器。

可配置优先级和向量地址。

g)多达47个可承受5V的通用I/O口(LQFP64封装)。

h)多达9个边沿或电平触发的外部中断引脚。

5硬件电路及分析

5.1稳压电源电路

图5为12V稳压电源的电路图。

经过变压器后将220V的市电降压为16V的交流电,经过C1将交流电中的高次谐波过滤后接入到整流桥整流后再经过1000uF的C2和220uF的C3平波后接入稳压管LM7812,后面输出为稳定的12V直流压,C4和C5的作用是进一步滤除直流电压中的高频交流成分,使电源更稳定。

图512V稳压电源的电路图

图6为运用LM317输出可调电源的电路图。

将经过LM7812稳压输出的12V电压

输入到该电路的

端,经电容C1滤波后送入LM317第3脚(输入端),二脚输出稳定的直流电压,调正端(一脚)与输出端的电压为1.25V的基准电压为了保证稳压管的输出特性,R1的电阻应小于240Ω。

为了输出电压可调,调整端与地之间接可变电阻器R2,调节R2的值可将输出电压调整为3.3V。

输出电压的计算公式为:

电路中C1是为了滤除输入电压存在的交流成分,C3是为了旁路基准电压的纹波,提高电源的纹波抑制性能。

图6LM317输出可调电源

5.2键盘输入与显示电路

图7为键盘输入与显示的电路图。

数据通过JP1接口中的DATA在CLK的上升沿作用下以串行的方式输入到移位寄存器,可以将CLK端接在SPI的时钟端上,将DATA端接在SPI的MOSI(主出从入)端口上,这样通过SPI就能将所要存入移位寄存器的数发送出去。

从图中可见,第一片移位寄存器控制的是数码管的位码,第二位移位寄存器控制的是数码管的段码。

因此,在SPI发送数据时应该先将8位段码发送到第一片寄存器中,然后发送8位位码。

这样,第一片寄存器中的段码被移入到第二片中,第一片寄存器中保存的是数码管的位码。

同时,8个按键的公共端是通过上拉电阻电阻R9接到VCC,而且在JP1中还有一个端口KEY作为按键到ARM的输入端。

图7键盘显示板电路

5.3差动信号放大电路

图8为用于对输入的差动电压信号进行放大的电路。

将3个差动信号的正负分别通过10KΩ的电阻接入到运算放大器的正负端,就会通过第一级差动放大器将差动信号放大10倍,然后放大信号输入到第二级的放大电路。

电路里接入了一个滑动变阻器,用于调节输出信号的零点。

在电路的最后接入了一个470uF的平波电容,是为了使输出的信号更加稳定,减少各种因素带来的电路输出信号的波动。

图8差动信号放大电路

5.4使用到的ARM内部功能模块

系统中使用到的ARM的内部硬件模块与外部器件的连接如图9所示。

图9

6软件设计

本系统软件部分的主要功能是完成对外部输入信号的AD采样,并且在对重量自校零和校满后使AD值与重量的量纲相对应,并且将所测得的重量通过SPI发送到键盘显示板上进行显示,其流程图(图10)如下:

图10程序流程图

7调试与分析

系统程序是在ARM公司的集成开发环境ADS1.2中完成开发与调试。

软件设计,是基于嵌入式系统程序设计的前后台设计思想(即传统的主函数加中断的程序设计思想),整个系统的运行是在一个while

(1)加上若干个中断服务程序。

中断部分主要是完成2ms的精确定时和SPI的定时发送的功能。

在整个while

(1)里面完成了按键检测和AD值与重量量纲的转化和将所需要显示的数转换为BCD码的功能。

8参考文献

[1]周立功等.深入浅出ARM7:

LPC213X/214X上册.北京航空航天大学出版社.2005.6

[2]华成英,童诗白等.模拟电子技术基础(第四版).高等教育出版社.2006.1

[3][日]铃木雅臣编著.晶体管电路设计(上).北京:

科学出版社,2004.9

[4]谭浩强,C程序设计[M],清华大学出版社

[5]韩亚萍编著.ProtelDXP基础教程.北京:

清华大学出版社,2005.5

[6]张珺,王祖麟.基于LPC2131的失重秤配料系统设计.自动化技术与应用,2007(6)

 

9附录

9.1总电路图

输出12V直流电压

输出3.3V直流电压

应变片压力传感器

差动信号放大电路

9.2元器件清单

序号

元件名

参数

数量(个)

1

蒸馏二极管IN4001

最大电流1A、电压50V

4

2

电解电容

1000uF耐压50V

3

470uF

47uf

5

陶瓷电容

0.1uF(104)

6

稳压管LM317

最大电流1A、电压35V

7

稳压管LM7812

8

散热片

铝制

9

运算放大器LM324

单、双电源供电

10

电阻

1K欧姆

若干

11

240欧姆

12

10K欧姆

13

500欧姆

14

可调变阻器

0~100K欧姆

15

移位寄存器74LS164

8位串入并处

16

LED共阴数码管

4位8段LED数码管

17

按键

——

18

二极管

19

变压器

输出16V以上的交流电压

20

插针

9.3主要程序清单

#include"

config.h"

uint8constwm[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uint8constdm[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uint8constM_8pai[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};

uint8data_buf[8];

uint32xs_cs=0;

//需要显示的数值

uint32ADC_Data=0;

uint8count;

//正在发送第几位段码

uint32time_ds=0;

//定时共用变量

uint8time_20ms_flag=0;

//定时20ms标志

uint8time_2ms_flag=0;

//2ms定时标志

uint8key_n=9;

//保存第几号键被按下

//********************************************************************

uint8dw0(uint8n)//对IO0PIN第n位进行读操作

{

uint8i;

if((IO0PIN&

(1<

<

n))==0)i=0;

elsei=1;

returni;

}

voidDelayNS(uint32dly)//长软件延时

{

uint32i;

for(;

dly>

0;

dly--)

for(i=0;

i<

5000;

i++);

uint8key_sm(void)//按键函数,在使用完key_n后

{//要将key_n置为大于7的数

uint8statickey;

uint8statickey_befor=0,key_now=0,ax_flag=0;

key_befor=key_now;

key_now=dw0(3);

if((key_befor==1)&

&

(key_now==0)&

(ax_flag==0))

{

ax_flag=1;

key=count;

}

(key_now==1)&

(ax_flag==1)&

(key==count))

ax_flag=0;

returnkey;

return9;

voidad_int(void)//AD初始化函数

PINSEL1=1<

28;

//P0.30连接到AD0.3

/*进行ADC模块设置*/

AD0CR=(1<

3)|//SEL=8,选择通道3

((Fpclk/1000000-1)<

8)|//转换时钟为1MHz

(0<

16)|//BURST=0,软件控制转换操作

17)|//CLKS=0,使用11clock转换

(1<

21)|//PDN=1,正常工作模式

22)|//TEST1:

0=00,正常工作模式

24)|//START=1,直接启动ADC转换

27);

//直接启动ADC转换时,此位无效

DelayNS(10);

ADC_Data=AD0DR;

//读取ADC结果,并清除DONE标志位

voidbin_bcd(uint32xs_data)//二进制转BCD码函数

uint32sum;

uint8i;

sum=xs_data;

for(i=0;

i<

8;

i++)

data_buf[i]=sum%10;

sum=sum/10;

//****************************************************************

voidtimer0int(void)//定时器初始化函数

T0TC=0;

T0PR=0;

T0MCR=0x03;

T0MR0=Fpclk/500;

//定时为2ms

T0TCR=0x01;

//*****************************************************************

voidmspi_send(uint8data)//spi发送程序

S0PDR=data;

while((S0PSR&

0x80)==0);

void__irqtimer0_isr(void)//定时器0中断服务程序,发送数据

mspi_send(dm[data_buf[count]]);

//发送段码

mspi_send(~(wm[count]));

//发送位码,数码管共阴,按位取反

key_n=key_sm();

//按键返回部分

count++;

//发送下一个

if(count>

=8)

count=0;

time_2ms_flag=1;

//2ms定时,置1

time_ds++;

if(time_ds>

=5001)//最长定时10s

time_ds=0;

if(time_ds%10==0)//20ms定时

time_20ms_flag=1;

T0IR=0x01;

VICVectAddr=0x00;

voidvic_timer0_int(void)//定时器0中断初始化函数

VICIntSelect&

=~1<

4;

VICVectCntl0=0x20|4;

VICVectAddr0=(uint32)timer0_isr;

VICIntEnable|=1<

IRQEnable();

voidmspi_int(void)//SPI初始化函数

PINSEL0=(PINSEL0&

(~(0xFF<

8)))|(0x55<

8);

S0PCR=(0<

3)|

(1<

4)|

(1<

5)|

(0<

6)|

7);

S0PCCR=10;

intmain(void)

uint8key_7_n=0;

uint16adc_base=0;

uint16adc_base_400=0;

uint8adc_count=0;

uint16ad_data_50=0;

//求50平均值后的AD值

uint16zl_g=0;

//重量,单位为g

uint32adc_data_buf=0;

PINSEL0&

=~(3<

6);

//将p0.3设为gpio

IO0DIR&

=~(1<

3);

//p0.3设为输入功能

PINSEL2&

//选择P1.16~P1.25为GPIO功能

IO1DIR|=0xFF<

18;

//将P1.18~P1.25设为输出功能

IO1CLR|=0xFF<

//输出低电平

timer0int();

vic_timer0_int();

mspi_int();

ad_int();

while

(1)

if(time_20ms_flag==1)

{

time_20ms_flag=0;

if(adc_count<

50)

{

AD0CR|=1<

24;

//进行第一次转换

while((ADDR&

0x80000000)==0);

//等待转换结束

AD0CR|=1<

//再次启动转换

while((AD0DR&

ADC_Data=AD0DR;

//读取ADC结果

ADC_Data=(ADC_Data>

>

6)&

0x3f

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

当前位置:首页 > 解决方案 > 学习计划

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

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