基于msp430的电风扇制系统模拟控设计Word格式.doc
《基于msp430的电风扇制系统模拟控设计Word格式.doc》由会员分享,可在线阅读,更多相关《基于msp430的电风扇制系统模拟控设计Word格式.doc(26页珍藏版)》请在冰点文库上搜索。
3.2方案设计---------------------------------------------------------------3
四调试过程及结果分析----------------------------------------------7
4.1仿真结果与分析--------------------------------------------------------7
五体会与建议---------------------------------------------------------10六附录-----------------------------------------------------------------11
参考文献----------------------------------------------------------------22
MSP430单片机应用课程设计报告
一、设计任务及要求
1.1基本要求
1.用4位数码管实时显示电风扇的工作状态,最高位显示风类:
“自然风”显示“1”、“正常风”显示“2”、“睡眠风”显示“3”。
后3位显示定时时间:
动态倒计时显示剩余的定时时间,无定时显示“000”。
2.设计“自然风”,“正常风”和“睡眠风”三个风类键用于设置风类;
设计一个“定时”键,用于定时时间长短设置;
设计一个“摇头”键用于控制电机摇头。
3.在整个定时状态下,电路具有允许用户随时自行选择使用“自然风”状态,也可选择使用“常风”和“睡眠风”状态。
1.2发挥部分
1.设计过热检测与保护电路:
若电风扇电机过热(用内存参数模拟温度,用键),则电机停止转动,蜂鸣器报警,电机冷却后(用键模拟)电机又恢复转动。
二、相关原理简介
2.1MSP430的特点
MSP430管教图如图2.1。
图2.1MSP430管脚图
MSP430的特点如下:
a.强大的处理能力:
MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7种源操作数寻址、4种目的操作数寻址)、简洁的27条内核指令以及大量的模拟指令;
大量的寄存器以及片内数据存储器都可参加多种运算;
还有高效的查表处理指令;
有较高的处理速度,在8MHz晶体驱动下指令周期为125ns。
这些特点保证了可编制出高效率的源程序。
b.在运算速度方面,MSP430系列单片机能在
8MHz晶体的驱动下,实现125ns的指令周期。
16位的数据宽度、125ns的指令周期以及多功能的硬件乘法器(能实现乘加)相配合,能实现数字信号处理的某些算法(如FFT等)。
c.MSP430系列单片机的中断源较多,并且可以任意嵌套,使用时灵活方便。
当系统处于省电的备用状态时,用中断请求将它唤醒只用6us。
d.超低功耗
MSP430单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。
e.系统工作稳定
上电复位后,首先由DCOCLK启动CPU,以保证程序从正确的位置开始执行,保证晶体振荡器有足够的起振及稳定时间。
然后软件可设置适当的寄存器的控制位来确定最后的系统时钟频率。
如果晶体振荡器在用做CPU时钟MCLK时发生故障,DCO会自动启动,以保证系统正常工作;
如果程序跑飞,可用看门狗将其复位。
f.适应工业级运行环境
MSP430系列器件均为工业级的,运行环境温度为-40至+85摄氏度,所设计的产品适合用于工业环境下。
2.2MSP430的中断原理
执行中断的一般过程如下:
1.CPU会执行完当期的指令。
2.指向下一条指令的PC被压栈。
3.状态寄存器SR压栈。
4.选择最好优先级的中断进行服务。
5.单源中断的中断标志位会被自动清零,P1,P2这样的中断标志位不会自动清零,因为P1、P2的IO中断属于多源中断,需要在代码中手动清零。
6.状态寄存器SR被清零,将会终止任何低功耗状态,并且全局中断使能被关闭。
7.中断向量被装载到PC,开始执行中断服务函数。
MSP430中断向量表2.2如下。
表2.2MSP430中断向量表
三、设计方案与实现
3.1任务分析
电风扇模拟控制系统设计就是使用单片机来控制电机和一些LED、按键,模拟真实的电风扇的使用,通过设计使电风扇使用便捷更人性化。
风类,定时,摇头都是针对使用者不同需求的设计。
过热保护是对安全性要求的设计。
3.2方案设计
1.硬件方案
根据设计的要求可知,系统的硬件原理框图如图3.1所示。
档位及定时显示
电机控制模块
按键输入
单片机系统
过热检测模块
图3.1系统的硬件原理框图
本系统由五个模块组成,分别是输入模块、显示模块、电机控制模块、过热保护模块以及单片机控制系统。
其中单片机控制系统是核心,由MSP430、晶振和复位电路组成。
它通过处理输入的各种数据信息来对其它模块发出指令,进行相应的操作。
输入模块由5个按键组成,分别控制电机的风速、正反转和定时时间。
显示模块由8位共阴数码管组成,显示定时时间和风速。
过热保护模块由ADC0809和外围电路组成,通过设定电压初始值使电机超值停转并且相应二极管发光报警。
电机控制模块由L298和其它的元器件组成,它主要是放大输入信号的倍数,用来驱动电机。
图3.2晶振电路 图3.3复位电路
保护电路的选择:
选用ADC0809作为过热保护电路的核心部件,假设先设定一个标准电压值,通过0-5V模拟电压输入进行模数转换,如果数据超过标准值则单片机对电机进行相应操作,使电机启停。
控制核心的选择:
采用单片机作为控制核心,以软件编程的方式进行风速判断,并在端口输出控制信号。
显示电路的选择:
采用八位共阴数码管显示电机状态,动态扫描显示方式。
2.软件方案
系统软件设计包括主程序设计,A/D转换子程序设计和定时器T0中断程序设计。
1)主程序流程图设计
软件所要实现的功能有:
按键响应,对ADC0809的控制,对数据的处理和传送显示的数据。
主程序包含初始化、调用A/D转换子程序和调用显示程序,其流程图如图3.4所示:
摇头?
Y
开始
显示
初始化
占空比1:
3
自然风?
N
常风?
占空比3:
1
5
睡眠风?
进入定时程序
定时?
开摇头
电机过热?
关电机
关中断
显示过热
图3.4主程序流程图
主程序经初始化后,开始四位数码管显示的是“0000”电机停转。
然后进入按键扫描程序,依次对自然风、常风、睡眠风进行扫描,单片机I/O口输出相应的占空比方波,当为自然风时,数码管最高位显示“1”,当为常风时,数码管最高位显示“2”,当为睡眠风时,数码管最高位显示为“3”。
当有定时键按下时,转到定时器T0中断程序进行。
当有摇头键按下时,高低电平翻转,电机开始反转。
2)定时器T0中断程序流程图设计
定时器T0是用来对定时时间进行控制的,结合数码管动态显示,首先给T0设置工作方式和初始值,由于它不可重装,所以在主程序中必须再次定义它的初始值。
其流程图如图3.5所示:
定时时间减一秒
定时到了吗?
置初值
中断返回
数码显示
电机停
1s到了吗?
开中断
图3.5定时器T0中断程序流程图
3)A/D转换测量子程序流程图设计
由于ADC0809在进行A/D转换时要用到CLK信号,而此时的ADC0809的CLK是接在MSP430单片机的P2.4端口上,也就是要求从P2.4输出CLK信号供ADC0809使用。
因此产生CLK信号的方法就的使用软件来产生了;
由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理。
然后和设定的参考值比较,而实际显示的电压值的关系为。
其流程图如图3.6所示。
地址数小于8?
A/D转换结束?
结束
ADC0809地址加一
取数据
启动测试(TESTART)
图3.6A/D转换测量子程序流程图
在主程序中,ADC0809的转换程序也是无限循环的,它主要是检测电机是否过热。
本系统中,运用定时器T1作为CLOCK的脉冲信号,由于它的工作方式为2,且初始值216,足以满足ADC0809所转换一次所需要的时间。
设定电机过热电压初始值为1.95V,当模拟电压输入量超过这个值时,发光二极管点亮,表示电机过热此时L298使能端变低电平,电机停转。
四、调试过程及问题解决
4.1仿真结果与分析
图4.1是自然风键按下时状态,数码管显示为1,无定时时间。
ADC0809显示电压值为1.95V,电机不发热,正常转动。
为了表示哪个按键被按下,仿真图上对应的按键均为闭合状态,下面的仿真图也同上,这里不在阐述。
图4.1
图4.2是常风键按下时状态,数码管第一位显示为2,无定时时间。
图4.2
图4.3是睡眠风键按键按下时状态,数码管第一位显示为3,无定时时间。
图4.3
图4.4是自然风按键按下时状态,数码管第一位显示为3,定时时间为15ms。
图4.4
图4.5是睡眠风按键按下时状态,数码管第一位显示为3,定时时间为0ms。
ADC0809测得的显示电压值为2.0V,超过设定的初始值,则表示电机发热,电机停止转动。
图4.5
五、体会与建议
本次设计,使我学到了许多书本上无法学到的知识,也使我深刻体会到单片机技术应用领域的广泛。
不仅让我对学过的单片机知识有了很多的巩固,同时也对单片机这一门课程产生更大的兴趣。
在本次设计过程中,我学会了在网络上查找有关设计的个硬件的资源。
此设计系统是以单片机msp430芯片为核心部件,实现了电风扇系统控制功能,此次课程在软件上是花费时间最多的,花费大量时间查阅学习代码。
这次设计,使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。
使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步。
总的感受有以下几方面:
1、通过本次设计,我不但对单片机有了更深的了解,对一个课题如何画流程图,编程序等有了一定的认识。
2、进一步加强了我的动手能力和运用专业知识的奴隶,从学习到如何去思考和解决问题,以及如何灵活地改变方法实现设计方案。
3、让我了解到单片机技术对当今人们生活的重要性。
同时这次设计的经历也使我受益匪浅,让我知道做任何事情都应脚踏实地,刻苦努力地去做,只有这样,才能做好。
六、附录
6.1程序源代码
22
/**
******************************************************************************
*@文件名main.c
*@作者LY
*@版本V3.0
*@日期11/17/2016
*@摘要触摸按键测试代码
*/
/*Includes------------------------------------------------------------------*/
#include"
msp430f6638.h"
CTS/structure.h"
CTS/CTS_Layer.h"
CTS/CTS_HAL.h"
F5xx_F6xx_Core_Lib/HAL_UCS.h"
F5xx_F6xx_Core_Lib/HAL_PMM.h"
Device/step_motor.h"
Device/ADC.h"
Device/DRV8833.h"
Device/Timer.h"
Device/MSP430_INT.h"
Device/tm1638.h"
#include"
Hardware_Profile.h"
//处理器"
硬件配置文件"
-HardwarespecificdefinitionsforProcessor
/*Privatedefine------------------------------------------------------------*/
#defineLED_PORT_DIR P4DIR
#defineLED_PORT_OUT P4OUT
#defineLED1 BIT4
#defineLED2 BIT5
#defineLED3 BIT6
/*Privatefunctions---------------------------------------------------------*/
#defineCPU_F((double)20000000)
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
//LCDsegmentdefinitions.
#defined0x01
#definec0x20
#defineb0x40
#definea0x80
#definedp0x10
#defineg0x04
#definef0x08
#definee0x02
constcharchar_gen[]={//Asusedin430DayWatchDemoboard
a+b+c+d+e+f,//Displays"
0"
b+c,//Displays"
1"
a+b+d+e+g,//Displays"
2"
a+b+c+d+g,//Displays"
3"
b+c+f+g,//Displays"
4"
a+c+d+f+g,//Displays"
5"
a+c+d+e+f+g,//Displays"
6"
a+b+c,//Displays"
7"
a+b+c+d+e+f+g,//Displays"
8"
a+b+c+d+f+g,//Displays"
9"
a+b+c+e+f+g,//Displays"
A"
c+d+e+f+g,//Displays"
b"
a+d+e+f,//Displays"
c"
b+c+d+e+g,//Displays"
d"
a+d+e+f+g,//Displays"
E"
a+e+f+g,//Displays"
f"
g"
c+e+f+g,//Displays"
h"
i"
b+c+d,//Displays"
j"
b+c+e+f+g,//Displays"
k"
d+e+f,//Displays"
L"
a+b+c+e+f,//Displays"
n"
a+b+c+d+e+f+g+dp//Displays"
full"
};
/*Privatefunctionprototypes-----------------------------------------------*/
voidInit_lcd(void);
//LCD初始化
voidLcdGo(unsignedcharDot);
//打开或关闭液晶
voidLcdBlink(unsignedchardoit);
//显示或者消隐显示内容
voidLCD_Clear(void);
//清屏
voidInit_TS3A5017DR(void);
//ConfigureTS3A5017DRIN1andIN2
voidBacklight_Enable(void);
//打开背光
voidUp_ClockFor_20MHZ(void);
unsignedcharIs_sw1_pressed(void);
unsignedcharIs_sw2_pressed(void);
unsignedintAnjian=0;
//按键次数
unsignedintGe=0;
//个位
unsignedintShi=0;
//十位
unsignedintBai=0;
//百位
unsignedintQian=0;
//千位
unsignedintStartOnn=0;
//启动按键表示
unsignedintJianC=0;
//累减
unsignedintTimezonghe=0;
//时间总和
unsignedintStartbiaoshi=0;
//启动停止标识
externunsignedintresults[4];
unsignedintAntime=0;
unsignedintYaotouci=0;
//摇头次数判断
uint8_tADC_FLAG=0;
uint8_tUpdate=0;
//数码管更新标志位
uint16_tPot_ADC_Result=0;
unsignedintFuncC=0;
//功能切换
unsignedintFuncYaotou=0;
//摇头标示
uint8_tnum[8];
//各个数码管显示的值
uint8_tled_flag[8];
constuint8_ttab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
/*!
*函数功能:
配置触