微机原理-无刷直流风扇调速与测速分析

合集下载

无刷直流电机调速系统的控制原理

无刷直流电机调速系统的控制原理

无刷直流电机调速系统的控制原理下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

此文下载后可定制随意修改,请根据实际需要进行相应的调整和使用。

并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Downloaded tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The documents can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!无刷直流电机调速系统是一种能够实现精准控制电机转速的技术,它在工业生产和生活中有着广泛的应用。

微机原理无刷DC风机调速及测速.doc

微机原理无刷DC风机调速及测速.doc

微机原理无刷DC风机调速及测速理工学院微机原理(三级)项目报告名称:微机原理课程设计项目名称:无刷DC风扇速度调节和速度测量讲师;█ █部门:机电专业:机械设计、制造和自动化团队成员的信息科学数量;姓氏:王█ █团队成员信息编号:姓氏:郭█ █完成时间:结果从XXXX 12月1日到XXXX 1月3日:审阅者:目录一、学习目标 (1)第二,该项目要求 (1)第三,速度测量和调节系统的硬件构成 (1)四、程序流程图和解释思路 (3)五、风机转速与占空比的关系表及曲线 (4)六、设计过程 (5)七、设计问题分析 (12)八.计划摘要 (13)一、学习目标本系统作业的目的是:(1)通过脉宽调节改变无刷直流风扇的转速;(2)通过风扇旋转时产生的脉冲信号测量并显示风扇的转速;(3)将每个风扇组从某一转速(600转/分)到另一转速(XXXX 12月1日至XXXX 1月3日)的结果进行比较:审阅者:目录一、学习目标 (1)第二,该项目要求 (1)第三,速度测量和调节系统的硬件构成 (1)四、程序流程图和解释思路 (3)五、风机转速与占空比的关系表及曲线 (4)六、设计过程 (5)七、设计问题分析 (12)八.计划摘要 (13)一、学习目标本系统作业的目的是:(1)通过脉宽调节改变无刷直流风扇的转速;(2)通过风扇旋转时产生的脉冲信号测量并显示风扇的转速;(3)比较每组风扇从某一速度(600转/分)稳定运行到另一速度(2000转/分)所需的时间。

通过比较测试结果的估计结果并讨论产生差异的主要原因,学生可以展示他们对无刷直流风扇数学模型建立和调整方法的局限性的深入理解。

二.项目要求检查项目要求速度显示风扇速度可在发光二极管上显示,速度单位为r/min,刷新周期约为1秒,风扇速度可调节,风扇速度可在700时改变:根据要求接线:黄线连接到Vcc,黑线接地,绿线连接到P3 ,蓝线连接到P2 .输出:输出,如下图所示Iv .画一个程序流程图并解释程序思想。

直流无刷电机是如何实现调速的?

直流无刷电机是如何实现调速的?

直流无刷电机是如何实现调速的?
【导读】直流无刷电机是如何实现调速的?这个问题机电公司每隔几天都会遇到,是对无刷电机有使用需求的潜在客户来电咨询的常见问题,所以很有必要为大家讲解一下这方面的知识。

直流无刷电机没有电刷磨损,维护相对简单,较有刷可靠,但需加装驱动(换向)电路。

直流无刷电机的调速方式第一种情况是:主要靠电压来控制,力矩主要由电流来控制,一般会带一个配套的电机驱动器,改变驱动器的输出电压就可以控制电机的速度,如果没有驱动器,想自己直接控制电机的话,需要看电机的功率和工作电流。

如果是小功率的电机可以用电阻调速(不建议使用,方法很简单,串联个电位器即可,不过这种方式会降低效率,所以不提倡),大功率的电机不能使用电阻调速,因为这样需要一个小阻值大功率的电阻(电机工作阻值很小),这种电阻不好找而且这种方案效率太低,最好还是找个配套的驱动器。

直流无刷电机的第二种调速方式:PWM调速,直流电机的PWM调速原理与交流电机调速原理不同,它不是通过调频方式去调节电机的转速,而是通过调节驱动电压脉冲宽度的方式,并与电路中一些相应的储能元件配合,改变了输送到电枢电压的幅值,从而达到改变直流电机转速的目的。

它的调制方式是调幅。

PWM控制有两种方式:
1.使用PWM信号,控制三极管的导通时间,导通的时间越长,那么做功的时间越长,电机的转速就越高
2.使用PWM控制信号控制三极管导通时间,改变控制电压高低来实现
直流有刷电机的优点在于启动力矩大,调速系统结构简单,价格低廉,然而缺点也有很多如噪音大,容易损坏,要换碳刷,所以逐步被直流无刷电机所取代。

微机原理大作业-测量电风扇转速的方案

微机原理大作业-测量电风扇转速的方案

测量电风扇转速的方案0 引言电风扇是每家每户都会有的一个电器,在空调尚未普及之前,炎炎夏日人们能在风扇面前吹着风就已经是很好的享受了。

但是不知道大家有没有想过,我们常见常用的风扇叶片的转速究竟是多少呢。

接下来我们便来探讨测量电风扇转速的一种方法。

1 可行性研究1.1 背景风扇转速是指风扇扇叶每分钟旋转的次数,单位是rpm。

风扇转速由电机内线圈的匝数、工作电压、风扇扇叶的数量、倾角、高度、直径和轴承系统共同决定。

在风扇结构固定的情况下,直流风扇(即使用直流电的风扇)的转速随工作电压的变化而同步变化。

风扇的转速可以通过内部的转速信号进行测量,也可以通过外部进行测量(外部测量是用其他仪器看风扇转的有多快,内部测量则直接可以到BIOS里看,也可以通过软件看。

内部测量相对来说误差大一些)。

风扇转速与散热能力并没有直接的关系,风量是决定散热能力的根本条件,更高的风扇转速会带来更高的噪声,选购散热器产品时如果风量差不多,可以选择转速低的风扇,在使用时会安静一些。

1.2 应用现状/对比案例查阅资料可知,在其他的转速测量方法中,有一些采用了内部测量转速的方法需要采集的电子参数过多,电路逻辑分析也过于复杂(如图1、图2),故在电风扇转速的测量中,我们应尽量选用外部测量的方法,这样可以简化操作并有效减小误差。

图1其他方案转速采集电路仿真图2其他方案控制系统示意图1.3 效益分析本方案中所选取的单片机、传感器均为常见且易得的器件,在花费上可以有效节省费用。

2 总体方案/初步设计2.1 方案总述针对在工程实践中很多场合都需要对转速这一参数进行精准测量的目的,采用以STC89C51芯片为核心,结合转动系统、光电传感器、显示模块等构成光电传感器转速测量系统,实现对电风扇转速的测量。

通过测试表明该系统具有结构简单、所耗成本低,测量精度高、稳定可靠等优点,具有广阔的应用前景。

2.2 总体方案系统总体结构如图3所示,主要包含以单片机为核心的主控电路、以传感器为主的信息采集处理单元、转动系统、显示模块等。

无刷直流电动机调速知识讲解

无刷直流电动机调速知识讲解
无刷直流电动机调速
9.1 同步电动机变压变频调速系统的特点及基本类型
同步电动机的定子与三相异步电动机的一样,而转子是磁极,由 直流励磁或永久磁铁励磁,是交流电动机中两大机种之一。同步 电动机因其转速n与供电电源频率f1之间保持严格的同步关系而得 名。只要供电电源的频率f1不变,其转速n就绝对不变。 同步电动机的应用范围也比较广泛,小到电子钟和记录仪表的定 时旋转机构,大到发电机组、空气压缩机、鼓风机等无不利用其 转速恒定的特点。
上述逆变器为1200通电型的六拍逆变器,每一时刻都只有两只功率 管导通,至于哪两只功率管导通则由转子位置检测器发出的信号 来控制。
10
二、控制方式 按照三相星型桥式接法为例说明其工作方法:
1
3
5
A
4
6
2
B C
逆变器为桥式接法、三相绕组为星型接法
1、两两导通方式 逆变器中功率管导通的顺序一般安排为: ..V 1 . .V 2 . .V 3 V 4 V 5 V 6 V 1 ..... 各触发脉冲相互间隔600,任意时刻有2只功率管导通,每只管子导通 时间为1200,各管子之间换流是在相邻桥臂中进行的。
性或容性三种状态下(同步补偿机就工作在容性状态下)。可调节转子
励磁电流改变输入功率因数,使其在 cos 1下运行。
异步电动机靠加大转差率提高转矩,同步电动机靠加大功率角来提高转 矩。(功率角为定子相电流与感应电动势的夹角)。
4
例如,同步电动机的变频启动,转子先加励磁电流,定子绕组输入频率很 低的三相交流电,由于定子(电枢)旋转磁通势的转速很低,可带动转子 开始旋转。将定子频率逐步增加,转子转速随之逐步升高,到达额定转速 时,启动过程结束。
2
1
iAC A

直流无刷风扇原理

直流无刷风扇原理

直流无刷风扇原理
直流无刷风扇是一种利用无刷直流马达驱动的风扇设备。

它采用了与传统电动机不同的工作原理,使得风扇具有更高的效率和更低的噪音。

直流无刷风扇的工作原理是基于电磁感应和电流控制的。

风扇的转子上有多个永磁体,而定子上有多个电磁线圈。

当通电时,定子的电磁线圈会产生一个旋转磁场,与转子上的永磁体相互作用,使得转子开始旋转。

为了控制转子的旋转速度,控制器根据风扇的使用需求来调节定子线圈通电的方式。

通过改变通电时序和大小,控制器可以实现转子的高效率转动。

这样一来,直流无刷风扇可以根据需要调节风速,减小能耗,降低噪音和延长使用寿命。

与传统风扇相比,直流无刷风扇有许多优势。

首先,它们能够提供更大的风力输出,因为无刷直流马达的转速可以更高。

其次,直流无刷风扇的噪音水平更低,这是由于其马达设计和电流控制技术的改进。

再次,直流无刷风扇的功耗较低,使其在能源效率上比传统风扇更具优势。

由于直流无刷风扇具有高效、低噪音和低功耗的特点,它们在各种领域中得到了广泛应用。

例如,在电脑机箱、散热器和空调设备中,直流无刷风扇可以有效降温。

此外,直流无刷风扇还被广泛应用于汽车、电子设备和家用电器等领域。

总结起来,直流无刷风扇利用电磁感应和电流控制的原理实现
高效、低噪音和低功耗的风力输出。

它们在各种应用场景中具有广泛的应用前景和市场需求。

直流无刷电机调速原理

直流无刷电机调速原理

直流无刷电机调速原理直流无刷电机是一种新型的电动机,它具有高效率、低噪音、低振动、长寿命等优点,因此被广泛应用于各种电动设备中。

在实际应用中,直流无刷电机需要根据实际需求进行调速,以满足不同的工作要求。

本文将介绍直流无刷电机的调速原理及其实现方法。

一、直流无刷电机的基本原理直流无刷电机是一种基于电子换向技术的电动机,它的转子上没有传统的电刷和集电环,而是采用永磁体或电磁铁作为转子,靠电子器件对电机的转子进行换向控制。

直流无刷电机的转子和定子之间通过磁场相互作用产生电磁转矩,从而实现电机的转动。

直流无刷电机的工作原理可以分为两个阶段:电子换向和电磁转矩产生。

在电子换向阶段,电机控制器通过检测转子位置信号,控制电子器件对电机的相序进行调整,从而使得电机的磁场方向与转子位置相匹配,实现电子换向。

在电磁转矩产生阶段,电机的转子和定子之间产生的磁场相互作用产生电磁转矩,从而推动电机的转动。

二、直流无刷电机的调速原理直流无刷电机的调速原理主要是通过改变电机的电压和电流来改变电机的转速。

在实际应用中,直流无刷电机的调速方式主要有以下几种:1. 电压调速电压调速是最简单的调速方式,它通过改变电机的电压来改变电机的转速。

当电机的电压降低时,电机的转速也会降低。

因此,通过控制电机的电压,可以实现电机的调速。

电压调速的缺点是效率低,因为电机的功率不变,但电压下降会导致电机的电流增加,从而产生大量的损耗。

2. 电流调速电流调速是通过改变电机的电流来改变电机的转速。

当电机的电流增加时,电机的转速也会增加。

因此,通过控制电机的电流,可以实现电机的调速。

电流调速的优点是效率高,因为电机的功率不变,但电流增加不会产生大量的损耗。

但是,电流调速需要较为复杂的电路控制,因此成本较高。

3. PWM调速PWM调速是一种基于脉冲宽度调制技术的调速方式,它通过改变电机的脉冲宽度来改变电机的平均电压和电流,从而实现电机的调速。

当脉冲宽度增加时,电机的平均电压和电流也会增加,从而实现电机的加速。

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

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

基于单片机的无刷直流风扇转速测量与调节——09ME-LLQ测量风扇型号:品牌:台达,型号:AFB0712HHB东流电子HOT 51系列单片机学习板数码管显示芯片:74HC573 74HC138使用C语言编程一、项目开发流程:流程图开始中断产生PWM波计算风扇产生脉冲数码管显示理论值和实际值串口通信输入转速输出对应占空比的PWM波控制转速二、源程序#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longuchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点数字uchar code LED_W[8] = {0,1,2,3,4,5,6,7}; //亮数码管位sbit d1=P1^0;ulong number;uint num,tta,ttc,bb,cc,pm;uchar i=0;void Delay(uint i) //用于显示数码管,软件廷时1ms{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void display(num) //显示程序{P0 = table[num/1000]; //显示转速测量值if((num/1000)!=0){P2 = LED_W[4];}Delay(1);P0 = table[(num/100)%10];P2 = LED_W[5];Delay(1);P0 = table[(num/10)%10];P2 = LED_W[6];Delay(1);P0 = table[num%10];P2 = LED_W[7];Delay(1);P0 = table[bb/1000]; //显示转速目标值if((bb/1000)!=0){ P2 = LED_W[0]; }Delay(1);P0 = table[(bb/100)%10];P2 = LED_W[1];Delay(1);P0 = table[(bb/10)%10];P2 = LED_W[2];Delay(1);P0 = table[bb%10];P2 = LED_W[3];Delay(1);}void Init(void) //程序初始化{EA=0;tta=0;num=0;bb=600;number=0;pm=800;TMOD = 0x26; //T0计数模式3,T1定时模式3 PCON = 0x00;SCON = 0x50;TH0=0xff; //计数器T0,一个脉冲溢出TL0=0xff;TH1 = 0xFd; //设置串口波特率9600TL1 = 0xFd;RCAP2H=(65536-50)/256; //定时器T2,定时0.5msRCAP2L=(65536-50)%256;ET0=1; //开T0、T1、T2中断允许ET2=1;TR0=1;TR1=1;TR2=1; //启动定时器1ES=1; //开串口中断EA=1; //开总中断}void pwm(bb) //调速程序{if(bb>=2100) pm=1910;else if(bb>=2000) pm=1835;else if(bb>=1900) pm=1650;else if(bb>=1800) pm=1500;else if(bb>=1700) pm=1370;else if(bb>=1600) pm=1240;else if(bb>=1500) pm=1150;else if(bb>=1400) pm=1110;else if(bb>=1300) pm=1030;else if(bb>=1200) pm=990;else if(bb>=1100) pm=905;else if(bb>=1000) pm=845;else if(bb>=900) pm=770;else if(bb>=800) pm=718;else if(bb>=700) pm=655;else if(bb>=600) pm=620;else if(bb>=500) pm=575;else if(bb>=400) pm=535;else if(bb>=300) pm=500;}void Main(void) //主函数{Init();while(1){if(num<bb-12) //速度微调pm=pm+1;else if(num>bb+12)pm=pm-1;elsepm=pm;display(num);}}void exter1() interrupt 1 using 1 // 定时器T0,P3.4接口计数方式{i++;number=number+tta;tta=0;if(i==3) //测量三次求平均值,减小转速波动{i=0;num=1800000/number;number=0;}}/* void Timer1 (void) interrupt 4 using 2 //T1,串口接收十六进制格式发送的目标转速{static uchar i=1; //定义为静态变量,当重新进入这个子函数时i的值不会发生改变EA = 0;if(RI == 1) //当硬件接收到一个数据时,RI会置位{if(i==1){cc=SBUF;RI=0;EA=1;}if(i==0){cc=cc*256+SBUF;RI=0;EA=1;i=2;bb=cc;cc=0;}i--;}pwm(bb);} */void Timer1 (void) interrupt 4 using 2 //T1,串口接收字符格式发送的目标转速{static uchar i=3; //定义为静态变量,当重新进入这个子函数时i的值不会发生改变EA = 0;if(RI == 1) //当硬件接收到一个数据时,RI会置位{if(i==3){cc=(SBUF-48);RI=0;EA=1;}if(i==2){cc=cc*10+(SBUF-48);RI=0;EA=1;}if(i==1){cc=cc*10+(SBUF-48);RI=0;EA=1;}if(i==0){cc=cc*10+(SBUF-48);RI=0;EA=1;i=4;bb=cc;cc=0;}i--;}pwm(bb);}void timer2() interrupt 5 using 3 //定时器T2,0.5ms中断产生PWM方波{static uchar i=0;TF2=0;i++;tta++;ttc++;if(ttc>=pm) //占空比0.22以下,风扇不转{d1=0;if(ttc==2000) //PWM波周期为100ms,周期越小,转速越稳定{d1=1;ttc=0;}}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

████工学院微机原理(3级)项目报告项目名称:微机原理课程设计项目题目:无刷直流风扇调速与测速指导教师:███系别:机电系专业:机械设计制造及其自动化组员信息学号:姓名:王██组员信息学号:姓名:郭██完成时间:2014 年12 月01 日至 2016 年 1 月 3 日成绩:评阅人:目录一、学习目标 (1)二、项目要求 (1)三、转速测量和调节系统的硬件构成 (1)四、程序流程图并说明方案思路 (3)五、风扇转速与占空比之间的关系表格和曲线 (4)六、设计程序 (5)七、分析设计过程出现的问题 (12)八、方案总结 (13)一、学习目标本次系统作业的目的在于:①通过脉冲宽度调节实现无刷直流风扇转速的改变;②借助风扇转动时产生的脉冲信号,测量风扇的转速并显示;③比较每组风扇从某一转速(600r/min)到另一转速(2000r/min)稳定运转的所需要的时间。

通过比较试验结果的估算结果并讨论结果差异的主要原因,让学生展示对无刷直流风扇数学模型建立和调节方法局限性有深入理解。

二、项目要求检查项目要求转速显示风扇转速能够显示在LED上,转速单位是r/min,刷新周期为1秒钟左右风扇转速可调风扇转速可以改变,根据要求转速在700-1400r/min风扇转速与显示通过简单方法给风扇加负载,随着转速的下降应该看到转速变化的显示转速指令输入环节通过串口或键盘输入给定转速给定某一转速,1200-1500之间,看显示转速的稳定性转速调节功能在稳定转动条件下1500r/min,在30cm处加载一个外加一个风扇,对照加载前后的稳态转速回答问题随机提出有关转速测量、PWM输出和转速控制方面的问题,要有针对性,检查设计过程中的付出。

三、系统硬件构成风扇电路:接线:黄线接Vcc,黑线接地,绿线接P3^2,蓝线接P2^5。

输出:OC输出,如下图四、画程序流程图并说明方案思路开始初始化中断产生PWM波显示转速和占空比查询是否需要反馈调整查询是否收到串口数据查询风扇转速是否更新查询有无按键操作调整占空比更新目标转速刷新数码管缓存数据计算需要的占空比YYYYNNNN程序主要用查询法判断需要执行的操作,并且利用中断处理函数来产生各种对应的标志位来通知主循环,在主循环中进行要求的运算。

其中T0定时约500us,它的每次中断相当于输出一个载波脉冲,实际上是用载波脉冲数为200个,载波周期为500us的方式构成周期为100ms的PWM波。

T1用做波特率发生器。

T2定时60ms。

每次T2中断能重置一次按键处理标志位,这个标志位能保证每60ms内只允许处理一次按键操作,让按键处理既能高速增减,也能准确;此外当有合计25次T2的中断发生时,它能保存当前的转速值并且通知主循环刷新数码管显示请况,因此我们计算转速的方式是“统计1.5s内风扇的转动圈数”。

利用在T2中断的定时判断,也能把当前数码管的显示请况发回PC机。

串口通讯方面,也是利用一个标志位来申明是否接受了数据。

使用“操作符+操作数据”的5字节字符串数据格式,例如用“A0980”代表需要风扇按n=980r/min的速度运行。

通知标志被主循环检测到的时候,会将串口数据检查并且保存成整数形式,方便后续函数的调用。

当串口数据不合理时,会发送信息到PC机。

五、风扇转速与占空比之间的关系表格和曲线编程实现单片机给PC定时发送转速与占空比数据后,取对应的数据制表如下。

将500个转速与占空比数据拟合成关系曲线如下可以发现,在风扇正常转动时,转速与占空比有着正相关的关系,占空比越大,风扇的转速越高。

此外,当占空比小于26%时,风扇停转。

六、设计程序1、主程序:#include <reg52.h>#define jingzhen 11059200UL /*使用11.0592M晶体*/#define botelv 9600UL /*波特率定义为9600*/volatile unsigned char sending;sbit dula =P2^6; //段选信号的锁存器控制sbit wela =P2^7; //位选信号的锁存器控制sbit PwmOut=P2^5; //PWM输出位置蓝线sbit need_steady=P3^4; //接地后开始调整sbit HideValue =P3^5; //接地后显示目标转速sbit K3 =P3^6; //增加占空比按钮sbit K4 =P3^7; //减少占空比按钮unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管各位的码表unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的码表unsigned char SPEED,SPEED_temp,count_time,count_send,wait;unsigned char PWM_count,PWM_turn,PWM_max; //控制PWM波的计数,转变值,周期个数,unsigned char Number[8]={0},value[6]={0}; //数码管显示缓存和串口字符串数据缓存int Target;bit flag=0,flag_k=0,flag_send=0,flag_direct=0; //通知标志void Timer0Init(void); //初始化函数void Timer2Init(void);void Ext0Init(void);void UARTInit(void);void check();void VALUE_To_Num(int num,unsigned char d); //数据填入数码管函数void direct(); //直接与反馈调节PWM函数void adjust();void Display();void send(unsigned char d);void sendc(unsigned char * pd);void sendc_num(unsigned char * pd);void main(){flag_direct=0;flag_send=0;wait=5;PWM_count=0,PWM_turn=170,PWM_max=200;Timer0Init();Timer2Init();Ext0Init() ;UARTInit() ;need_steady=1; //接地后开始调整HideValue =1; //接地后显示目标转速K3 =1; //增加占空比按钮K4 =1; //减少占空比按钮while(1) //主循环{if(flag_k) //控制每60ms允许通过按键调整一次PWM_turn{if(!K3&&PWM_turn<190) PWM_turn++;if(!K4&&PWM_turn>10 ) PWM_turn--;flag_k=0;}if(flag_direct){check();direct();flag_direct=0;wait=4; //传送了直接值后不能马上进行反馈调整,误差太大了}if(flag) //控制约1.5s允许调整数码管显示值{VALUE_To_Num((500*(SPEED_temp)/25),4);if(wait>0)wait--; //减缓约4.5~6s才允许反馈调整if((0==wait)&&(!need_steady)){ //满足条件时启用转速反馈调整adjust();}flag=0;}VALUE_To_Num(PWM_turn,0);if(!HideValue){ VALUE_To_Num(Target,0);} //直接按下K2显示当前的目标转速的值,可以检查有没有收到串口数据if(flag_send){ sendc_num(Number);flag_send=0;}Display();}}2、初始化子程序void Timer0Init(void){TMOD |= 0x01; //T0 16位定时TL0 = 0x33; //设置定时初值TH0 = 0xFE; //设置定时初值TF0 = 0; //清除TF0标志EA = 1; //总中断打开ET0 = 1; //定时器0中断打开TR0 = 1; //定时器0开始计时}void Timer2Init(void){RCAP2H = 0x28;RCAP2L = 0x00; //定时60msEA=1; //打开总中断ET2=1; //打开定时器2中断TR2=1; //定时器2开始计时}void ext0Init(void){INT0=1; //置高接收口P3.2PX0=1; //设置高中断优先级EA=1; //全局中断开IT0=1; //边沿触发EX0=1; //外部中断0开}void UARTInit(void) //9600bps@11.0592MHz{EA=0; //暂时关闭中断TMOD|=0x20; //定时器1工作在模式2,自动重装模式SCON=0x50; //串口工作在模式1TH1=256-jingzhen/(botelv*12*16); //计算定时器重装值TL1=256-jingzhen/(botelv*12*16);PCON|=0x80; //串口波特率加倍PS=1; //给串口中断高优先级ES=1; //串行中断允许TR1=1; //启动定时器1REN=1; //允许接收EA=1; //允许中断}3、中断操作程序/*********************************************************外部中断0统计转速脉冲*********************************************************/void ext0(void) interrupt 0 //负责统计速度值,信号下降沿产生中断{SPEED++;}/*********************************************************定时器0负责调控PWM波*********************************************************/void time0(void) interrupt 1 using 1 //负责产生PWM波{TL0 = 0x33; //设置定时初值TH0 = 0xFE; //设置定时初值PwmOut=PWM_count<PWM_turn?1:0; //计数值在0~199共200个组成;PWM_turn=0时只输出低电平,PWM_turn=PWM_max时只输出高电平PWM_count++;if(PWM_count>=PWM_max) //PWM_count达到顶端时回到初始PWM_count=0;}/*********************************************************串行中断服务函数接受速度控制命令*********************************************************/void serial() interrupt 4{static unsigned char write_point=0;static bit read_able=0;unsigned char Temp;if(RI) //判断是接收中断产生{RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值if(read_able){value[write_point]=Temp;write_point++;if(write_point>4) //只读入4个字节{flag_direct=1; //通知主函数可以调节PWM了read_able=0;write_point=0;wait=4; //立即暂停反馈调整}}if(Temp=='A') //'A'作为特征码检测,也可以使用其他的字母来规定控制代码{write_point=0; //一旦收到A_ _ _ _,指针回到开头并且允许接受数据read_able=1;}}if(TI) //如果是发送标志位,清零{TI=0;sending=0; //清正在发送标志}}/*********************************************************定时器2调节数码管的刷新速度*********************************************************/void time2(void) interrupt 5 using 1 //定时器2中断{TF2=0;//必要的软件清中断标志count_time++;flag_k=1;if (count_time>=25){flag=1;SPEED_temp=SPEED;SPEED=0;count_time=0;count_send++;}if (count_send>=5){flag_send=1;count_send=0;}}4、辅助处理程序/*********************************************************检查串口数据*********************************************************/void check(){ unsigned char i;for(i=0;i<4;i++){if(value[i]<'0'||value[i]>'9')value[i]='0';}Target=(value[0]-'0')*1000+(value[1]-'0')*100+(value[2]-'0')*10+(value[3]-'0');if(Target>2180||Target<280) //禁止不可调节范围的PWMsendc("范围外的转速值!!\n");}/*********************************************************将数据填入数码管缓存*********************************************************/void VALUE_To_Num(int Num,unsigned char d){ unsigned char i;for(i=7;i>3;i--){Number[i-d]=Num%10;Num=Num/10;}}/*********************************************************直接调节PWM函数*********************************************************/void direct(){if(Target>2180||Target<280) //禁止不可调节范围的PWMreturn;if(Target<1520)PWM_turn=( 0.00003*Target*Target + 0.01311*Target + 53.467);//使用分段函数更贴合PWM-n 的关系elsePWM_turn=(-0.00009*Target*Target + 0.4299 *Target - 302.08);if(PWM_turn>200) PWM_turn=200;}/*********************************************************反馈调节PWM函数*********************************************************/void adjust(){double num;num=SPEED_temp*20;if(Target>2180||Target<280) //禁止不可调节范围的PWMreturn;if(Target<1520)PWM_turn=PWM_turn+( 0.00006*Target + 0.01311)*(Target-num);//原理是dy=f'(x)*dx else //属于比例调节PWM_turn=PWM_turn+(-0.00018*Target + 0.4299)*(Target-num);if(num<(Target/4)) //防堵转检测{ direct();wait=4;}if(PWM_turn>200) PWM_turn=200;}/*********************************************************数码管显示程序*********************************************************/void Display(){ unsigned char num;unsigned int m;for(num=0;num<8 ;num++){ P0=wei[num];wela=1;wela=0;P0=duan[Number[num]];dula=1;dula=0;for(m=128;m>0;m--); //时间间隔短,利用人眼的余辉效应,觉得每个数码管都一直在亮。

相关文档
最新文档