简易风洞及控制系统设计报告 - 图文

更新时间:2023-10-27 15:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2014年TI杯大学生电子设计竞赛

简易风洞及控制系统G题(高职高专组)

2014.8.13

1

摘 要

风洞是以人工的方式产生并且控制气流,用来模拟飞行器或实体周围气体的流动情况,并可量度气流对实体的作用效果以及观察物理现象的一种管道状实验设备,它是进行空气动力实验最常用、最有效的工具。

本设计主要通过MSP430单片机控制直流风机完成简易风洞试验。风洞由圆管,连接部与直流风机构成,由单片机产生PWM控制直流风机的转速,通过红外对管阵列采集光强信息检测小球在圆管中的位置,同时由12864液晶显示小球的高度位置及维持状态的时间,从而实现小球在简易风洞中的位置控制。

关键词:MSP430,直流风机,红外对管,风洞

2

目 录

1.系统方案...................................................................................................................................... 4

1.1 主控板模块的论证与选择 .............................................................................................. 4 1.2 测距模块的论证与选择 .................................................................................................. 4 1.3 显示模块的论证与选择 .................................................................................................. 4 1.4 电机驱动模块的论证与选择 ............................................................................................ 5 1.5 电源模块的论证与选择 .................................................................................................... 5 2.电路设计........................................................................................................................................ 6

2.1系统总体框图 ..................................................................................................................... 6 2.2单片机最小系统..................................................................................................................6

2.2.1 MSP430单片机介绍 ............................................................................................... 7 3.1.2 单片机最小系统设计框图 ..................................................................................... 8 3.1.3 单片机最小系统设计原理图 ................................................................................. 8 2.3红外对管阵列测距模块及其电路 ..................................................................................... 9

2.3.1红外对管工作原理 .................................................................................................. 9 2.3.2红外对管阵列电路图 .............................................................................................. 9 2.4直流风机模块及其电路 ................................................................................................... 10

2.4.1直流电机驱动L298N ........................................................................................... 10 2.4.2 L298N内部结构及电路图 ................................................................................... 10 2.5显示模块及其电路 ........................................................................................................... 11

2.5.1 12864液晶显示介绍 ............................................................................................. 11 2.5.2液晶并行接口说明 ................................................................................................ 12 2.5.3接口信号说明 ........................................................................................................ 12 2.6电源模块及其电路 ........................................................................................................... 13

2.6.1直流稳压电路工作原理 ........................................................................................ 13 2.6.2直流稳压电源电路图 ............................................................................................ 13

3程序设计...................................................................................................................................... 14

3.1程序功能描述 ................................................................................................................... 14 3.2程序设计思路 ................................................................................................................... 14

3.2.1 PWM控制风机转速 ............................................................................................. 14 3.2.2 PID闭环调节 ........................................................................................................ 14 3.3程序设计思路 .................................................................................................................. 15

3.3.1 主程序流程图 ..................................................................................................... 16 3.3.2 PWM调速子程序流程图 ................................................................................... 16

4测试方案与测试结果 .................................................................................................................. 16

4.1测试方案 ........................................................................................................................... 17 4.2 测试条件与仪器 .............................................................................................................. 17 4.3 测试结果及分析 .............................................................................................................. 17

4.3.1测试结果(数据) ..................................................................................................... 18 4.3.2测试分析与结论 .................................................................................................... 18

5 设计总结.................................................................. 19 附录1:电路原理图 ...................................................................................................................... 20 附录2:源程序 .............................................................................................................................. 21

3

1.系统方案

本系统主要由主控板模块、测距模块、显示模块、电机驱动模块、电源模块组成,下面分别论证这几个模块的选择。

1.1主控板模块的论证与选择

方案一:采用TI公司的MSP430F149,此款单片机功耗低,接口较多,内

部外设较多,中断较多,操作比51系列单片机稍微复杂,价格稍贵,但是性价比高。

方案二:采用ATMAL公司的51单片机,价格低廉,应用普遍,操作简单,

但是外设端口较少,多适合于初学者。

综上诉述,选择功耗低,接口多的MSP430单片机。

1.2测距模块的论证与选择

方案一:超声波测距,超声波是一种超出人类听觉极限的声波即其振动频

率高于20kHz的机械波。超声波测距的原理是根据超声波在空气中传播的反射原理,以超声波传感器为检测部件,应用单片机技术和超声波在空气中的时间差来测量距离。超声波测距仪在工作的时候就是将电压和超声波之间的互相转换,当超声波传感器发射超声波时,发射超声波的探头将电压转化的超声波发射出去,当接收超声波时,超声波接收探头将超声波转化的电压回送到单片机控制芯片,根据发射和接收的时间差,最终计算出超声波发生器到障碍物的实际 距离,完成测距,最后在LED显示电路中显示测量的距离。

方案二:红外线测距,利用的是红外线传播时的不扩散原理,当红外线从

测距仪发出碰到物体被反射回来被测距仪接收到,再根据红外线从发出到被接受到的时间及红外线的传播速度就可以算出距离。红外线信号在遇到障碍物其距离的不同则其反射的强度也不同,

根据这个特点从而对障碍物的距离的远近进行测量的。

方案三:红外对管阵列,通过并排的红外接收管阵列对物体反射光的接受

与否,搜索和跟踪系统,用于搜索和跟踪红外目标,确定其空间位置并对它的运动进行跟踪从而达到测距的目的。

综上,由于超声波在圆筒中有很大干扰,而且小球是曲面的,对光线的反射也会造成很大误差,因此选择红外对管阵列来测小球在圆筒中的高度。

1.3显示模块的论证与选择

方案一:采用1602屏做显示。1602屏幕便宜,使用起来编程也没有很多

繁琐的步骤。但是1602的汉字显示较麻烦及显示区域不够都是其弊端。1602难以到达需求的要求。

4

方案二:用12864显示屏做显示。12864的显示为128x6,显示面积大,数

字和汉字显示容易实现,程序要求不是很高,更加方便。

方案三:用彩屏做显示。彩屏显示效果好漂亮,但成本高,功耗大,编程

设计相对繁琐。

综上采用12864做显示屏。

1.4电机驱动模块的论证与选择

本次设计的主要目的是控制风机的转速,因此电机驱动模块是必不可少,其方案有以下两种。

方案一:采用大功率晶体管组合电路构成驱动电路,这种方法结构简单,

成本低、易实现,但由于在驱动电路中采用了大量的晶体管相互连接,使得电路复杂、抗干扰能力差、可靠性下降,我们知道在实际的生产实践过程中可靠性是一个非常重要的方面。因此此中方案不宜采用。

方案二:采用专用的电机驱动芯片,例如L298N、L297N等电机驱动芯

片,由于它内部已经考虑到了电路的抗干扰能力,安全、可靠行,所以我们在应用时只需考虑到芯片的硬件连接、驱动能力等问题就可以了,所以此种方案的电路设计简单、抗干扰能力强、可靠性好。设计者不需要对硬件电路设计考虑很多,可将重点放在算法实现和软件设计中,大大的提高了工作效率。

基于上述理论分析和实际情况,电机驱动模块选用方案二。

1.5电源模块设计方案

电源是任何系统能否运行的能量来源,无论那种电力系统电源模块都是不可或缺的,对于该模块考虑以下两种方案。

方案一:通过电阻分压的形式将整流后的电压分别降为控制芯片和电机运

行所需的电压,此种方案原理和硬件电路连接都比较简单,但对能量的损耗大,在实际应用系统同一般不宜采用。

方案二:通过固定芯片对整流后的电压进行降压、稳压处理(如7812、7805等),此种方案可靠性、安全性高,对能源的利用率高,并且电路简单容

易实现。

根据系统的具体要求,采用方案二作为系统的供电模块。

5

2.电路设计

2.1系统总体框图

液晶显示控制按键操作控制MSP430供电传感器检测检测电源模块供电直流风机控制

图2.1系统总体框图

2.2单片机最小系统

2.2.1 MSP430单片机介绍 1.处理能力强

MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7 种源操作数寻址、4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。这些特点保证了可编制出高效率的源程序。

2.运算速度快

MSP430 系列单片机能在25MHz晶体的驱动下,实现40ns的指令周期。16位的数据宽度、40ns的指令周期以及多功能的硬件乘法器(能实现乘加运算)相配合,能实现数字信号处理的某些算法(如FFT等)。

3.超低功耗

MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压和灵活而可控的运行时钟方面都有其独到之处。

首先,MSP430 系列单片机的电源电压采用的是1.8-3.6V 电压。因而可使其在

6

1MHz 的时钟条件下运行时,芯片的电流最低会在165μA左右,RAM保持模式下的最低功耗只有0.1μA。

其次,独特的时钟系统设计。在 MSP430 系列中有两个不同的时钟系统:基本时钟系统、锁频环(FLL 和FLL+)时钟系统和DCO数字振荡器时钟系统。可以只使用一个晶体振荡器(32.768kHz)DT-26 OR DT-38[4] ,也可以使用两个晶体振荡器。由系统时钟系统产生 CPU 和各功能所需的时钟。并且这些时钟可以在指令的控制下,打开和关闭,从而实现对总体功耗的控制。 由于系统运行时开启的功能模块不同,即采用不同的工作模式,芯片的功耗有着显著的不同。在系统中共有一种活动模式(AM)和五种低功耗模式(LPM0~LPM4)。在实时时钟模式下,可达2.5μA ,在RAM 保持模式下,最低可达0.1μA 。

4.片内资源丰富

MSP430 系列单片机的各系列都集成了较丰富的片内外设。它们分别是看门狗(WDT)、模拟比较器A、定时器A0(Timer_A0)、定时器A1(Timer_A1)、定时器B0(Timer_B0)、UART、SPI、I2C、硬件乘法器、液晶驱动器、10位/12位ADC、16位Σ-Δ ADC、DMA、I/O端口、基本定时器(Basic Timer)、实时时钟(RTC)和USB控制器等若干外围模块的不同组合。其中,看门狗可以使程序失控时迅速复位;模拟比较器进行模拟电压的比较,配合定时器,可设计出A/D 转换器;16 位定时器(Timer_A 和 Timer_B)具有捕获/比较功能,大量的捕获/比较寄存器,可用于事件计数、时序发生、PWM等;有的器件更具有可实现异步、同步及多址访问串行通信接口可方便的实现多机通信等应用;具有较多的 I/O 端口,P0、P1、P2 端口能够接收外部上升沿或下降沿的中断输入;10/12位硬件 A/D 转换器有较高的转换速率,最高可达200kbps ,能够满足大多数数据采集应用;能直接驱动液晶多达 160 段;实现两路的 12 位D/A转换;硬件I2C串行总线接口实现存储器串行扩展;以及为了增加数据传输速度,而采用的DMA模块。MSP430 系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。

另外,MSP430 系列单片机的中断源较多,并且可以任意嵌套,使用时灵活方便。当系统处于省电的低功耗状态时,中断唤醒只需5μs。

5.方便高效的开发环境 MSP430 系列有 OTP 型、 FLASH 型和 ROM 型三种类型的器件,这些器件的开发手段不同。对于 OTP 型和 ROM 型的器件是使用仿真器开发成功之后烧写或掩膜芯片;对于 FLASH 型则有十分方便的开发调试环境,因为器件片内有 JTAG 调试接口,还有可电擦写的 FLASH 存储器,因此采用先下载程序到 FLASH 内,再在器件内通过软件控制程序的运行,由 JTAG 接口读取片内信息供设计者调试使用的方法进行开发。这种方式只需要一台 PC 机和一个 JTAG 调试器,而不需要仿真器和编程器。开发语言有汇编语言和C 语言。

2.2.2 MSP430最小系统设计框图

7

下载及电源口引脚接口MSP430复位系统4独立按键时钟电路 图2.2.2 MSP430最小系统设计框图

2.2.3 MSP430最小系统设计原理图

图2.2.3MSP430最小系统设计原理图

2.3红外对管阵列测距模块及其电路

8

2.3.1红外对接管原理

它是由一个红外线发射管和一个光敏二极管组成的。无光照时,有很小的饱和反向漏电流(暗电流)。此时光敏管不导通。当光照时,饱和反向漏电流马上增加,形成光电流,在一定的范围内它随入射光强度的变化而增大,这样就可以判断出是否有物体。

因此可以采用一排红外对管测出测出物体的位置。

图2.3.1红外对管工作原理图

2.3.2红外对管阵列电路图

图2.3.2红外对管阵列电路图

2.4直流风机驱动模块及其电路 2.4.1.直流电机驱动L298N

9

电机驱动芯片L298N是SGS公司的产品,内部包含4通道逻辑驱动电路。是

一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。其引脚排列如图1中U4所示,1脚和15脚可单独引出连接电流采样电阻器,形成电流传感信号。L298可驱动2个电机,OUT1、OUT2和OUT3、OUT4之间分别接2个电动机。5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。也利用单片机产生PWM信号接到ENA,ENB端子,对电机的转速进行调节。 L298N的逻辑功能:

外形及封装:

图2.4.1 L298N实物图

2.4.2 L298内部结构图及电路图

10

图2.4.2-1 L298N内部结构图

图2.4.2-2直流电机驱动电路图

2.5显示模块及其电路

2.5.1 12864液晶显示介绍

12864是一种具有4位/8位并行、2线或3线串行多种接口方式,部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

11

图2.5.1 显示系统电路图

2.5.2 液晶并行接口说明

2.5.3接口信号说明

12

2.6电源模块及其电路

2.6.1直流稳压电路工作原理

在电子电路及设备中,一般都需要稳定的直流电源供电。小功率的稳压电源的组成如下图所示,它由电源变压器、整流电路、滤波电路和稳压电路四部分组成。

图2.6.1直流稳压电路工作原理

2.6.2直流稳压电源电路图

图2.6.2直流稳压电源电路图

13

3.程序设计

3.1程序功能描述

根据题目要求,软件部分主要实现风机转速控制以及键盘设置与液晶显示

(1)风机转速控制部分:在键盘按下设定的小球的高度位置后,小球5s内处于指定位置并稳定3秒以上,上下波动不超过±1cm,根据传感器测出的距离调整风机转速来调整小球在圆管中的位置。

(2)键盘设置部分:在键盘按下后,风机作出相应转速,小球达到指定位置 (3)液晶显示部分:液晶显示小球高度位置及维持时间

3.2.程序设计思路

3.2.1 PWM控制电机风速

本系统采用PWM来调节直流风机的速度。PWM是通过控制固定电压的直流电源开关频率,从而改变负载两端的电压,进而达到控制要求的一种电压调整方法。PWM可以应用在许多方面,如电机调速、温度控制、压力控制等。

在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并根据需要改变一个周期内“接通”和“断开”时间的长短。通过改变直流电机电枢上电压的“占空比”来改变平均电压的大小,从而控制电动机的转速。因此,PWM又被称为“开关驱动装置”。

在脉冲作用下,当电机通电时,速度增加;电机断电时,速度逐渐减少。只要按一定规律,改变通、断电的时间,即可让电机转速得到控制。

本系统中通过控制430单片机的TimerB,从而可以实现P4.1和P4.2输出口输出不同占空比的脉冲波形。设定CCR0,CCR1及CCR2的值, 就使P4.1或P4.2产生一个脉冲。 将直流电机的速度分为100个等级, 因此一个周期就有个100脉冲, 周期为100个脉冲的时间。速度等级对应一个周期的高电平脉冲的个数。占空比为高电平脉冲个数占一个周期总脉冲个数的百分数。一个周期加在电机两端的电压为脉冲高电压乘以占空比。占空比越大, 加在电机两端的电压越大, 电机转动越快。电机的平均速度等于在一定的占空比下电机的最大速度乘以占空比。当我们改变占空比时, 就可以得到不同的电机平均速度, 从而达到调速的目的。精确地讲, 平均速度与占空比并不是严格的线性关系, 在一般的应用中, 可以将其近似地看成线性关系。

3.2.2 PID闭环调节 1.PID算法简介

PID算法是基于反馈的。一般情况下,这个反馈就是速度传 感器返回给单片机当前电机的转速。简单的说,就是用这个反馈跟预设值进行比较,如果转速偏大,就减小电机两端的电压;相反,则增加电机两端的电压。

顾名思义,P指是比例(Proportion),I指是积分(Integral),D指微 分(Differential)。在电机调速系统中,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。

2.参数调整规则

由各个参数的控制规律可知,比例P使反应变快,微分D使反应提前,积

14

分I使反应滞后。在一定范围内,P,D值越大,调节的效果越好。各个参数的调节

原则如下:

PID调试一般原则

a.在输出不振荡时,增大比例增益P。 b.在输出不振荡时,减小积分时间常数Ti。

c. 输出不振荡时,增大微分时间常数Td。

3.PID流程图

图3.2.2 PID流程图

15

3.3程序流程图

3.3.1主程序流程图

图3.3.1主程序流程图

3.3.2 PWM控制电机子程序流程图

图3.3.2 PWM控制电机子程序流程图

16

3.3.3 12864液晶显示子程序

图3.3.3液晶显示子程序

4.测试方案与测试结果

4.1测试方案 1.硬件测试:

在通电情况下,直流风机能转动,且转速能够随加载在两端的电压变化而变化。

2.软件测试:

(1)使直流风机可通过PWM均匀调速;

(2)液晶采用并行输出,显示清晰稳定,效果良好。

4.2 测试条件与仪器

测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路基本无虚焊。

测试仪器:高精度的数字毫伏表,模拟示波器,数字示波器,数字万用表,指针式万用表,直尺,游标卡尺。

17

4.3测试结果及分析 4.3.1测试结果: 占 空 比 20% 30% 40% 50% 60% 70% 80% 90% 小球位置 底端 底端 CD段 CD段 BC段 BC段 AB段 顶端

实验次数 实验电压 1 2 3 4 5 6 7 8 9 10 12V 12V 12V 12V 12V 12V 12V 12V 12V 12V 占空比 73% 73% 73% 73% 73% 75% 75% 75% 75% 75% 小球位置 BC段5cm处 BC段5cm处 BC段4cm处 BC段5cm处 BC段6cm处 BC段9cm处 BC段9cm处 BC段8cm处 BC段9cm处 BC段9cm处 维持时间 4s 3s 5s 5s 3s 5s 5s 5s 4s 5s 4.3.2测试结果分析

根据上述测试数据,随着占空比的增加,风机的风速逐渐加大,小球在圆筒中的位置由低端升到最高端,在AB段、BC段、CD段可以维持3—5s,由此可以得出以下结论:

1、风机的转速可通过PWM调控且成正比关系; 2、小球的状态可由传感器检测; 综上所述,本设计达到设计要求。

18

5.设计总结

1、首先,不得不说说这几天我们在这方面所做的努力。真可谓是废寝忘食,分秒必争。所有的软硬件设计都是组员们坚持不懈的结果,世上无难事,只怕有心人,没有一样事情是在付出了莫大的努力后却一点回报都没有的。

2、在硬件装焊方面要有足够的耐心和细心,就算电路设计的再好,在焊接时出一点小差错,也是不允许的,往往电路的错误都是由于一些小问题引起的,如短路,虚焊等,将造成不可预测后果。

3、程序设计方面,也遇到不少的问题。起初是解决如何测出小球在圆筒中的位置高度,因为小球表面是曲面,用红外测距无法找到合适的测量点,反射的光会产生很大误差,超声波测距在圆筒中会产生干扰回波,反复试验了很多次都无法达到测出小球位置的目的,最后在大家的集思广益之下,想出了用红外对管阵列。还有一个困扰很久的难题是如何均匀控制风机的转速,最初测试的时候,小球在圆筒中要么起不来,要么就是很快就升到顶端,不能很好控制小球的位置,在测试多次后,不断将PWM的值进行细分,终于皇天不负苦心人,风机的转速能通过PWM很好地控制了。

4、由于PWM脉冲的频率较高,风机在转动的过程中会发生啸叫,我们就想到了在风机转动过程中插入音乐,美妙的音乐不仅可以掩盖啸叫,还可以达到舒缓心情的效果。

《中庸》中说“博学之,审问之,慎思之,明辨之,笃行知”,博学广识,审慎好问,谨慎思考,明辨是非,笃定行动,不仅是这次设计中所体现的,在以后的所有设计中都需要持之以恒地做到。

19

:电路原理图

图1最小系统板

图2直流稳压电源

20

附录1

uint T=0; uint t; uchar k,j;

//世上只有妈妈好数据表

static unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,

6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,

6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,

5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,

2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0

}; // 音阶频率表 高八位

static unsigned char FREQH[]={

0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,

0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,

0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, } ; // 音阶频率表 低八位

static unsigned char FREQL[]={

0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,

0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i

0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, };

void mainTimerBInit(void) {

// WDTCTL = WDTPW + WDTHOLD; // Stop WDT // P1DIR |= 0x01; // P1.0 output // CCTL0 = CCIE; // CCR0 interrupt enabled // CCR0 = 5000;

// TACTL = TASSEL_2 + MC_2; // SMCLK, contmode

//WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR |= 0x01; // P1.0 output

46

TBCCTL0 = CCIE; // CCR0 interrupt enabled TBCCR0 = 5000;

TBCTL = TBSSEL_2 + MC_2; // SMCLK, contmode }

void songDelay(uchar t) {

uchar t1; uint t2;

for(t1 = 0; t1 < t; t1++) {

for(t2 = 0; t2 < 8000; t2++) {

delay_us(30); } } }

void play(void) {

j=0;

while(j < 100)

{ //音乐数组长度 ,唱完从头再来 k = sszymmh[j] + 7 * sszymmh[j + 1] - 1; timer0h = FREQH[k]; timer0l = FREQL[k]; timerall = timer0h; timerall <<= 8;

timerall += timer0l;

timerall = 65536 - timerall; delaytime = sszymmh[j + 2]; j = j + 3;

songDelay(delaytime); }

_NOP(); }

// Timer A0 interrupt service routine // #pragma vector=TIMERA0_VECTOR // __interrupt void Timer_A (void)

47

// {

// P1OUT ^= 0x01; // Toggle P1.0

// CCR0 += timerall; // Add Offset to CCR0 // }

// Timer B0 interrupt service routine #pragma vector=TIMERB0_VECTOR __interrupt void Timer_B (void) {

P1OUT ^= 0x01; // Toggle P1.0

TBCCR0 += timerall; // Add Offset to CCR0 // play(); /* t++; if(t==120) {

// stop(); T++; t=0; }*/ }

48

图3简易风洞装置

附录2:源程序

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

主程序

********************************************************************/ #include

21

#include #include\#include\//TA_PWM

#include\#include\#include\

#define uchar unsigned char #define uint unsigned int #define ulong unsigned long //P3DIR |=BIT0; //P3DIR |=BIT1; uint m=0;

//uint T=0; //uint t; uint mm=750; uint nn=620; /*

void run() {

P3OUT |=BIT0; P3OUT |=~BIT1; }*/

void stop() {

P3OUT |=~BIT0; P3OUT |=~BIT1; }

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

// 系统时钟初始化

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

void Clock_Init() {

uchar i;

BCSCTL1 &=~XT2OFF; do {

IFG1 &= ~OFIFG; //clear invalidation flag

22

for (i=0xff;i>0;i--); }

while ((IFG1 & OFIFG) !=0);//FLAG is exist BCSCTL2 |=SELM1; //MCLK=LFXT2 }

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

// MSP430内部看门狗初始化

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

void WDT_Init() {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 }

// 主程序

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

void main(void) {

// uchar i;

WDT_Init(); //看门狗设置 P3DIR |= 0xFF; // P4.0 输出 // P3DIR |=BIT0; // P3DIR |=BIT1;

Clock_Init(); //系统时钟设置 mainTimerBInit();

// TBCCTL0 = CCIE; // CCR0 interrupt enabled

// TBCCR0 =8000;

// _BIS_SR(GIE); // Enter LPM0 w/ interrupt在in430头文件中

// TBCTL = TBSSEL_2 + MC_1; // SMCLK, cont mode连续模式

LCDIO_Init(); //12864液晶io初始化

Port_init(); //系统初始化,设置IO口属性

TA_PWM_Init('S',1,'P','O'); TA_PWM_SetPeriod(510); // PWM_int(); _EINT();

23

Init_keyPort(); //按键IO初始化

keyboard_int(); //矩阵键盘初始化

/* delay_ms(200);

LCD_clear(); //清屏

LCD_PutString(0,1,\祝2014年湖北省TI\ LCD_PutString(0,2,\杯电子设计大赛取\ LCD_PutString(0,3,\得圆满成功\ LCD_PutString(2,4,\ for(i=0;i<20;i++) delay_ms(200); LCD_clear();

LCD_PutString(2,1,\

LCD_PutString(1,2,\ LCD_PutString(1,3,\

LCD_PutString(1,4,\ for(i=0;i<10;i++) delay_ms(200);

LCD_clear(); //清屏

photodisplay(Photo1); //显示图片1 for(i=0;i<20;i++) delay_ms(200); LCD_clear(); */ while(1) {

Display(); //矩阵键盘扫描 TJ();

// play();

// TA_PWM_SetPermill(1,500);

sprintf(displaytemp,\ LCD_PutString(0,1,displaytemp);

// sprintf(displaytemp,\ // LCD_PutString(4,1,displaytemp);

sprintf(displaytemp,\ LCD_PutString(0,2,displaytemp);

sprintf(displaytemp,\ LCD_PutString(0,3,displaytemp);

sprintf(displaytemp,\距离:%d \

24

LCD_PutString(0,4,displaytemp); //if(CM==4) // { //}

if(keyval==12) {

_NOP(); if(CM==1) {

/* TA_PWM_SetPermill(1,800); delay_ms(1000);

TA_PWM_SetPermill(1,690); delay_ms(10000);*/

TA_PWM_SetPermill(1,0); delay_ms(2000);

TA_PWM_SetPermill(1,850); delay_ms(10000);

TA_PWM_SetPermill(1,0); delay_ms(2000);

TA_PWM_SetPermill(1,800); delay_ms(5000);

TA_PWM_SetPermill(1,570); delay_ms(4000);

TA_PWM_SetPermill(1,800); delay_ms(4000);

TA_PWM_SetPermill(1,570); delay_ms(4000);

TA_PWM_SetPermill(1,1000); delay_ms(10000); _NOP(); _NOP(); }

// if(CM==3) {

TA_PWM_SetPermill(1,50); _NOP(); if(CM==6) {

TA_PWM_SetPermill(1,1000); delay_ms(400);

TA_PWM_SetPermill(1,690); delay_ms(40000);

25

_NOP(); } }

if(CM==2) {

TA_PWM_SetPermill(1,690); delay_ms(5000); _NOP(); if(CM==5) {

TA_PWM_SetPermill(1,950); _NOP(); _NOP();

if(CM==6) {

TA_PWM_SetPermill(1,690); _NOP(); _NOP(); } } } _NOP(); _NOP(); }

if(CM==4) {

_NOP();

delay_ms(20); if(CM==4) {

play(); } } } } /*

#pragma vector=TIMERB0_VECTOR __interrupt void Timer_B (void) {

//P3OUT=0x00;

26

t++;

if(t==120) {

// stop(); T++; t=0; } }*/

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

12864显示字符和图片程序

********************************************************************/ #include \#include\#include\

//#define Key_Dir P1DIR //#define Key_Port P1OUT #define uchar unsigned char #define uint unsigned int #define ulong unsigned long

/*12864应用指令*/

#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H #define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置

#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)

#define FUN_MODE 0x30 //工作模式:8位基本指令集

#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白 #define DISPLAY_OFF 0x08 //显示关 #define CURSE_DIR 0x14 //游标向右移动:AC=AC+1 #define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH #define SET_DD_AC 0x80

#define P50 0 #define P51 1 #define P55 5 #define P56 6 #define P57 7

#define RS_CLR P5OUT &= ~(1 << P55) //RS置低

27

#define RS_SET P5OUT |= (1 << P55) //RS置高

#define RW_CLR P5OUT &= ~(1 << P56) //RW置低 #define RW_SET P5OUT |= (1 << P56) //RW置高

#define EN_CLR P5OUT &= ~(1 << P57) //E置低 #define EN_SET P5OUT |= (1 << P57) //E置高

#define PSB_CLR P5OUT &= ~(1 << P50) //PSB置低,串口方式 #define PSB_SET P5OUT |= (1 << P50) //PSB置高,并口方式

#define RST_CLR P5OUT &= ~(1 << P51) //RST置低 #define RST_SET P5OUT |= (1 << P51) //RST置高

#define DataPort P4OUT //P4口为数据口

uchar displaytemp[32];//定义显示区域临时存储数组 const uchar user16x16[]={ //笑脸图片

0x0F,0xF0,0x10,0x08,0x20,0x04,0x40,0x02,0x9C,0x39,0xBE,0x7D,0x80,0x01,0x80,0x01,

0x80,0x01,0x88,0x11,0x84,0x21,0x43,0xC2,0x20,0x04,0x10,0x08,0x0F,0xF0,0x00,0x00, };

const uchar pic1[]= // 图片代码 {

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x1F,0xFF,0x81,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

28

0xC0,0x1F,0xFF,0x81,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x18,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00,0x03,

0xC0,0x1F,0xFF,0x80,0x00,0x00,0x04,0x07,0x81,0xE0,0x10,0x10,0x03,0xC0,0x30,0x03,

0xC0,0x1F,0xFF,0x80,0x00,0x00,0x0C,0x0C,0xC3,0x30,0x08,0x20,0x0C,0xE0,0x70,0x03,

0xC0,0x18,0x01,0x87,0xFF,0xFE,0x3C,0x18,0x66,0x18,0x04,0x40,0x0C,0x60,0x70,0x03,

0xC0,0x1F,0xFF,0x87,0xFF,0xFE,0x0C,0x18,0x66,0x18,0x02,0x80,0x18,0x00,0xB0,0x03,

0xC0,0x1F,0xFF,0x80,0x06,0x00,0x0C,0x18,0x66,0x18,0x01,0x00,0x1B,0x81,0x30,0x03,

0xC0,0x01,0x98,0x00,0x06,0x00,0x0C,0x00,0xE3,0x30,0x02,0x80,0x1C,0xC1,0x30,0x03,

0xC0,0x19,0x99,0x80,0x66,0x60,0x0C,0x00,0xC1,0xE0,0x04,0x40,0x18,0x62,0x30,0x03,

0xC0,0x19,0x99,0x80,0x66,0x30,0x0C,0x01,0x83,0x30,0x08,0x20,0x18,0x66,0x30,0x03,

0xC0,0x0D,0x9B,0x00,0xC6,0x38,0x0C,0x03,0x06,0x18,0x10,0x10,0x18,0x67,0xFC,0x03,

0xC0,0x0D,0x9B,0x01,0xC6,0x1C,0x0C,0x06,0x06,0x18,0x20,0x08,0x18,0x60,0x30,0x03,

0xC0,0x01,0x98,0x03,0x86,0x0C,0x0C,0x0C,0x06,0x18,0x00,0x00,0x08,0x60,0x30,0x03,

0xC0,0x7F,0xFF,0xE3,0x06,0x00,0x0C,0x18,0x03,0x30,0x00,0x00,0x0C,0xC0,0x30,0x03,

0xC0,0x7F,0xFF,0xE0,0x1E,0x00,0x0C,0x1F,0xE1,0xE0,0x00,0x00,0x07,0x80,0x30,0x03,

0xC0,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

29

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x18,0x00,0x00,0x00,0x06,0x0C,0x03,

0xC3,0xFF,0xFC,0x3F,0xF0,0x80,0x0C,0x00,0x3F,0x18,0x01,0xFF,0xFE,0x06,0x0C,0x03,

0xC3,0xFF,0xFC,0x3F,0xF1,0x80,0x0F,0xFC,0x3F,0x18,0x01,0xFF,0xFE,0x06,0x0C,0x03,

0xC3,0x0C,0x0C,0x0C,0xC3,0x00,0x0F,0xFC,0x33,0x7F,0xE1,0x86,0x06,0x06,0x0C,0x03,

0xC3,0x1F,0xCC,0x0C,0xC6,0x00,0x0C,0x00,0x33,0x7F,0xE1,0x8F,0xE6,0x06,0x0C,0x03,

0xC3,0x3F,0xCC,0x0C,0xCC,0x00,0x0C,0x00,0x36,0x30,0x01,0x9F,0xE6,0x07,0xFF,0xE3,

0xC3,0x79,0x8C,0x0C,0xC8,0x00,0xFF,0xF0,0x36,0x36,0x01,0xBC,0xC6,0x07,0xFF,0xE3,

0xC3,0x6F,0x0C,0x7F,0xF0,0xC0,0xFF,0xF0,0x36,0x66,0x01,0xB7,0x86,0x06,0x00,0x03,

0xC3,0x0F,0x0C,0x7F,0xF1,0x80,0xC0,0x30,0x36,0x7F,0xC1,0x87,0x86,0x06,0x00,0x03,

0xC3,0x79,0xEC,0x0C,0xC3,0x00,0xC0,0x30,0x33,0x7F,0xC1,0xBC,0xF6,0x06,0x00,0x03,

0xC3,0x76,0xEC,0x0C,0xC6,0x00,0xC0,0x30,0x33,0x06,0x01,0xBB,0x76,0x07,0xFF,0x03,

0xC3,0x07,0x0C,0x0C,0xCC,0x20,0xFF,0xF0,0x33,0x06,0x01,0x83,0x86,0x07,0xFF,0x03,

0xC3,0x03,0x0C,0x18,0xC8,0x60,0xFF,0xF0,0x3F,0x06,0x01,0x81,0x86,0x06,0x03,0x03,

0xC3,0x1C,0x0C,0x18,0xC0,0xC0,0x00,0x00,0x3E,0xFF,0xE1,0x8E,0x06,0x06,0x03,0x03,

0xC3,0x1F,0x0C,0x18,0xC1,0x81,0xB1,0x8C,0x30,0xFF,0xE1,0x8F,0x86,0x06,0x03,0x03,

0xC3,0x03,0x0C,0x30,0xC7,0x01,0xB1,0x8C,0x30,0x06,0x01,0x81,0x86,0x0C,0x03,0x03,

0xC3,0xFF,0xFC,0x70,0xDE,0x03,0x18,0xC6,0x30,0x06,0x01,0xFF,0xFE,0x0C,0x03,0x03,

0xC3,0xFF,0xFC,0x20,0x18,0x03,0x18,0xC6,0x30,0x06,0x01,0xFF,0xFE,0x18,0x03,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,

30

// 初始化IO口子程序

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

void Port_init() {

delay_ms(40);

PSB_SET; //液晶并口方式 delay_ms(1); RST_CLR;

delay_ms(1);

RST_SET; //复位脚RST置高 delay_us(10);

LCD_write_com(0x30); //选择基本指令集 delay_us(100); //延时大于100us

LCD_write_com(0x30); //选择8bit数据流 delay_us(37); //延时大于37us

LCD_write_com(0x0c); //开显示(无游标、不反白) delay_us(100); //延时大于100us

LCD_write_com(0x01); //清除显示,并且设定地址指针为00H delay_ms(10); //延时大于10ms

LCD_write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动 delay_us(100); //延时大于100us }

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

// 显示屏清空显示

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

void LCD_clear(void) {

LCD_write_com(0x34); //扩充指令操作 delay_ms(15);

LCD_write_com(0x30); //基本指令操作 delay_ms(15); LCD_write_com(0x01);

36

delay_ms(15); }

/*------------------------------------------------ 用户自定义字符

------------------------------------------------*/

void CGRAM() {

int i;

LCD_write_com(0x30); LCD_write_com(0x40); for(i=0;i<16;i++) {

LCD_write_data(user16x16[i*2]);

LCD_write_data(user16x16[i*2+1]); } }

/*------------------------------------------------ 显示用户自定义字符

------------------------------------------------*/

void DisplayCGRAM(unsigned char x,unsigned char y) {

switch(y) {

case 1: LCD_write_com(0x80+x);break; case 2: LCD_write_com(0x90+x);break; case 3: LCD_write_com(0x88+x);break; case 4: LCD_write_com(0x98+x);break; default:break; }

LCD_write_data(00); LCD_write_data(00);

}

/*------------------------------------------------ 显示字符串 x:横坐标值,范围0~8 y:纵坐标值,范围1~4

------------------------------------------------*/

37

void LCD_PutString(uchar x,uchar y,uchar *s) {

switch(y) {

case 1: LCD_write_com(0x80+x);break; case 2: LCD_write_com(0x90+x);break; case 3: LCD_write_com(0x88+x);break; case 4: LCD_write_com(0x98+x);break; default:break; }

while(*s>0) {

LCD_write_data(*s); s++;

delay_us(50); } }

/********************************************************* * * * 图形显示 * * * *********************************************************/ void photodisplay(const uchar *bmp) {

uchar i,j;

LCD_write_com(0x34); //写数据时,关闭图形显示

for(i=0;i<32;i++) {

LCD_write_com(0x80+i); //先写入水平坐标值 LCD_write_com(0x80); //写入垂直坐标值

for(j=0;j<16;j++) //再写入两个8位元的数据 LCD_write_data(*bmp++); // delay_ms(1); }

for(i=0;i<32;i++) {

LCD_write_com(0x80+i); LCD_write_com(0x88);

for(j=0;j<16;j++)

38

LCD_write_data(*bmp++); //delay_ms(1); }

LCD_write_com(0x36); //写完数据,开图形显示 }

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

PWM调速程序

********************************************************************/ #include #include\

#define uchar unsigned char #define uint unsigned int

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

* 名 称:TA_PWM_Init()

* 功 能:TA定时器作为PWM发生器的初始化设置函数 * 入口参数:Clk:时钟源 'S'=SMCLK; 'A'=ACLK ; _____

'E'=TACLK(外部输入) 'e'= TACLK(TACLK取反) Div:时钟分频系数: 1/2/4/8

Mode1:通道1的输出模式 'P'设为高电平输出,'N'低电平 ,0=禁用

Mode2:通道2的输出模式 'P'设为高电平输出,'N'低电平 ,0=禁用

* 出口参数:1表示设置成功,0表示参数错误,设置失败。

* 说 明: 在调用PWM相关函数之前,需要调用该函数设置TA的模式和时钟源。

* 范 例: TA_PWM_Init('A',1,'P','P')TA时钟设为ACLK,通道1和通道2均为高电平输出

TA_PWM_Init('S',4,'N','N')TA时钟设为SMCLK/4, 通道1、2均为低电平输出

TA_PWM_Init('A',1,'P',0)TA时钟设为ACLK,通道1高电平输出,通道2不用,被

禁用的PWM通道的输出管脚仍可作为普通IO口使用。

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

char TA_PWM_Init(char Clk,char Div,char Mode1,char Mode2) {

TACTL =0;// 清除以前设置

TACTL|=MC_1; //定时器TA设为增量计数模式 switch(Clk) //为定时器TA选择时钟源

39

{

case 'A': TACTL|=TASSEL_1; break; //ACLK case 'S': TACTL|=TASSEL_2; break; //SMCLK

case 'E': TACTL|=TASSEL_0; break; //外部输入(TACLK)

case 'e': TACTL|=TASSEL_3; break; //外部输入(TACLK取反) default : return(0); //设置参数有误,返回0 }

switch(Div) //为定时器TA选择分频系数 {

case 1: TACTL|=ID_0; break; //1 case 2: TACTL|=ID_1; break; //2 case 4: TACTL|=ID_2; break; //4 case 8: TACTL|=ID_3; break; //8

default : return(0); //设置参数有误,返回0 }

switch(Mode1) //设置PWM通道1的输出模式。 {

case 'P': //如果设置为高电平模式

TACCTL1 =OUTMOD_7; //高电平PWM输出 P1SEL |= BIT2; //从P1.2输出 (不同型号单片机可能不一样)

P1DIR |= BIT2; //从P1.2输出 (不同型号单片机可能不一样) break;

case 'N': //如果设置为低电平模式 TACCTL1 =OUTMOD_3; //低电平PWM输出 P1SEL |= BIT2; //从P1.2输出 (不同型号单片机可能不一样)

P1DIR |= BIT2; //从P1.2输出 (不同型号单片机可能不一样) break;

case '0': //如果设置为禁用

P1SEL &= ~BIT2; //P1.2恢复为普通IO口 break;

default : return(0); //设置参数有误,返回0 }

switch(Mode2) //设置PWM通道1的输出模式。 {

case 'P': //如果设置为高电平模式

TACCTL2 =OUTMOD_7; //高电平PWM输出 P1SEL |= BIT3; //从P1.3输出 (不同型号单片机可能不一样)

P1DIR |= BIT3; //从P1.3输出 (不同型号单片机可能不一样)

40

本文来源:https://www.bwwdw.com/article/1tl2.html

Top