基于proteus仿真的pwm电机调速

发布时间:2024-11-12

采用51单片机的pwn电机调速课程设计

直流电机调速资料汇总

一.

使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。

C语言代码:

#include<AT89X52.h>

#define uchar unsigned char

#define uint unsigned int

sbit K5=P1^4;

sbit K6=P1^5;

sbit PWM1=P1^0;

sbit PWM2=P1^1;

sbit FMQ=P3^6;

uchar ZKB1,ZKB2;

void delaynms(uint aa)

{

uchar bb;

while(aa--)

{

for(bb=0;bb<115;bb++)

{

;

}

}

}

void delay500us(void)

{

int j;

for(j=0;j<57;j++)

{

;

} //1ms基准延时程序

采用51单片机的pwn电机调速课程设计

}

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();

采用51单片机的pwn电机调速课程设计

ZKB1--; //减少ZKB1

ZKB2=100-ZKB1; //相应的ZKB2增加

}

}

if(ZKB1>99)

ZKB1=1;

if(ZKB1<1)

ZKB1=99;

}

}

void time0(void) interrupt 1

{

static uchar N=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) 通过按键开关输入不同的值改变脉冲占空比的控制值从而得到不同的频率

采用51单片机的pwn电机调速课程设计

脉冲,实现脉冲转变为点评,实现调速功能。

PWM EQU 7FH ;PWM赋初始值

OUT EQU P0 ;8个LED灯的接口

INCKEY EQU P1.4 ;K1,PWM值增加键。

DECKEY EQU P1.5 ;K2,PWM值减小键。

BEEP EQU P3.7

;----

ORG 0000H

SJMP START

ORG 000BH

SJMP INTT0

ORG 001BH

SJMP INTT1

ORG 0030H

;----

;主程序

;定时器0工作在模式1,定时器1工作在模式2。

;----

START:

MOV SP,#30H

MOV TMOD,#21H

MOV TH1,PWM ;脉宽调节

MOV TL1,#00H

MOV TH0,#0FCH ;

MOV TL0,#066H ;频率调节

SETB EA

SETB ET0

SETB ET1

SETB TR0

LOOP: MOV A,PWM ;

JB INCKEY,LOOP1 ;增加键是否按下?

CALL DELAY ;延时去抖动

JB INCKEY,LOOP1

CJNE A,#0FFH,PWMINC ;是否到最大值?

CALL BEEP_BL ;是,蜂鸣器报警。

SJMP LOOP

PWMINC:

INC PWM ;调节脉宽(脉宽减小)

SJMP LOOP

LOOP1: JB DECKEY,LOOP2 ;减小键是否按下?

CALL DELAY ;延时去抖动

采用51单片机的pwn电机调速课程设计

JB DECKEY,LOOP2

CJNE A,#02H,PWMDEC ;是否到最小值?

CALL BEEP_BL ;是,蜂鸣器报警。

SJMP LOOP

PWMDEC:

DEC PWM ;调节脉宽(脉宽增加)

LOOP2: SJMP LOOP

;----

;T0中断服务子程序 (频率)

;控制定时器1中断

;----

INTT0:

CLR TR1

MOV TH0,#0FCH ;1ms延时常数

MOV TL0,#066H ;频率调节

MOV TH1,PWM

SETB TR1

MOV OUT,#00H ;启动输出

RETI

;----

;T1中断服务子程序 (脉宽)

;----

INTT1:

CLR TR1 ;脉宽调节结束

MOV OUT,#0FFH ;结束输出

RETI

;----

;10ms延时子程序

;----DELAY:

MOV R6,#50

DELAY1:

MOV R7,#100

DJNZ R7,$

DJNZ R6,DELAY1

RET

;----

;蜂鸣器响一声子程序

;---

BEEP_BL:

MOV R6,#100

BL1: CALL BL2

CPL BEEP

DJNZ R6,BL1

采用51单片机的pwn电机调速课程设计

MOV R5,#25

CALL DELAY2

RET

BL2: MOV R7,#180

BL3: NOP

DJNZ R7,BL3

RET

DELAY2: ;延时R5×10MS

MOV R6,#50

BL4: MOV R7,#100

BL5: DJNZ R7,BL5

DJNZ R6,BL4

DJNZ R5,DELAY2

RET

END

******************************************************************************/

#include <REGX51.H>

#define uchar unsigned char

/*****************************************************************************

* TH0和TL0是计数器0的高8位和低8位计数器,计算办

法:TL0=(65536-C)%256; *

* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;

TMOD是计数器*

* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 *

* 间为1ms*65536=65.536ms *

******************************************************************************/

#define V_TH0 0XFF

#define V_TL0 0XF6

#define V_TMOD 0X01

void init_sys(void); /*系统初始化函数*/

void Delay5Ms(void);

unsigned char ZKB1,ZKB2;

void main (void)

{

init_sys();

采用51单片机的pwn电机调速课程设计

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;

}

}

/******************************************************

*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/ void init_sys(void) /*系统初始化函数*/

{

/*定时器初始化*/

TMOD=V_TMOD;

TH0=V_TH0;

TL0=V_TL0;

采用51单片机的pwn电机调速课程设计

TR0=1;

ET0=1;

EA=1;

}

//延时

void Delay5Ms(void)

{

unsigned int TempCyc = 1000;

while(TempCyc--);

}

/*中断函数*/

void timer0(void) interrupt 1 using 2

{

static uchar click=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仿真图

采用51单片机的pwn电机调速课程设计

采用51单片机的pwn电机调速课程设计

基于proteus仿真的pwm电机调速.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219