微机原理三级项目报告.docx

上传人:b****4 文档编号:24180406 上传时间:2023-05-25 格式:DOCX 页数:15 大小:236.23KB
下载 相关 举报
微机原理三级项目报告.docx_第1页
第1页 / 共15页
微机原理三级项目报告.docx_第2页
第2页 / 共15页
微机原理三级项目报告.docx_第3页
第3页 / 共15页
微机原理三级项目报告.docx_第4页
第4页 / 共15页
微机原理三级项目报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

微机原理三级项目报告.docx

《微机原理三级项目报告.docx》由会员分享,可在线阅读,更多相关《微机原理三级项目报告.docx(15页珍藏版)》请在冰豆网上搜索。

微机原理三级项目报告.docx

微机原理三级项目报告

基于单片机的无刷直流风扇转速测量与调节

一、项目设计要求

1、实现无刷直流电机转速的测量和控制

2、给定转速指令:

由PC发送转速值,经单片机控制器,使得电机达到并稳定在指定转速上。

二、硬件设备

1、测量风扇型号:

品牌:

台达,型号:

AFB0712HHB

2、51系列单片机学习板

3、PC

三、方案设计

1、硬件电路

USB提供+5V电源,可以实现PC机与开发板的数据通讯和程序下载。

数码管显示速度和占空比

风扇电路连接:

P1.0口接PWM波输入,P3.2口接测速脉冲输入

风扇输入和输出信号图

1、输出信号----转速输出

每转输出2个脉冲

OC输出,如上图

2.OC输出的特点

外加集电极电源和负载;

输出幅值任意;

注意ICMAX

3.输入信号---PWM输入

2、程序流程图

 

说明:

程序应用模块化进行设计,主要有初始化模块、显示模块、测速模块和调速模块。

编程次序可按此先后进行。

(1)、初始化模块:

T0和T1工作方式、标志位状态、所用单元初值、中断设置以及初始显示等。

(2)、显示模块:

显示风扇转速的实测值及其对应的PWM占空比。

(3)测速模块:

将0.5s测出的脉冲数即风扇每秒的转速。

(4)调速模块:

通过串口通信把风扇转速设定值发给单片机,通过改变脉冲波的占空比和PI调节来控制转速的大小。

3.占空比与转速关系:

占空比

0

0

0.16

0.17

0.18

0.19

0.2

0.22

0.24

0.27

0.29

0.31

转速r/s

0

1

2

3

4

5

6

7

8

9

10

11

占空比

0.35

0.38

0.42

0.46

0.51

0.54

0.61

0.74

0.84

0.94

1

转速r/s

12

13

14

15

16

17

18

19

20

21

22

四、设计程序:

1、主程序:

#include

#include

#include

externunsignedcharset_value;//占空比设定

//主函数

voidmain()

{

PS=1;//串行口中断优先级别设为高

T0_init();//定时器0初始化

T1_init();//定时器1初始化

EXT0_init();//外部中断0初始化

USART_init();//串口初始化

set_value=22;

while

(1)

{

}

}

2、初始化子程序

#include

#include

//TC0初始化

//设为定时器、模式2(自动重装)

voidT0_init()

{

EA=1;

ET0=1;

TMOD|=0x02;

TH0=TL0=0x00;

TR0=1;

}

//TC1初始化

//设为定时器、模式2(自动重装)

voidT1_init()

{

EA=1;

ET1=0;//中断关

TMOD|=0x20;

TH1=TL1=0xfd;

TR1=1;

}

//EXT0初始化

//负跳变沿有效、INT0(P3.2)输入脉冲

voidEXT0_init()

{

IT0=1;

EX0=1;

EA=1;

}

//USART初始化

//波特率9600bps

voidUSART_init()

{

PCON=0x40;

SCON=0x50;//模式1,允许接收

ES=1;

}

3、数码管显示子程序

#include

#include

//硬件连接

sbitDAT=P0^2;

sbitSCK=P0^0;

sbitRCK=P0^1;

//数码管驱动

xdataNUM[]={0xf5,0x05,0xb3,0x97,0x47,0xd6,0xf6,0x85,0xf7,0xd7};//0-9数字

xdataBIT[]={0xdf,0xbf,0x7f,0xef,0xfd,0xfb,0xf7,0xfe};//位选

voiddis_bit(unsignedcharpos,unsignedcharData)

{

unsignedchari;

pos=BIT[pos-1];

Data=NUM[Data];

RCK=0;

for(i=0;i<8;i++)

{

SCK=0;

if(pos&0x80)

DAT=1;

else

DAT=0;

pos<<=1;

SCK=1;

delay();

}

for(i=0;i<8;i++)

{

SCK=0;

if(Data&0x80)

DAT=1;

else

DAT=0;

Data<<=1;

SCK=1;

delay();

}

RCK=1;

//delay();

}

//显示数值,两位

//输入:

pos:

显示首位word:

一个两位以下的数值

voiddis_word(unsignedcharpos,unsignedcharword)

{

dis_bit(pos++,word/10);

dis_bit(pos++,word%10);

}

//软件延时

voiddelay()

{unsignedchari;

for(i=5;i>0;i--);

}

4、测速、调速子程序

#include

#include"IT.H"

#include"Display.H"

//硬件连接

sbitfan=P1^0;//风扇脉冲输入

sbith=P0^6;//LED,测试

//全局变量

xdataunsignedcharf[]={0,0,16,17,18,19,20,22,24,27,29,31,35,38,42,46,51,54,61,74,84,94,100,100,100};//转速与占空比关系对照表

//INT0参数

volatileunsignedcharn;//转速

volatileunsignedcharp;//脉冲数

//USART参数

staticunsignedcharflag;//串口相关

unsignedcharUsart_buf[2]="00";//接收缓冲区

//PID参数

unsignedcharKp=5,Ki=1;//PID参数(PI)

staticunsignedinterror,error_re,Sum_e;//当前偏差,上一次的偏差,积分累加器

//T0参数

staticunsignedchartime;//测速计时器

unsignedcharset_value;//PWM设定值

//TC0中断

voidT0IT()interrupt1using1

{unsignedchartemp;

time++;

if(time>150)//0.5s,由于中断处理的程序过于庞大,以至于定时的理论值不能精确的算出。

{

time=0;

n=p;

p=0;

flag=0;//若串口的两位数据不是连续发送,则在下一次接收时全部刷新

temp=PID();

}

if

(1)

PWM_GENERATER(temp);//PID调节

dis_word(1,n);

dis_word(5,set_value);//显示占空比

//dis_word(3,error);

//dis_word(7,temp);

}

//TC1中断

voidT1IT()interrupt3using1

{

}

//EXT0中断

voidEX0_IT()interrupt0using1

{

p++;//脉冲计数

}

//USART中断

voidUSART_IT()interrupt4using1

{unsignedchartemp;

Usart_buf[flag]=SBUF;

flag++;

if(flag>1)

flag=0;

temp=(Usart_buf[0]-48)*10+Usart_buf[1]-48;

if(temp<23)

set_value=f[temp];

RI=0;

TI=0;

}

//PWM生成程序

//输入:

Duty_Cycle:

占空比高电平持续值

voidPWM_GENERATER(unsignedcharDuty_Cycle)

{staticunsignedcharcom_value;

com_value++;

if(com_value

fan=1;

elseif(com_value

fan=0;

else

com_value=0;

}

//PID控制器

//输入:

pidtarget:

目标值

//输出:

返回占空比(Duty_Cycle)

unsignedcharPID()

{xdataunsignedintfeedback,proportion,integral;

error_re=error;//上一次的偏差

if(set_value>f[n])//error为正值的情况

{

error=set_value-f[n];//偏差

Sum_e=Sum_e+error;//积分

feedback=Kp*error/2+Ki*Sum_e;//PID计算

}

else//error为负值的情况

{

error=f[n]-set_value;//偏差

//积分部分

if(Sum_e>error)//积分为正

Sum_e=Sum_e-error;

else//积分为负

Sum_e=0;

proportion=Kp*error/2;//比例计算

integral=Ki*Sum_e;//积分

if(integral>proportion)//PID计算

feedback=integral-proportion;

else

feedback=0;

}

return(feedback);//返回结果

}

五、方案总结

本方案基本能完成风扇转速测量与控制,达到了设计任务的要求。

通过测试,本控制系统可以根据气流和通风条件等环境对运行的影响,比较及时调整PWM波形。

但是,本方案也存在一些不足之处:

1.由于本程序的中断处理比较复杂,定时的理论值不能精确的算出,以至测量的转速不是很精确

2.由于时间关系,我们的PID控制模块只完成了PI调节,缺乏了微分调节,系统的动态性能有所下降。

六、感想

通过该项目的实践,我们加深了对单片机的定时器、计数器、中断等模块的理解。

但是万事开头难,一开始,我们只是学了相关的理论知识,对实体的单片机并不了解,遇到各种问题,比如缺乏硬件电路的了解,风扇该如何接线如何输出信号,pwm波如何输出和调节,在调试过程中难以调到稳定速度等问题。

后来结合书本,通过摸索,得出了上述程序。

尽管时间紧迫、压力大,但是我们还是灵活运用并掌握微机测控装置的经典设计过程,即电路-软件-仿真-实物的设计调试试制过程;通过实践,已经熟悉了主要应用软件,Keil、Proteus、Protel等软件的使用,并已经积累了应用经验;项目实践后,锻炼了硬件设计和调试水平,提高了工程应用的直观经验;对PWM驱动直流电机、电机带动风扇的模型有了感性认识,为后面的课程打下了基础;学习了微机编程的技术,积累了编程和软件调试经验;在集体项目活动中锻炼了组织、分工协调能力。

 

WelcomeTo

Download!

!

!

 

欢迎您的下载,资料仅供参考!

 

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

当前位置:首页 > 高中教育 > 初中教育

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

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