基于proteus仿真的pwm电机调速.docx

上传人:b****3 文档编号:10334433 上传时间:2023-05-25 格式:DOCX 页数:14 大小:271.41KB
下载 相关 举报
基于proteus仿真的pwm电机调速.docx_第1页
第1页 / 共14页
基于proteus仿真的pwm电机调速.docx_第2页
第2页 / 共14页
基于proteus仿真的pwm电机调速.docx_第3页
第3页 / 共14页
基于proteus仿真的pwm电机调速.docx_第4页
第4页 / 共14页
基于proteus仿真的pwm电机调速.docx_第5页
第5页 / 共14页
基于proteus仿真的pwm电机调速.docx_第6页
第6页 / 共14页
基于proteus仿真的pwm电机调速.docx_第7页
第7页 / 共14页
基于proteus仿真的pwm电机调速.docx_第8页
第8页 / 共14页
基于proteus仿真的pwm电机调速.docx_第9页
第9页 / 共14页
基于proteus仿真的pwm电机调速.docx_第10页
第10页 / 共14页
基于proteus仿真的pwm电机调速.docx_第11页
第11页 / 共14页
基于proteus仿真的pwm电机调速.docx_第12页
第12页 / 共14页
基于proteus仿真的pwm电机调速.docx_第13页
第13页 / 共14页
基于proteus仿真的pwm电机调速.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于proteus仿真的pwm电机调速.docx

《基于proteus仿真的pwm电机调速.docx》由会员分享,可在线阅读,更多相关《基于proteus仿真的pwm电机调速.docx(14页珍藏版)》请在冰点文库上搜索。

基于proteus仿真的pwm电机调速.docx

基于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仿真图

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2