基于proteus仿真的pwm电机调速.docx
《基于proteus仿真的pwm电机调速.docx》由会员分享,可在线阅读,更多相关《基于proteus仿真的pwm电机调速.docx(14页珍藏版)》请在冰豆网上搜索。
基于proteus仿真的pwm电机调速
直流电机调速资料汇总
一.
使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。
C语言代码:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitK5=P1^4;
sbitK6=P1^5;
sbitPWM1=P1^0;
sbitPWM2=P1^1;
sbitFMQ=P3^6;
ucharZKB1,ZKB2;
voiddelaynms(uintaa)
{
ucharbb;
while(aa--)
{
for(bb=0;bb<115;bb++)//1ms基准延时程序
{
;
}
}
}
voiddelay500us(void)
{
intj;
for(j=0;j<57;j++)
{
;
}
}
voidbeep(void)
{
uchart;
for(t=0;t<100;t++)
{
delay500us();
FMQ=!
FMQ;//产生脉冲
}
FMQ=1;//关闭蜂鸣器
delaynms(300);
}
voidmain(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();
ZKB1--;//减少ZKB1
ZKB2=100-ZKB1;//相应的ZKB2增加
}
}
if(ZKB1>99)
ZKB1=1;
if(ZKB1<1)
ZKB1=99;
}
}
voidtime0(void)interrupt1
{
staticucharN=0;
TH0=(65526-100)/256;
TL0=(65526-100)%256;
N++;
if(N>100)
N=0;
if(N<=ZKB1)
PWM1=0;
else
PWM1=1;
if(N<=ZKB2)
PWM2=0;
else
PWM2=1;
}
//显现:
电机转速到最高后,也就是N为1或99时,再按一下,就变到99或1,
//电机反方向旋转以最高速度
二、内容及要求:
1、设计一个直流电机调速系统,并用单片机实现连接开关和数码显示并将其值输入直流电机调速系统。
2、通过公式及键控实现其直流电机启动、加速、减速和停止等四种形态。
目标:
(1)CPU为8051芯片;
(2)实验需要4个LED,分别显示启动、加速、减速和停止。
(3)通过按键开关输入不同的值改变脉冲占空比的控制值从而得到不同的频率脉冲,实现脉冲转变为点评,实现调速功能。
PWMEQU7FH;PWM赋初始值
OUTEQUP0;8个LED灯的接口
INCKEYEQUP1.4;K1,PWM值增加键。
DECKEYEQUP1.5;K2,PWM值减小键。
BEEPEQUP3.7
;----
ORG0000H
SJMPSTART
ORG000BH
SJMPINTT0
ORG001BH
SJMPINTT1
ORG0030H
;----
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
;----
START:
MOVSP,#30H
MOVTMOD,#21H
MOVTH1,PWM;脉宽调节
MOVTL1,#00H
MOVTH0,#0FCH;
MOVTL0,#066H;频率调节
SETBEA
SETBET0
SETBET1
SETBTR0
LOOP:
MOVA,PWM;
JBINCKEY,LOOP1;增加键是否按下?
CALLDELAY;延时去抖动
JBINCKEY,LOOP1
CJNEA,#0FFH,PWMINC;是否到最大值?
CALLBEEP_BL;是,蜂鸣器报警。
SJMPLOOP
PWMINC:
INCPWM;调节脉宽(脉宽减小)
SJMPLOOP
LOOP1:
JBDECKEY,LOOP2;减小键是否按下?
CALLDELAY;延时去抖动
JBDECKEY,LOOP2
CJNEA,#02H,PWMDEC;是否到最小值?
CALLBEEP_BL;是,蜂鸣器报警。
SJMPLOOP
PWMDEC:
DECPWM;调节脉宽(脉宽增加)
LOOP2:
SJMPLOOP
;----
;T0中断服务子程序(频率)
;控制定时器1中断
;----
INTT0:
CLRTR1
MOVTH0,#0FCH;1ms延时常数
MOVTL0,#066H;频率调节
MOVTH1,PWM
SETBTR1
MOVOUT,#00H;启动输出
RETI
;----
;T1中断服务子程序(脉宽)
;----
INTT1:
CLRTR1;脉宽调节结束
MOVOUT,#0FFH;结束输出
RETI
;----
;10ms延时子程序
;----DELAY:
MOVR6,#50
DELAY1:
MOVR7,#100
DJNZR7,$
DJNZR6,DELAY1
RET
;----
;蜂鸣器响一声子程序
;---
BEEP_BL:
MOVR6,#100
BL1:
CALLBL2
CPLBEEP
DJNZR6,BL1
MOVR5,#25
CALLDELAY2
RET
BL2:
MOVR7,#180
BL3:
NOP
DJNZR7,BL3
RET
DELAY2:
;延时R5×10MS
MOVR6,#50
BL4:
MOVR7,#100
BL5:
DJNZR7,BL5
DJNZR6,BL4
DJNZR5,DELAY2
RET
END
******************************************************************************/
#include
#defineucharunsignedchar
/*****************************************************************************
*TH0和TL0是计数器0的高8位和低8位计数器,计算办法:
TL0=(65536-C)%256;*
*TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*
*工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时*
*间为1ms*65536=65.536ms*
******************************************************************************/
#defineV_TH00XFF
#defineV_TL00XF6
#defineV_TMOD0X01
voidinit_sys(void);/*系统初始化函数*/
voidDelay5Ms(void);
unsignedcharZKB1,ZKB2;
voidmain(void)
{
init_sys();
ZKB1=40;/*占空比初始值设定*/
ZKB2=70;/*占空比初始值设定*/
while
(1)
{
if(!
P1_4)//如果按了+键,增加占空比
{
Delay5Ms();
if(!
P1_4)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}
if(!
P1_5)//如果按了-键,减少占空比
{
Delay5Ms();
if(!
P1_5)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/*对占空比值限定范围*/
if(ZKB1>99)ZKB1=1;
if(ZKB1<1)ZKB1=99;
}
}
/******************************************************
*函数功能:
对系统进行初始化,包括定时器初始化和变量初始化*/
voidinit_sys(void)/*系统初始化函数*/
{
/*定时器初始化*/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}
//延时
voidDelay5Ms(void)
{
unsignedintTempCyc=1000;
while(TempCyc--);
}
/*中断函数*/
voidtimer0(void)interrupt1using2
{
staticucharclick=0;/*中断次数计数器变量*/
TH0=V_TH0;/*恢复定时器初始值*/
TL0=V_TL0;
++click;
if(click>=100)click=0;
if(click<=ZKB1)/*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_0=0;
else
P1_0=1;
if(click<=ZKB2)
P1_1=0;
else
P1_1=1;
}
三、proteus仿真图