基于单片机的无刷直流风扇转速测量与调节.docx
《基于单片机的无刷直流风扇转速测量与调节.docx》由会员分享,可在线阅读,更多相关《基于单片机的无刷直流风扇转速测量与调节.docx(11页珍藏版)》请在冰豆网上搜索。
微机原理三级项目
项目设计说明书
设计题目:
基于单片机的无刷直流风扇转速测量与调节
指导老师:
项目成员:
XX大学
机电工程系
xxxx年xx月xx日
一、项目设计要求
1、实现无刷直流电机转速的测量和控制。
2、给定转速指令:
由PC发送转速值,经单片机控制器,使得电机达到并稳定在指定转速上。
二、硬件设备
1、测量风扇型号:
品牌:
台达,型号:
AFB0712HHB
2、51系列单片机学习板
3、PC
三、方案设计
1、硬件电路
P1.1口接PWM波输入,P3.2口接测速脉冲输入
USB提供+5V电源,可以实现PC机与开发板的数据通讯和程序下载。
数码管显示速度和占空比,按键控制转速和占空比。
风扇电路连接:
1、输出信号----转速输出
每转输出2个脉冲
OC输出,如右图
2、OC输出的特点
外加集电极电源和负载;
输出幅值任意;
3.输入信号---PWM输入
2、程序流程图
说明:
程序应用模块化进行设计,主要有初始化模块、显示模块、测速模块和调速模块。
编程次序可按此先后进行。
(1)、初始化模块:
T0工作方式、标志位状态、所用单元初值、中断设置以及初始显示等。
(2)、显示模块:
显示风扇转速的实测值及其对应的PWM占空比。
(3)测速模块:
测出2s内风扇的脉冲数,进而求出风扇每分钟的转速。
(4)调速模块:
通过键盘按键对PWM波占空比的调节,来控制风扇转速的大小。
3.占空比与转速关系:
占空比
0.25
0.30
0.35
0.40
0.45
0.50
0.55
0.60
转速r/min
250
435
585
735
870
990
1140
1275
占空比
0.65
0.70
0.75
0.80
0.85
0.90
0.95
1.00
转速r/min
1380
1485
1590
1710
1815
1920
1985
2010
风扇转速低于250r/min时,由于电压过低,风扇停转,图表中只能测出占空比0.25以上的数据。
四、设计程序:
11
#include
#defineucharunsignedchar//0-255
#defineuintunsignedint//0-65535
sbitdula=P2^6;//数码管段选
sbitwela=P2^7;//数码管位选
sbitP1_1=P1^1;//控制电机I/O口定义
sbitP3_4=P3^4;
sbitkey_1=P3^1; //加速键
sbitkey_2=P3^3; //减速键
sbitkey_3=P3^5; //快加键
sbitkey_4=P3^6; //快减键
sbitP1_6=P1^6; //占空比百位
intge,shi,bai,qian;//定义转速各位
intm,n,num,PWM=200,PWMH=100;
intzhuansu,PWMH_1,PWMH_2,PWMH_3;//转速
ucharcodetable[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};
//数码管显示数据表
/*=============延时函数==============*/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
/*=============数码管显示函数============*/
voiddisplay()
{
dula=1;
P0=table[ge];
dula=0;
P0=0xff;//消隐
wela=1;//显示转速个位
P0=0xdf;
wela=0;
delay(3);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;//消隐
wela=1;//显示转速十位
P0=0xef;
wela=0;
delay(3);
dula=1;
P0=table[bai];
dula=0;
P0=0xff;//消隐
wela=1;//显示转速百位
P0=0xf7;
wela=0;
delay(3);
dula=1;
P0=table[qian];
dula=0;
P0=0xff;//消隐
wela=1;//显示转速千位
P0=0xfb;
wela=0;
delay(3);
dula=1;
P0=table[PWMH_2];
dula=0;
P0=0xff;//消隐
wela=1; //显示占空比十位
P0=0xfe;
wela=0;
delay(3);
dula=1;
P0=table[PWMH_3];
dula=0;
P0=0xff;//消隐
wela=1; //显示占空比个位
P0=0xfd;
wela=0;
delay(3);
}
/*=========定时器0PWM输出,调节转速========*/
//初始化,每次一溢出时间500us
voidcsh()
{
TMOD=0x01;
TH0=(65536-461)/256;
TL0=(65536-461)%256;
IT0=1;//下降沿
EA=1;
EX0=1;//打开外部中断0
ET0=1;
}
//键盘扫描部分
voidkeyscan()
{
if(key_1==0)
{
delay(3);//延时祛去抖
if(key_1==0)
{
PWMH++;
if(PWMH>=PWM)
PWMH=PWM;
while(!
key_1);//等待按键释放
}
}
if(key_2==0)
{
delay(3);
if(key_2==0)
{
PWMH--;
if(PWMH<=0)
PWMH=0;
while(!
key_2);//等待按键释放
}
}
if(key_3==0)
{
delay(3);//延时祛去抖
if(key_3==0)
{
PWMH=PWMH+10;
if(PWMH>=PWM)
PWMH=PWM;
while(!
key_3);//等待按键释放
}
}
if(key_4==0)
{
delay(3);
if(key_4==0)
{
PWMH=PWMH-10;
if(PWMH<=0)
PWMH=0;
while(!
key_4);//等待按键释放
}
}
}
/*===========测量转速,利用外部中断INT0和定时器T0,每2s计算一次======*/
//定时器0中断部分
voidT0_time()interrupt1
{
TH0=(65536-461)/256;
TL0=(65536-461)%256;
num++;
n++;
if(num==201) //周期定位200个
num=0;
if(num<=PWMH)
P1_1=1; //置高电平
elseif(num>PWMH)
P1_1=0; //置低电平
if(n==3998) //2s时间到,计算转速
{
n=0;
zhuansu=m*30/2;
m=0;
qian=zhuansu/1000;
bai=zhuansu%1000/100;
shi=zhuansu%100/10;
ge=zhuansu%10;
}
}
//外部中断0部分
voidX0_time()interrupt0
{
EX0=0;
m++;
EX0=1;
}
/*=======显示占空大小======*/
voidPWMH_()
{
PWMH_1=PWMH/100;
PWMH_2=PWMH%100/10;
PWMH_3=PWMH%10;
if(PWMH_1==1)
P1_6=0; //显示占空比百位
else
P1_6=1;
}
voidmain() //主函数
{
P3_4=0; //打通P3^4控制的按键
csh(); //初始化子函数
while
(1)
{
PWMH_();
keyscan();
display();
}
}
五、方案总结
该项目程序的转速是通过规定时间内求转数的方法测量的,转速显示误差为±15转每分钟,调速范围较广(235r/min到2010r/min),基本上能达到了设计任务的要求。
但由于学习时间紧迫,此次项目设计中还存在一些不足的地方:
一是没有尝试通过串口通信的方法控制风扇的转速;二是没有设计风扇抗干扰的功能。
六、感想
在项目实施过程中,协调好两个人的团队比较简单,最重要就是要和搭档进行合理分工然后按时各自完成自己分配的任务,遇到问题时及时联系交流,仔细听取对方观点,分析自己的不足,改进自己方案。
在项目实施过程中,我们的分工比较明确,尽管如此,一开始我们还是遇到了一些问题。
我们只是学了理论知识,但是对如何控制单片机不是很了解,缺乏硬件电路的知识,遇到许多问题,比如不知道风扇如何接线,在调试过程中转速不稳定等。
后来通过翻阅相关书籍以及上网查询,最终解决了一个个难题,得到了最后的程序。
但是由于时间紧迫,此次项目设计中还存在一些不足的地方,一是没有尝试通过串口通信的方法控制风扇的转速;二是没有设计风扇抗干扰的功能。
但是我们按照电路-软件-仿真-实物的设计过程,在对风扇转速测量与调节的实践中,加深了对单片机的定时器、计数器、中断等模块的理解,也熟悉了Keil等相关软件的使用。
回想本次项目,我们对实际运用单片机有了一次感性认识,理论结合实际,为后面的课程打下了基础,也给我们提供了宝贵的项目经验。
另一方面,也学到了微机的编程的技术,拥有了一定的编程和软件调试经验。
当然,在小组中也学到了如何协调好组内的分工,增强了团队意识。
对我们未来工作,运用学过的知识和理论解决实际工程问题提供一定的指导。