直流电机PWM调速系统的设计与仿真.docx
《直流电机PWM调速系统的设计与仿真.docx》由会员分享,可在线阅读,更多相关《直流电机PWM调速系统的设计与仿真.docx(14页珍藏版)》请在冰豆网上搜索。
![直流电机PWM调速系统的设计与仿真.docx](https://file1.bdocx.com/fileroot1/2023-2/6/9263c7f4-76a4-4499-995f-3cdd614495d1/9263c7f4-76a4-4499-995f-3cdd614495d11.gif)
直流电机PWM调速系统的设计与仿真
直流电机PWM调速系统的设计与仿真
、引言
1本课题设计的目的和要求
1.直流电机PWM调速系统的目的:
(1)熟悉直流电机PWM调速系统的整体运行过程和总体布局
(2)掌握该硬件电路的设计方法
(3)掌握电机PWM调速系统程序的设计和调试
2.直流电机PWM调速系统的要求
(1)可输入0~1范围的占空比,占空比可用电位器输入、拨码开关输入或键盘输入。
(2)设计电机驱动电路,根据输入的占空比控制电机转速。
(3)检测电机转速,并用LED或LCD显示。
(4)在PROTUE下S仿真。
二、系统总体框图与原理说明
总体方案原理及设计框图
本设计是基于AT89c51为核心的直流调速器,由单片机控制和产生适合要求的PWM信号,该PWM信号通过驱动芯片电路进行直流调速,使输出电压平均值和功率可以按照PWM信号的占空比而变化,从而达到对直流电机调速的目的。
拨码开关输入0~1范
围的占空比,用LCD1602作为主液晶显示器,显示输入的占空比控制电机转速,能够实现较好的人机交互。
拨码开关输入模块
总体方案设计框图
三、硬件电路图
用压控振荡器(可用555电路构成)来模拟直流电机的运行
PWM产生方式
(1)PWM(脉冲宽度调制)是通过控制固定电压的直流电源开关频率,改变负载两端的电压,从而达到控制要求的一种电压调整方法。
PWM可以应用在很多方面,比如:
电机调速、温度控制、压力控制等等。
在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开的电源,并且根据需要改变一个周期内“接通”和“断开”时间的长短。
通过改变直流电机电枢上电压的“占空比”来达到改变平均电压大小的目的,从而来控制电动机的转速。
正因为如此,PWM又被称为“开关驱动装置”。
PWM波形如图所示:
PWM波形图
设电机始终接通电路时,电机转速最大为Vmax,设占空比为:
Dt1
T
则电机的平均转速为
VaVmax*D
其中Va指的是电机的平均速度,
Vmax是指电机在全通电时最大速度,D指的是占空比。
max
由上面的公式可见,当改变占空比D时,就可以得到不同电机平均速度Va,从而达到调速的目的。
(2)单片机片内软件生成PWM信号PWM信号采用单片机定时中断的方式软件模拟产生,这样实现比较容易,可以节约硬件成本。
VSSVDDVEErsrweDom皿D3M仍D6D7
-
k,X
f
V
21inco
厂Ou」
厂h/lol6厂
c
0
a
2
3
4
5
丄
6
\
\
\
I
\
\
\
a
7
0)
5
4
co
-I
O-TW«8人-uw«x-
LM26L
八TEXTV
pun—pre—nL:
99ZnaLgl5pmmcu25FsDE"
sDEss01234567VVVRREDDDDDDDD
开始
s-
OFFON
!
=■■
1
J
Q
M=1l=M
z
3
J
■■=1
召
5
L
~6~
7
厂
"s-
DIPSW8DSW1
LGDt
PULPrecent!
472
Hotor.Speeds257
UJUJ>
oo>
wziSr
Or
00QDGOOQ
1
»4
»l却
16«
OFFON
I=^
^■=1
1=^
■1
15"
■2
14■
■3
13-
■4
12"
^■=1
^■=1
^■=1
^■=1
■5
11■
■6
10-
■7
9"
■8
■
DIPSW8
••••-w
周美娟
清华大学出版社
统设计
2.微型计算机控制技术实用教程潘新民王燕芳电子工业出版社
附录
#include<>
#include<>
#include<>
#include<>
#include<>
//==========================
#defineucharunsignedchar#defineuintunsignedint//==========================
#defineData_BusP1
sbitPWM=P3^0;
bitPWM_flag=0;
unsignedcharTime_flag=0;
unsignedcharDSW_data=0x00;
unsignedcharPWM_data=0;
unsignedintSpeed_data=0;
unsignedcharPWM_Precent[5]={0x30,0x30,'%'};
unsignedcharMotorSpeed[5]={0x30,0x30,0x30};
//
//函数声明
voiddelay(uint);
voiddelay_ms(unsignedintii);//1ms延时函数
voidget_PWM(void);
voidget_Speed(void);
//====================延时子函数=========================voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)for(y=110;y>0;y--);
}
voiddelay_ms(unsignedintii)//1ms延时函数
{
unsignedinti,x;
for(x=0;x{
for(i=0;i<200;i++);
//===================外部中断0初始化程序===============voidInit_int0(void)
{
EX0=1;//开外部中断0
IT0=1;//触发
EA=1;}
//==================外部中断0服务程序===================voidInt0_server(void)interrupt0
{
EA=0;
Speed_data++;
EA=1;}
//===================定时器0初始化设置===================voidTime0_Init()//定时器0初始化函数
{
TMOD=0x01;//定时器0为工作方式1TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//初始化为定时时间为50msET0=1;//开定时器0中断
TR0=1;//开定时器
EA=1;//开总开关}
//==================定时器0中断服务程序===============voidTime0_Int()interrupt1//定时器0中断子函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//初始化为定时时间为50msTime_flag++;
if(Time_flag==20)
{
Time_flag=0;get_Speed();
}
//====================定时器1初始化设置==============计=算方波数voidinit_timer1(void)
{
TMOD|=0x10;//定时器1为工作方式116bit
TH1=0xFF;
TL1=0xFE;
ET1=1;//开定时器1中断
TR1=1;//开定时器
EA=1;//开总开关
}
//==================定时器1中断服务程序===============voidtimer1_server(void)interrupt3
{
if(PWM_flag)
{
TH1=(65536-PWM_data*200)/256;
TL1=(65536-PWM_data*200)%256;
PWM=1;
PWM_flag=~PWM_flag;
}
else
{
TH1=(45536+PWM_data*200)/256;
TL1=(45536+PWM_data*200)%256;//初始化为定时时间为20msPWM=0;
PWM_flag=~PWM_flag;
}
}
//==================get_PWM============================voidget_PWM(void)
{
DSW_data=Data_Bus;
if(DSW_data==0x00)
{
TR1=0;
PWM=0;
PWM_Precent[0]=0x30;
PWM_Precent[1]=0x30;
}
else
{
PWM_data=DSW_data*100/256;PWM_Precent[0]=PWM_data/10+0x30;
PWM_Precent[1]=PWM_data%10+0x30;
TR1=1;
}
}
//==================get_Speed============================voidget_Speed(void)
{
MotorSpeed[0]=Speed_data/100+0x30;MotorSpeed[1]=Speed_data/10%10+0x30;
MotorSpeed[2]=Speed_data%10+0x30;
Speed_data=0;
}
//主函数
voidmain()
{
PWM=0;
get_PWM();
Init_int0();
Time0_Init();
init_timer1();
LCD_init();//LCD1602初始化
LCD_write_command(0x01);//LCD清屏
delay_ms(10);
DisplayChar(0,1,"PWM_Precent:
");
DisplayChar(13,1,PWM_Precent);
DisplayChar(0,0,"Motor_Speed:
");
DisplayChar(13,0,MotorSpeed);
while
(1)
{
get_PWM();
DisplayChar(13,1,PWM_Precent);
DisplayChar(13,0,MotorSpeed);
}
}