采用PWM调制技术实现对直流电机转速的控制
采用PWM调制技术实现对直流电机转速的控制
陈宁坡
(河北科技大学信息科学与工程学院)
摘要:在运动控制系统中,电机转速控制占有至关重要的作用,其控制算法和手段有很多,模拟PID控制是最早发展起来的控制策略之一,长期以来形成了典型的结构,并且参数整定方便,能够满足一般控制的要求,但由于在模拟PID控制系统中,参数一旦整定好后,在整个控制过程中都是固定不变的,而在实际中,由于现场的系统参数、温度等条件发生变化,使系统很难达到最佳的控制效果,因此采用模拟PID控制器难以获得满意的控制效果。随着计算机技术与智能控制理论的发展,数字PID技术渐渐发展起来,它不仅能够实现模拟PID所完成的控制任务,而且具备控制算法灵活、可靠性高等优点,应用面越来越广。
关键词:数字PID;PWM脉冲;占空比;无静差调节
The PWM modulation technique to achieve the control of the DC
motor speed
CHEN ningpo
(College of Information Science and Engineering,Hebei University of Science and Technology)Abstract: In the motion control system,the control of electromotor's rotate speed is of great importance,there are a lot of speed control arithmetics and methods ,the analog PID control is one of the earliest developed control policies which has formed typical structure ,its parametric setting is convenient and it's easy to meet normal control's demand,but as the whole control process is fixed once the parameter has been set while practically the changes of those conditions like the system parameters and temperature of the environment prohibit the system from reaching its best control effect,so the analog PID controller barely has satisfied effect.With the development of computer technology and intelligent control theory ,the digital PID technology is thriving which can achieve the analog PID's control tasks and consists of many advantages like flexible control arithmetics and high reliability,it is widely used now.
Keywords:digital PID;PWM impulse;dutyfactor;astatic modulation
目前,PID控制及其控制器或智能PID控制器已经很多,产品已在工程实际中得到了广泛的应用。本次设计主要是利用PID控制技术对直流电机转速的控制。其设计思路为:以AT89S51单片机为控制核心,产生占空比受PID算法控制的PWM脉冲实现对直流电机转速的控制。同时利用光电传感器将电机速度转换成脉冲频率反馈到单片机中,构成转速闭环控制系统,达到转速无静差调节的目的。在系统中采128×64LCD显示器作为显示部件,
)
()(n e K n u P p =通过4×4键盘设置P 、I 、D 、V 四个参数和正反转控制,启动后通过显示部件了解电机当前的转速和运行时间。因此该系统在硬件方面包括:电源模块、电机驱动模块、控制模块、速度检测模块、人机交互模块。软件部分采用C 语言进行程序设计,其优点为:可移植性强、算法容易实现、修改及调试方便、易读等。
1 PID 算法及PWM 控制技术简介
1.1 PID 算法
控制算法是微机化控制系统的一个重要组成部分,整个系统的控制功能主要由控制算法来实现。目前提出的控制算法有很多。根据偏差的比例(P )、积分(I )、微分(D )进行的控制,称为PID 控制。实际经验和理论分析都表明,PID 控制能够满足相当多工业对象的控制要求,至今仍是一种应用最为广泛的控制算法之一。下面分别介绍模拟PID 、数字PID 及其参数整定方法。
1.2 数字PID
在DDC 系统中,用计算机取代了模拟器件,控制规律的实现是由计算机软件来完成的。因此,系统中数字控制的设计,实际上是计算机算法的设计。
由于计算机只能识别数字量,不能对连续的控制算式直接进行运算,故在计算机控制系统中,首先必须对控制规律进行离散化的算法设计。
为将模拟PID 控制规律按式(1.2)离散化,我们把图1.1中)(t r 、)(t e 、)(c )t (t u 、 n 次采样的数据分别用)()()()(n c n u n e n r 、、、表示,于是式(1.1)变为 :
)(n e =)(n r -)(n c (1.1)
当采样周期T 很小时dt 可以用T 近似代替,)(t de 可用)1()(--n e n e 近似代替,“积分”用“求和”近似代替,即可作如下近似
T n e n e dt t de )1()()(--≈ (1.2)
?∑=≈t
n
i T i e dt t e 0
1
)()( (1.3)
这样,式(1.2)便可离散化以下差分方程 01
})]1()([)()({)(u n e n e T
T n e T T
n e K n u n
i D
I
P +--+
+=∑= (1.4) 上式中
0u 是偏差为零时的初值,上式中的第一项起比例控制作用,称为比例(P )项)(n u p ,即
(1.5) 第二项起积分控制作用,称为积分(I )项)(n U I 即 ∑==n
i I
P
I i e T T
K n u 1
)
()( (1.6)
T
T
K K D P D =I
P
I T T
K K =0)]2()1(2)([)()]1()([u n e n e n e K n e K n e n e K D I P +-+--++--=)(n u )]2()1(2)([)()]1()([-+--++--=n e n e n e K n e K n e n e K D I P 011})]2()1([)()1({)1(u n e n e T
T n e T T n e K n u n i D I P +---++-=-∑-=0)()()()(u n u n u n u n u D I P +++=0)()()(u n u n u n u D P ++=0)()()(u n u n u n u I P ++=0)()(u n u n u P +=PID 位置算法
控制器被控对象
r(t)+
-
e(t)
u
c(t)
PID 增量算法
控制器
被控对象
r(t)+
-e(t)
u
c(t)
第三项起微分控制作用,称为微分(D )项)(n U d 即
)]1()([)(--=n e n e T
T K n u D
P
D (1.7)
这三种作用可单独使用(微分作用一般不单独使用)或合并使用,常用的组合有:
P 控制: (1.8)
PI 控制: (1.9)
PD 控制: (1.10)
PID 控制: (1.11)
式(1.7)的输出量)(n u 为全量输出,它对于被控对象的执行机构每次采样时刻应达到的位置。因此,式(1.7)又称为位置型PID 算式。
由(1.7)可看出,位置型控制算式不够方便,这是因为要累加偏差)(t e ,不仅要占用较多的存储单元,而且不便于编写程序,为此对式(1.7)进行改进。根据式(1.7)不难看出u(n-1)的表达式,即
(1.12)
将式(1.7)和式(1.15)相减,即得数字PID 增量型控制算式为
)1()()(--=?n u n u n u
(1.13)
从上式可得数字PID 位置型控制算式为
(1.14) 式中: p k 称为比例增益;
称为积分系数;
称为微分系数[1]。 数字PID 位置型示意图和数字PID 增量型示意图分别如图1和2所示:
图1 数字PID 位置型控制示意图
U T
U
t nT U nt U ?=?=?=α000U U ?=α0U(t)
0t
T t 0U
2T 2t 03T 3t 04t 0nT (n+1)t 0U(t)
t
T
t 0
U
图2 数字PID 增量型控制示意图
1.3 数字PID 参数整定方法
如何选择控制算法的参数,要根据具体过程的要求来考虑。一般来说,要求被控过程是稳定的,能迅速和准确地跟踪给定值的变化,超调量小,在不同干扰下系统输出应能保持在给定值,操作变量不宜过大,在系统和环境参数发生变化时控制应保持稳定。显然,要同时满足上述各项要求是很困难的,必须根据具体过程的要求,满足主要方面,并兼顾其它方面。
PID 调节器的参数整定方法有很多,但可归结为理论计算法和工程整定法两种。用理论计算法设计调节器的前提是能获得被控对象准确的数学模型,这在工业过程中一般较难做到。因此,实际用得较多的还是工程整定法。这种方法最大优点就是整定参数时不依赖对象的数学模型,简单易行。当然,这是一种近似的方法,有时可能略嫌粗糙,但相当适用,可解决一般实际问题。
1.4 直流电机的PWM 控制技术
根据PWM 控制的基本原理可知,一段时间内加在惯性负载两端的PWM 脉冲与相等时间内冲量相等的直流电加在负载上的电压等效,那么如果在短时间T 内脉冲宽度为0t ,幅值为U ,由图3可求得此时间内脉冲的等效直流电压为:
,若令 ,α即为占空比,则上式可化为: (U 为脉冲幅值) (1.15)
图3 PWM 脉冲
若PWM 脉冲为如图4所示周期性矩形脉冲,那么与此脉冲等效的直流电压的计算方法与上述相同,即
(α为矩形脉冲占空比) (1.16)
图4 周期性PWM 矩形脉冲
T U t U ?=0
0T t 0=α
键盘模块
控制器模块
显示模块
电机驱动模块直流电机
速度检测模块
PWM 脉冲
由式1.20可知,要改变等效直流电压的大小,可以通过改变脉冲幅值U 和占空比α来实现,因为在实际系统设计中脉冲幅值一般是恒定的,所以通常通过控制占空比α的大小实现等效直流电压在0~U 之间任意调节,从而达到利用PWM 控制技术实现对直流电机转速进行调节的目的。
2 设计方案与论证
2.1 系统设计方案
根据系统设计的任务和要求,设计系统方框图如图5所示。图中控制器模块为系统的核心部件,
键盘和显示器用来实现人机交互功能,其中通过键盘将需要设置的参数和状态输入到单片机中,并且通过控制器显示到显示器上。在运行过程中控制器产生PWM 脉冲送到电机驱动电路中,经过放大后控制直流电机转速,同时利用速度检测模块将当前转速反馈到控制器中,控制器经过数字PID 运算后改变PWM 脉冲的占空比,实现电机转速实时控制的目的。
图5 系统方案框图
3 单元电路设计
3.1 硬件资源分配
本系统电路连接及硬件资源分配见图6所示。采用AT89S51单片机作为核心器件,转速检测模块作为电机转速测量装置,通过AT89S51的P3.3口将电脉冲信号送入单片机处理,L298作为直流电机的驱动模块,利用128×64LCD 显示器和4×4键盘作为人机接口。
P0.0~P0.7128×64LCD
显示模块
P2.7
P2.6
电机驱动模块
P2.0~P0.5
5
4×4键盘
P1.0~P1.3P1.4~P1.7
4
4
L0~L3
H0~H3
P3.2/INT0AT89S51
P3.3/INT1
电机
转速检测
四输入与门
)]2()1(2)
([)()]1()([u n e n e n e K n e K n e n e K D I P +-+--++--图6 系统电路连接及硬件资源分配图
3.2 电机速度采集电路设计
在本系统中由于要将电机本次采样的速度与上次采样的速度进行比较,通过偏差进行PID 运算,因此速度采集电路是整个系统不可缺少的部分。本次设计中应用了比较常见的光电测速方法来实现,其具体做法是将电机轴上固定一圆盘,且其边缘上有N 个等分凹槽如图7(a )所示,在圆盘的一侧固定一个发光二极管,其位置对准凹槽处,在另一侧和发光二极光平行的位置上固定一光敏三极管,如果电动机转到凹槽处时,发光二极管通过缝隙将光照射到光敏三极管上,三极管导通,反之三极管截止,电路如图7(b )所示,从图中可以得出电机每转一圈在P3.3的输出端就会产生N 个低电平。这样就可根据低电平的数量来计算电机此时转速了。例如当电机以一定的转速运行时,P3.3将输出如图8所示的脉冲,若知道一段时间t 内传感器输出的低脉冲数为n ,则电机转速v=r/s 。
(a)
(b)
图7 电机速度采集方案
图8 传感器输出脉冲波形
4 软件设计
4.1 PID 算法
本系统设计的核心算法为PID 算法,它根据本次采样的数据与设定值进行比较得出偏差)(n e ,对偏差进行P 、I 、D 运算最终利用运算结果控制PWM 脉冲的占空比来实现对加在电机两
端电压的调节[10],进而控制电机转速。其运算公式为:
=)(n u 因此要想实现PID 控制在单片机就必须存在上述算法,
圆盘光敏三极管
发光二极管+5V
P3.3
470Ω200Ω
R1
R2
计算e(n)计算KIe(n)计算KP(e(n)-e(n-1))计算KD(e(n)-2e(n-1)+e(n-2))
计算Δu(n)
计算Δu(n)
+u(n-1)e(n-1)→e(n-2)e(n)→e(n-1)
开始初始化
调用清屏子程序
开始界面显示
设置键按下?
调用清屏子程序设置界面显示
根据设置计算参数启动键按下?调用清屏子程序
电机运行状态显示PWM 脉冲输出
Y
N
Y
N 其程序流程如图9所示。
4.2 程序流程主流程图
在一个完整的系统中,只有硬件部分是不能完成相应设计任务的,所以在该系统中软件部分是非常重要的,按照要求和系统运行过程设计出主程序流程如图10所示
图10 主程序流程
5 系统测试与分析
为了确定系统与设计要求的符合程度,需要进行系统测试与分析,但是由于试验调节的制约和时间的限制,不能完成此次制作,只能通过软件仿真进行验证,在这里使用的是英国的Proteus 软件进行测试,对于电机速度采集可根据设定的电机速度计算出P3.3口输入的方波脉冲的频率和占空比,来改变等效直流电压的大小,给P3.3输入此脉冲来实现电机速度采集。并允许误差存在。下面以PID 调节器为例,具体说明经验法的整定步骤:
①让调节器参数积分系数I k =0,实际微分系数D k =0,控制系统投入闭环运行,由小到大改变比例系数p k ,让扰动信号作阶跃变化,观察控制过程,直到获得满意的控制过程为止。
②取比例系数p k为当前的值乘以0.83,由小到大增加积分系数I k,同样让扰动信号作阶跃变化,直至求得满意的控制过程。
③积分系数I k保持不变,改变比例系数p k,观察控制过程有无改善,如有改善则继续调整,直到满意为止。否则,将原比例系数p k增大一些,再调整积分系数I k,力求改善控制过程。如此反复试凑,直到找到满意的比例系数p k和积分系数I k为止。
④引入适当的实际微分系数D k和实际微分时间D T,此时可适当增大比例系数p k和积分系数I k。和前述步骤相同,微分时间的整定也需反复调整,直到控制过程满意为止。
PID参数是根据控制对象的惯量来确定的。大惯量如:大烘房的温度控制,一般P可在10以上,I在(3、10)之间,D在1左右。小惯量如:一个小电机闭环控制,一般P在(1、10)之间,I在(0、5)之间,D在(0.1、1)之间,具体参数要在现场调试时进行修正。
根据上诉方法,通过软件仿真系统得出数据如表1所示,通过观察得出该系统比较合适的P、I、D三者的参数值为: p k=2, I k=2.2, D k=0.2。并且可以反映
表1 测试数据表
次数设定p k设定I k设定D k设定(r/min)超调量调节时间(s)误差
1 2 2.2 0.2 100 8% 4
% 1±
2 3 2.2 0.2 100 15% 5
% 2±
3 4 2.2 0.2 100 22%11
% 5±
4 1 2.2 0.2 100 5% 6
% 3±
5 0 2.2 0.2 100 1%12
% 6±
6 2 1.1 0.2 100 6%8
% 2±
7 2 0 0.2 100 2% 15
% 9±
8 2 3.3 0.2 100 8% 5
% 1±
9 2 4.4 0.2 100 9%7
% 2±
10 2 2.2 0.1 100 8% 6
% 1±
11 2 2.2 0 100 6% 5
% 5±
12 2 2.2 0.3 100 7% 5
% 1±
13 2 2.2 0.4 100 6% 7
% 4±
通过上诉的数据分析可知,该系统完成了设计的任务及要求,证实了设计方案的可行性和设计方法的正确性。
6 结论
本课题的目的在于利用单片机实现PID算法产生PWM脉冲来控制电机转速。到目前为止通过对控制器模块、电机驱动模块、LCD显示模块、键盘模块、数字PID算法等进行深入的研究。完成了硬件电路的系统设计,并且利用Protel99se软件绘制出PCB图纸,但由于实验条件不足没能做出PCB板。软件方面利用C语言进行编程,增强了程序的可移植性和灵活性,并且利用Proteus 软件进行仿真更加保证了程序的准确性。
7 参考文献
[1] ST. L298N数据手册[DB/OL]. https://www.360docs.net/doc/75856431.html,.2000-7-1/2008-5-9.
[2] 沙占友. 单片机外围电路设计[M]. 北京:电子工业出版社, 2003:21.
[3] 何立民. MCS-51系列单片机应用系统设计系统配置与接口技术[M]. 北京:北京航空航天大学出版社,1990:83-87.
[4] Behzad Razavi.Design of Analog CMOS and Integrated Circuits[M].McGraw-Hill Companies,2001:28-36.
[5] Tao Wu,Ykang Yang,Yongxuan Huang,etal. H-PID Controller Parameters Tuning via Genetic Algorithms[C] .Intelligent Controland Automation.Proceedings of the 3rd World Congress on,2000,1:586-589.
[6] Cominos P,Munro N.PID controllers:Recent Tuning Methods and Designto Specifi- cation[M].Control Theory and Applications,IEE Proceedings,January,2002,149:46.
附录Ⅰ部分源程序
一、主程序:
main( )
{
zf=0;
flag1=0;
EA=1;
IT0=1;
EX0=1;
count=0;
en=0;
en1=0;
en2=0;
U0=200;
Un=0;
cc=0;
zanting=0;
pwm1=0;
pwm2=0;
P1=0xF0;
Init_lcd(); //设置液晶显示器
Clr_Scr(); //清屏
left();Disp_Chinese(0,0,dan); //单
left();Disp_Chinese(0,16,pian); //片
left();Disp_Chinese(0,32,ji); //机
left();Disp_Chinese(0,48,de); //的
right();Disp_Chinese(0,0,shu); //数
right();Disp_Chinese(0,16,zi); //字
right();Disp_Digit(0,32,dp); //P
right();Disp_Chinese(0,40,di); //I
right();Disp_Digit(0,56,dd); //D
left();Disp_Chinese(3,16,dian); //电
left();Disp_Chinese(3,32,ji); //机
left();Disp_Chinese(3,48,tiao); //调
right();Disp_Chinese(3,0,shu0); //速
right();Disp_Chinese(3,16,xi); //系
right();Disp_Chinese(3,32,tong); //统
left();Disp_Chinese(6,48,heng); //横线
right();Disp_Chinese(6,0,heng); //横线
right();Disp_Chinese(6,16,jia);
right();Disp_Chinese(6,32,xiao);
right();Disp_Chinese(6,48,wei);
flag0=0;
for( ; ; ) //等待设置键按下
{ if(flag0==1)
break;
}
Clr_Scr(); //清屏
left();Disp_Chinese(0,32,can);
left();Disp_Chinese(0,48,shu);
right();Disp_Chinese(0,0,she);
right();Disp_Chinese(0,16,zhi);
left();Disp_Chinese(2,4,Kp);
left();Disp_Digit(2,20,maohao);
left();Disp_Digit(2,28,s[0]);
left();Disp_Digit(2,36,s[0]);
left();Disp_Digit(2,44,dian0);
left();Disp_Digit(2,52,s[0]);
right();Disp_Chinese(2,4,Ki);
right();Disp_Digit(2,20,maohao);
right();Disp_Digit(2,28,s[0]);
right();Disp_Digit(2,36,s[0]);
right();Disp_Digit(2,44,dian0);
right();Disp_Digit(2,52,s[0]);
left();Disp_Chinese(4,4,Kd);
left();Disp_Digit(4,20,maohao);
left();Disp_Digit(4,28,s[0]);
left();Disp_Digit(4,36,s[0]);
left();Disp_Digit(4,44,dian0);
left();Disp_Digit(4,52,s[0]);
right();Disp_Chinese(4,4,V);
right();Disp_Digit(4,20,maohao);
right();Disp_Digit(4,28,s[0]);
right();Disp_Digit(4,36,s[0]);
right();Disp_Digit(4,44,s[0]);
left();Disp_Chinese(6,4,zhuan);
left();Disp_Chinese(6,20,xiang);
left();Disp_Digit(6,36,maohao);
left();Disp_Chinese(6,44,zheng);
flag1=0;
for(set=0;;) //等待启动键按下{
switch(set)
{case 0:break;
case 1: left();Disp_Digit(2,28,s[0]);
left();Disp_Digit(2,36,s[0]);
left();Disp_Digit(2,52,s[0]);
Kpp=0;
for(flag=0,n=0;;)
{
left();Disp_Digit(2,28,kong);
Delay12864(1000);
left();Disp_Digit(2,28,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
left();Disp_Digit(2,28,s[n]);
Kpp+=10*n;
for(flag=0,n=0;;)
{
left();Disp_Digit(2,36,kong);
Delay12864(1000);
left();Disp_Digit(2,36,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
left();Disp_Digit(2,36,s[n]);
Kpp+=n;
for(flag=0,n=0;;)
{
left();Disp_Digit(2,52,kong);
Delay12864(1000);
left();Disp_Digit(2,52,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
left();Disp_Digit(2,52,s[n]);
Kpp+=0.1*n;
set=0;
break;
case 2:right();Disp_Digit(2,28,s[0]);
right();Disp_Digit(2,36,s[0]);
right();Disp_Digit(2,52,s[0]);
Kii=0;
for(flag=0,n=0;;)
{
right();Disp_Digit(2,28,kong);
Delay12864(1000);
right();Disp_Digit(2,28,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
right();Disp_Digit(2,28,s[n]);
Kii+=10*n;
for(flag=0,n=0;;)
{
right();Disp_Digit(2,36,kong);
Delay12864(1000);
right();Disp_Digit(2,36,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
right();Disp_Digit(2,36,s[n]);
Kii+=n;
for(flag=0,n=0;;)
{
right();Disp_Digit(2,52,kong);
Delay12864(1000);
right();Disp_Digit(2,52,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
right();Disp_Digit(2,52,s[n]);
Kii+=0.1*n;
set=0;
break;
case 3:left();Disp_Digit(4,28,s[0]);
left();Disp_Digit(4,36,s[0]);
left();Disp_Digit(4,52,s[0]);
Kdd=0;
for(flag=0,n=0;;)
{
left();Disp_Digit(4,28,kong);
Delay12864(1000);
left();Disp_Digit(4,28,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
left();Disp_Digit(4,28,s[n]);
Kdd+=10*n;
for(flag=0,n=0;;)
{
left();Disp_Digit(4,36,kong);
Delay12864(1000);
left();Disp_Digit(4,36,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
left();Disp_Digit(4,36,s[n]);
Kdd+=n;
for(flag=0,n=0;;)
{
left();Disp_Digit(4,52,kong);
Delay12864(1000);
left();Disp_Digit(4,52,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
left();Disp_Digit(4,52,s[n]);
Kdd+=0.1*n;
set=0;
break;
case 4:right();Disp_Digit(4,28,s[0]);
right();Disp_Digit(4,36,s[0]);
right();Disp_Digit(4,44,s[0]);
V0=0;
for(flag=0,n=0;;)
{
right();Disp_Digit(4,28,kong);
Delay12864(1000);
right();Disp_Digit(4,28,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
right();Disp_Digit(4,28,s[n]);
V0+=100*n;
for(flag=0,n=0;;)
{
right();Disp_Digit(4,36,kong);
Delay12864(1000);
right();Disp_Digit(4,36,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
right();Disp_Digit(4,36,s[n]);
V0+=10*n;
for(flag=0,n=0;;)
{
right();Disp_Digit(4,44,kong);
Delay12864(1000);
right();Disp_Digit(4,44,s[n]);
Delay12864(2500);
if(flag==1)
break;
}
right();Disp_Digit(4,44,s[n]);
V0+=n;
set=0;
break;
}
if(flag1==1)
break;
}
Clr_Scr(); //清屏
left();Disp_Chinese(0,32,dian); //电
left();Disp_Chinese(0,48,ji); //机 right();Disp_Chinese(0,0,zhuang); //状
right();Disp_Chinese(0,16,tai); //态
left();Disp_Chinese(3,0,dang);
left();Disp_Chinese(3,16,qian);
left();Disp_Chinese(3,32,zhuan);
left();Disp_Chinese(3,48,shu0);
right();Disp_Digit(3,0,maohao);
if(zf==0)
{right();Disp_Chinese(3,8,zhenghao);}
else
{right();Disp_Chinese(3,8,fuhao);}
right();Disp_Digit(3,24,s[0]);
right();Disp_Digit(3,32,s[0]);
right();Disp_Digit(3,40,s[0]);
left();Disp_Chinese(6,0,yun);
left();Disp_Chinese(6,16,xing);
left();Disp_Chinese(6,32,shi);
left();Disp_Chinese(6,48,jian);
right();Disp_Digit(6,0,maohao);
right();Disp_Digit(6,8,s[0]);
right();Disp_Digit(6,16,maohao);
right();Disp_Digit(6,24,s[0]);
right();Disp_Digit(6,32,s[0]); right();Disp_Digit(6,40,maohao); right();Disp_Digit(6,48,s[0]); right();Disp_Digit(6,56,s[0]); EX1=1;
IT1=1;
TMOD=0x11;
ET0=1;
TL0=0xb0;
TH0=0x3c;
TR0=1;
Un=0;
if(zf==0)
for(;;)
{ if(zanting==1)
pwm1=0;
else
pwm1=1;
Delay12864(Un);
pwm1=0;
Delay12864(500-Un);
}
if(zf==1)
for(;;)
{ if(zanting==1)
pwm2=0;
else
pwm2=1;
Delay12864(Un);
pwm2=0;
Delay12864(500-Un);
}
}
PWM电机调速原理及51单片机PWM程序经典
Pwm电机调速原理 对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端PE2 和PD5 上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。 此电路中用微处理机来实现脉宽调制,通常的方法有两种: (1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻 辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。 (2)硬件实验自动产生PWM 信号,不占用CPU 处理的时间。 这就要用到ATMEGA8515L 的在PWM 模式下的计数器1,具体内容可参考相关书籍。 51单片机PWM程序 产生两个PWM,要求两个PWM波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256, PWM这个功能在PIC单片机上就有,但是如果你就要用51单片机的话,也是可以的,但是比较的麻烦.可以用定时器T0来控制频率,定时器T1来控制占空比:大致的的编程思路是这样的:T0定时器中断是让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。 *程序思路说明: * * * *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数* *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样* *可以设定占空比可从1-100变化。即0.01ms*100=1ms * ******************************************************************************/ #include
电机PWM控制原理
PWM 电机驱动系统传导干扰机理分析 摘要:针对实际系统将电机系统的交流电源、整流环节、逆变环节、电机作为整体进行分析,为了分析方便将传导干扰分为共模干扰和差模干扰进行研究,分析了PWM电机驱动系统中存在的主要共模和差模干扰通道,由于传导干扰的路径和上下桥臂 IGBT的开通和关断有很大关系,因此分析了 IGBT不同的开关状态下的共模干扰和差模干扰的传播路径,三种不同的仿真结果得出一致的结论说明本文机理分析的正确性。 1.引言 由于PWM技术应用于电机驱动系统中,功率变换器采用MOSFET、IGBT、可关断晶闸管等开关器件。为了得到更好的电机系统控制性能指标,开关器件的工作频率就越来越高,在开关和关断的瞬间产生很大的电压和电流变化率,这就是强电磁干扰(EMI)产生的原因,远远超出了现在电磁兼容标准规定的答应值。产生的电磁干扰主要是以传导的形式进行传播的,机理分析是数学模型建立的基础,因此机理分析对于PWM电机驱动系统传导干扰的研究具有重要意义。 国内外有很多文献在这方面做了一定的研究,文献[1]针对IGBT的高du/dt 给电力电子装置带来的严重共模电磁干扰题目,深进分析了Buck电路的共模干扰。文献[2]以电路理论为基础,建立了单端正激式变换器中,由功率MOSFET的漏极与接地散热器之间寄生电容所形成的输进端共模干扰分析模型。这里就不逐一先容了,本文的机理分析将电机驱动系统作为一个整体来研究,这在文献中很少发现。
2.传导干扰机理分析 下面分三个部分来分析,首先先容所研究的实际系统的主电路,然后分析共模传导干扰的机理,最后分析差模干扰的机理。 2.1 PWM 驱动电机系统主电路 要研究的系统主电路原理图如图1 所示,现简单说明其工作原理。 三相交流电压经三相不可控整流桥整流产生直流电压Ud,经电容C 滤波后仍有微小的脉动,一般可近似以为其值不变。实际上Ud 上具有高频成分,由此产生了二极管上压降的波动。而二极管与散热片之间具有高频寄生电容,形成了共模电流流通的回路。后续章节会对其机理具体分析。直流电压经逆变器逆变后形成等效正弦波驱动感应电动机,逆变器采用正弦波脉宽调制(SPWM)技术。逆变器期看输出的波形为正弦波,以期看的正弦波作为调制波,以频率比调制波高得多的等腰三角波作为载波,当载波和调制波相交时,它们的交点作为逆变器开关
根据proteus仿真的pwm电机调速
直流电机调速资料汇总 一. 使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。 C语言代码: #include
} void beep(void) { uchar t; for(t=0;t<100;t++) { delay500us(); FMQ=!FMQ; //产生脉冲 } FMQ=1; //关闭蜂鸣器 delaynms(300); } void main(void) { TR0=0; //关闭定时器0 TMOD=0x01; //定时器0,工作方式1 TH0=(65526-100)/256; TL0=(65526-100)%256; //100us即0.01ms中断一次EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器T0 ZKB1=50; //占空比初值设定 ZKB2=50; //占空比初值设定 while(1) { if(!K5) { delaynms(15); //消抖 if(!K5) //确定按键按下 { beep(); ZKB1++; //增加ZKB1 ZKB2=100-ZKB1; //相应的ZKB2就减少 } } if(!K6) { delaynms(15); //消抖 if(!K6) //确定按键按下 { beep();