基于R的失重秤设计Word格式.docx
《基于R的失重秤设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于R的失重秤设计Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
![基于R的失重秤设计Word格式.docx](https://file1.bdocx.com/fileroot1/2023-2/2/b31b146d-0fd3-4436-856c-abf79032b7e7/b31b146d-0fd3-4436-856c-abf79032b7e71.gif)
为放入砝码的重量,
为放入未知重物后的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