20xx年全国大学生电子设计竞赛
信息安全技术专题邀请赛
作品简介
注: 1.请使用小4号字(12号字),单倍行距填写; 2.每支参赛队限一名指导教师;
3.参赛队员姓名应与正式报名表一致,并亲笔填写,不可打印; 4.作品题目应与作品设计报告一致。
第二篇:20xx年电子设计大赛论文
20xx年山东省大学生电子设计竞赛论文
题目:超低功耗倾角测量仪的设计制作(C题)
参赛学校: 山东工商学院
参赛学院: 信息与电子工程学院 参赛队编号: 028C03
参赛队员姓名:温汝龙 187xxxxxxxx 张芳灵 187xxxxxxxx
赵 晴 187xxxxxxxx
指导教师姓名:张守祥 131xxxxxxxx
超低功耗倾角测量仪的设计制作
摘要:本测量仪由单片机msp430为主控制器,储有电能的电解电容供电,当充电到25V后接入测量仪系统,每按一下测试按键进行一次斜面倾角的测量并显示,其测角范围为0~90度,显示分辨率为0.1度,精度为±5度。还有三轴加速度传感器测量并显示沿X、Y、Z方向重力加速度分量的功能,且测量精度为±5%。该测量仪具有功耗低,结构简单,精度高的特点。
关键词:MSP430,电解电容,加速度传感器,低功耗
Abstract: The MCU msp430 is the main controller of the measuring instrument, and electrolytic capacitor that has stored power supply power. Access measuring instrument system when electrolytic capacitor charges to 25V. Then every time we click the test button the instrument will give a slant angle measurement and display. The measuring instrument can measure the angle range of 0 ~ 90 degrees, its display resolution was 0.1 degrees and the precision is ± 5 degrees. There are three axis acceleration sensor measurement and display along the X, Y, Z direction acceleration of gravity component function, and the measurement accuracy of plus or minus 5%. The measuring instrument has the advantages of low power consumption, simple structure and high accuracy.
Keywords: MSP430, electrolytic capacitor, acceleration sensor, low power consumption 1 引言
在这机械越来越发达的时代,倾角测量仪被广泛应用于工程机械,道路桥梁检测,山体滑坡检测,汽车电子,水平测量,电力监控,建筑,钻探机械等多个行业的角度测量。应用的广泛更要求了倾角测量仪有较高的精度及更强的抗冲击力。遵循结构简单而可靠性高的原则,设计出基于MSP430单片机的超低功耗倾角测量仪。该测量仪通过MMA7361LC模块采集数据,单片机MSP430程序来计算并显示采样数据,由于传感器MMA7361不会被周围环境影响且自身的灵敏度较高,这大大提高了该测量仪的精度。此外,整个系统的供电时由 2200μF的电容提供的,从而实现测量仪的超低功耗。 2 方案论证与设计
2.1主控模块
方案一:采用传统MCS-51单片机作为主控芯片。51单片机具有8位代码指令、8位数据总线、16位地址总线、6个中断源、4KB RAM、寻址范围16位地址宽度、不能预取指、1种工作模式、不支持协处理器、不支持JTAG调试,是一款具有价格低廉、使用简单、应用广泛较好的芯片。但是由于本测量采集数据使用的是MMA7361,如果使用MCS-51单片机势必要加一个A/D转换电路,这无疑增加了系统的复杂程度,且内部资源比较少,功能相对不丰富,实现过程比较繁琐。
方案二:采用MSP430g2553作为主控芯片。MSP430g2553CPU具有一种16位RISC架构,所有的操作(程序流指令除外)均作为寄存器操作与用于源操作数的7种寻址模式和用于目的操作数的4种寻址模式一起执行。Comparator_A+ 模块的主要功能是支持高精度的斜坡模数转换、电池电压监控及外部模拟信号的监视,可以监测该测量仪倾角。 1
同时ADC10模块支持快速10位模数转换,且无需 CPU 的干预即可对 ADC 采样进行转换和存储,这一功能为系统收集数据提供了方便。而MSP430g2553的低功耗工作模式更是符合我们超低功耗的要求。
综合上述两种方案。我们选择方案二。MSP430g2553更加符合我们的需求,同时也能高要求的完成测量仪的功能,同时大大降低了复杂度,整个系统的性价比也很高。
2.2 数据采集模块
方案一:采用数字式传感器可将被测参数直接转换成数字信号输出,因此它具有以下特点:
(1)精确度和分辨率高;
(2)抗干扰能力强,便于远距离传送;
(3)信号易于处理和存储,便于与计算机接口;
(4)可以减小读数误差。
正因为如此,数字式传感器引起了人们的普遍重视。然而到目前为止数字式传感器的种类还不多,而符合我们要测量三个方向上的分量的功能还没有,外接电路会增加电路的复杂度,故此方案不可以用。
方案二:采用三轴加速度传感器MMA7361LC模块,该模块可根据物体运动和方向改变输出信号的电压值,如果沿着某一方向活动,或者受到重力作用,输出电压就会根据其运动方向以及设定的传感器灵敏度而改变其输出电压,而且有X、Y、Z三个方向的量输出,省去外置AD转换电路,可直接与MSP430g2553的ADC10口相连从而达到采集数据并保存到芯片中的目的,并且还节约了成本。
综合考虑以上两种方案,选择方案二。
2.3 数据显示模块
方案一:使用数码管显示。数码管电压低、寿命长、对外界环境要求低,易于维护,同时它是采用BCD编码显示数字,亮度高。但是其耗能大,电路复杂,占用资源较多,且显示信息少,精度低。
方案二:使用液晶屏显示。LCD具有轻薄短小、低耗电量、影像稳定不闪烁等优势,可视面积大,画面效果好,显示信息量大,分辨率高且抗干扰性强;外围电路少,使用方便。
综合考虑以上两种方案,选择采用方案二。
2.4 系统的总体设计方案
经过方案比较和论证,最终确定的总体设计框图如图1所示
图1 总体设计框图
2
整个系统没有内置电池和发电装置,系统的供电均由供电模块提供。供电流程是先将2200μF的电容充电至25V,然后经过滤波,降压电路输出各模块的工作电压。MMA7361传感器负责采集数据,它也可以同时测量X、Y、Z三个方向上的分量,并将数据传送到MSP430g2553芯片中,经过数据的计算和统计,MSP430g2553将最终结果经液晶显示屏显示出来。至此,倾角测量仪的功能全部完成。
3 系统硬件电路详细设计及工作原理
3.1 供电模块电路设计
刚开始我们使用2200μF的电容充电至25V充当电源,电压经过滤波之后再用三端稳压集成电路7805降压,经过一个1K的限流电阻之后,用TL431将电压转化并输出成所需要的芯片的工作电压,连好电路以后,经过几组数据的观察与计算,发现7805的功耗对于任务来说过大,故我们果断放弃这个思路,将7805与TL431用LM2941S代替。LM2941S的输出电压为5V,且功耗小,可以带动单片机正常工作且符合任务的设计要求,同时也简化了电路。
3.2数据采集模块
3.2.1采集原理
本功能的实现我们使用的是MMA7361三轴加速度传感器。加速度不能直接表示物体的倾角,需要通过公式转换才能得到倾角值。设X轴与水平面的夹角为俯仰角ρ,Y轴与水平面的夹角为横滚角φ。下面以俯仰角为例,进行计算公式的推导。当加速度传感器水平放置在水平面上时,其初始状态坐标系如图2所示:
Y Y
X
X
Z Z ρ
Z
图2 初始状态坐标系 图3 俯仰变化后的坐标系
此时俯仰角为0,各轴上的静态加速度值:
AX?0g 公式(1)
A
AY?0g 公式(2) ?1g 公式(3) Z
当X轴与水平面产生俯仰角ρ时,加速度传感器的坐标系如图3所示;将坐标系投影到XZ轴平面,可得如图4所示的平面坐标系,由此可得各轴上的静态加速度值: 3
A
X
??lg?sin?
公式(4)
AA
Y
?0g
公式(5)
公式(6)
Z
?lg?cos?
由上述等式,可以得到俯仰角的计算公式:
n(Y ???arctaA
A) 公式(7)
Z
图4 XZ轴平面坐标系
同理可得横滚角的计算公式:
??arctan(
A
X
A) 公式(8)
Z
3.2.2三轴加速度传感器与MSP430的接口
管脚对应接法如表1所示。因为MSP430g2553只
有P1口有模拟输入的功能,所以传感器的输出端口X、Y、Z分别与P1口的P1.0,P1.1,P1.2相连。为实现低功耗,传感器使用的是3.3V的电源。
3.3 数据显示模块
数据显示模块我们使用的是5110液晶屏,它有两种接线方式,一种是8位数据线接法,但这种方法连线较多且占用单片机的管脚较多,故我们采用第二种接法,即四线接法,就是只使用高4位数据线,再连接一个使能端口,一个寄存器选择端口,一共6个端口接入MSP430g2553芯片。对应接法如右表2所示:
表2 LCD管脚接线表
3.4 低功耗设计模块
对于低功耗要求的设计,在单片机方面我们选的是具有超低耗特性的MSP430g2553,它在电源不太稳定的情况下也可以正常工作,这种特性可确保我们的电路在超低功耗下仍可继续工作。那在电路设计上我们也用低功耗的LM2941S代替了功耗较高的7805和TL431。对于传感器和液晶显示屏,我们选用的是功耗相对来说较小的MMA7361LC和5110显示屏。
4 系统软件设计
开发环境简介: CCSV5代码调试器是一种合成开发环境,在Windows操作系统下采用图形接口界面,提供有环境配置、源文件编辑、程序调试、跟踪和分析等工具。所有的调试和分析能力集成在一个Windows环境中。
4
开发语言:C语言。软件控制流程如图5所示
5 调试,测试方法及结果分析
5.1硬件调试
系统硬件调试主要包括供电模块调试、数据采集模块调试、数据显示模块调试以及上述电路联调等过程。从调试过程看,主要有以下特殊问题需要考虑:
(1)影响传感器测量精度的因素:如果传感器运动状态发生改变会影响测量,数据会有明显错误,且在测试开始前,传感器应尽可能地校正好,尽量避免误差,提高测量的精确度。
(2)在低功耗的前提下,应让供电模块电路在可正常工作的前提下充放电时间尽可能的长。 5.2软件调试
软件是实现系统功能的重要组成部分,也是本作品设计和调试中的难点。本作品的软件流程虽然不是非常复杂,但是也需要考虑到各个模块的执行条件,运行速度,尽量优化使程序更加简洁明了和结构化。软件调试过程主要涉及传感器信号输入模块、数据处理模块、显示模块,首先需要调试的是各个模块本身的运行情况,然后再调试多个模块的联合运行情况,最后再调试所有模块的联合运行情况。 5.3系统测试
图5程序流程图
完成作品设计和调试后,对系统的功能和性能进行了测试。在功能上的测试包括按键测量,显示分辨率为0.1度,可以测量并显示沿X、Y、Z方向重力加速度分量等等,测试结果表明上述功能本作品都已实现。
表3是测试数据结果的统计及计算:
5
6 总结
经过小组成员的一致努力,完成了本次设计任务,达到了预期目的。设计并制作了一个基于MSP430g2553的具有测量并显示物体的倾角,测量并显示沿X、Y、Z方向重力加速度分量等功能的超低功耗倾角测量仪,经测试,该系统达到了设计的几项要求,其性能指标基本满足任务要求。
参考文献
[1]黄智伟.全国大学生电子设计竞赛.常用电路模块制作[M]. 北京:北京航空航天大学出版社,20xx年,第1版.
[2]谢兴红,林凡强,吴雄英. MSP430单片机基础与实践[M]. 北京:北京航空航天大学出版社,20xx年,第1版.
[3]谭浩强.C程序设计(第四版)[M]. 北京:清华大学出版社,20xx年,第4版.
[4]谢楷,赵建.MSP430系列单片机系统工程设计与实践[M]. 北京:机械工业出版社,20xx年,第1版.
6
7
3、显示模块程序
void LCD_init(void);
unsigned char Key_Push_Flag=0; char LCDBuf1[]=" ";
8
void delay_1us(void) //1us延时函数
{
unsigned int i;
for(i=0;i<100;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i;
for (i=0;i<n;i++)
for (i=0;i<1140;i++);
}
//写数据到LCD,输入参数:data :写入的数据; command :写数据/命令选择;void LCD_write_byte(unsigned char dat, unsigned char command)
{
unsigned char i;
LCD_5110_OUT &= ~(0x01 << LCD_CE); // msp430
if (command == 0)
LCD_5110_OUT &= ~(0x01 << LCD_DC);
else
LCD_5110_OUT |= (0x01 << LCD_DC);
for(i=0;i<8;i++)
{
if(dat&0x80)
LCD_5110_OUT |= (0x01 << LCD_DIN);
else
LCD_5110_OUT &= ~(0x01 << LCD_DIN);
LCD_5110_OUT &= ~(0x01 << LCD_CLK);
dat = dat << 1;
LCD_5110_OUT |= (0x01 << LCD_CLK);
}
LCD_5110_OUT |= (0x01 << LCD_CE);
}
void LCD_clear(void) // LCD清屏函数
{
unsigned int i;
LCD_write_byte(0x0c, 0);
LCD_write_byte(0x80, 0);
for (i=0; i<504; i++)
LCD_write_byte(0, 1);
}
void LCD_init(void) //5110LCD初始化
9
{
LCD_5110_DIR |= (0x01 << LCD_RST) + (0x01 << LCD_CE) + (0x01 << LCD_DC) + (0x01 << LCD_DIN) + (0x01<< LCD_CLK);
LCD_5110_OUT &= ~(0x01 << LCD_RST);
delay_1us();
LCD_5110_OUT |= (0x01 << LCD_RST);
LCD_5110_OUT &= ~(0x01 << LCD_CE);
delay_1us();
LCD_5110_OUT |= (0x01 << LCD_CE);
delay_1us();
LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
LCD_write_byte(0xc8, 0); // 设置偏置电压
LCD_write_byte(0x06, 0); // 温度校正
LCD_write_byte(0x13, 0); // 1:48
LCD_write_byte(0x20, 0); // 使用基本命令
LCD_clear(); // 清屏
LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
LCD_5110_OUT &= ~(0x01 << LCD_CE);
}
void LCD_write_char(unsigned char c) //显示英文字符,输入参数:c:显示的字符
{
unsigned char line;
c -= 32;
for (line=0; line<6; line++)
LCD_write_byte(font6x8[c][line], 1);
}
//英文字符串显示函数,输入参数:*s :英文字符串指针;X、Y: 显示字符串的位置,x 0-83 ,y 0-5
void LCD_STR(unsigned char X,unsigned char Y,char *s)
{
LCD_write_byte(0x40 | Y, 0);
LCD_write_byte(0x80 | (X*7), 0);
while (*s)
{
LCD_write_char(*s);
s++;
}
}
4、数据采集模块程序
LCD_init(); //初始化液晶
LCD_clear(); //清屏
10
delay_nms(100);
ADC10CTL1 = INCH_2 + CONSEQ_3; //最大采样通道为P1^2,采用序列多次采样的模式,INCH_X决定了采样通道为AX~A0;
ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE +REFON+REF2_5V+SREF_1; //内部参考电压2.5V
ADC10DTC1=0x3F; // 一共采样18次
ADC10AE0|=0x07; //使能通道A2~A0
for (;;)
{
if((Key_Push_Flag))
delay_nms(15);
if((Key_Push_Flag))
{
ADC10CTL0 &= ~ENC;
while (ADC10CTL1 & BUSY); //判断是否有采样或转换动作 ADC10CTL0 |= ENC + ADC10SC; // 开始采样
ADC10SA=(unsigned int )a; //将组数a的首地址作为采样的起始地址,对A3~A0依次采样放入数组a[0]~a[2]中
for (i=0;i<3;i++)
{
b[i]=0;
for (j=0;j<6;++j)
b[i]+=a[2-i+j*3];
b[i]/=6; //取6次采样的平均
v[i]=b[i]*2.5/1023; //转化为电压值
}
v[0]=v[0]-1.51;
v[1]=v[1]-1.75;
v[2]-=1.62;
g[0]=v[0]*9.8/(2.5-1.51); //X轴重力加速度分量 g[1]=v[1]*9.8/(2.5-1.75); //Y轴重力加速度分量 g[2]=v[2]*9.8/(2.5-1.62); //Z轴重力加速度分量 g[3]=atan2(v[1],v[2])*180/3.14; //倾斜角
for (i=0; i<3; i++)
{
if(g[i]<0) g[i]=0;
if(g[i]>9.8) g[i]=9.8;
ltoa((int)g[i],LCDBuf1);
LCD_STR(i*4,row, LCDBuf1);
11
delay_nms(10); LCD_STR((1+i*4),row, "."); delay_nms(10); ltoa(10*(g[i]-(int)g[i]),LCDBuf1); LCD_STR((2+i*4),row, LCDBuf1); delay_nms(10); } ltoa((int)g[3],LCDBuf1);
}
}
LCD_STR(1,row+2, LCDBuf1); delay_nms(10); row^=1; Key_Push_Flag=0; 12