基于.proteus仿真的pwm电机调速
- 格式:doc
- 大小:315.00 KB
- 文档页数:10
直流电机调速资料汇总一.使用单片机来控制直流电机的变速.一般采用调节电枢电压的方式.通过单片机控制PWM1.PWM2,产生可变的脉冲.这样电机上的电压也为宽度可变的脉冲电压。
C语言代码:#include<AT89X52.h>#define uchar unsigned char#define uint unsigned intsbit 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++) //1ms基准延时程序{;}}}void delay500us(void){int j;for(j=0;j<57;j++){;}}void beep(void){uchar t;for(t=0;t<100;t++){delay500us();FMQ=!FMQ; //产生脉冲}FMQ=1; //关闭蜂鸣器delaynms(300);}void main(void){TR0=0; //关闭定时器0TMOD=0x01; //定时器0.工作方式1TH0=(65526-100)/256;TL0=(65526-100)%256; //100us即0.01ms中断一次 EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器T0ZKB1=50; //占空比初值设定ZKB2=50; //占空比初值设定while(1){if(!K5){delaynms(15); //消抖if(!K5) //确定按键按下{beep();ZKB1++; //增加ZKB1ZKB2=100-ZKB1; //相应的ZKB2就减少}}if(!K6){delaynms(15); //消抖if(!K6) //确定按键按下{beep();ZKB1--; //减少ZKB1ZKB2=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;elsePWM1=1;if(N<=ZKB2)PWM2=0;elsePWM2=1;}//显现:电机转速到最高后.也就是N为1或99时.再按一下.就变到99或1. //电机反方向旋转以最高速度二、内容及要求:1、设计一个直流电机调速系统.并用单片机实现连接开关和数码显示并将其值输入直流电机调速系统。
2、通过公式及键控实现其直流电机启动、加速、减速和停止等四种形态。
目标:(1) CPU为8051芯片;(2)实验需要4个LED.分别显示启动、加速、减速和停止。
(3)通过按键开关输入不同的值改变脉冲占空比的控制值从而得到不同的频率脉冲.实现脉冲转变为点评.实现调速功能。
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 0000HSJMP STARTORG 000BHSJMP INTT0ORG 001BHSJMP INTT1ORG 0030H;----;主程序;定时器0工作在模式1.定时器1工作在模式2。
;----START:MOV SP,#30HMOV TMOD,#21HMOV TH1,PWM ;脉宽调节MOV TL1,#00HMOV TH0,#0FCH ;MOV TL0,#066H ;频率调节SETB EASETB ET0SETB ET1SETB TR0LOOP: MOV A,PWM ;JB INCKEY,LOOP1 ;增加键是否按下?CALL DELAY ;延时去抖动JB INCKEY,LOOP1CJNE A,#0FFH,PWMINC ;是否到最大值?CALL BEEP_BL ;是.蜂鸣器报警。
SJMP LOOPPWMINC:INC PWM ;调节脉宽(脉宽减小) SJMP LOOPLOOP1: JB DECKEY,LOOP2 ;减小键是否按下?CALL DELAY ;延时去抖动JB DECKEY,LOOP2CJNE A,#02H,PWMDEC ;是否到最小值?CALL BEEP_BL ;是.蜂鸣器报警。
SJMP LOOPPWMDEC:DEC PWM ;调节脉宽(脉宽增加)LOOP2: SJMP LOOP;----;T0中断服务子程序(频率);控制定时器1中断;----INTT0:CLR TR1MOV TH0,#0FCH ;1ms延时常数MOV TL0,#066H ;频率调节MOV TH1,PWMSETB TR1MOV OUT,#00H ;启动输出RETI;----;T1中断服务子程序(脉宽);----INTT1:CLR TR1 ;脉宽调节结束MOV OUT,#0FFH ;结束输出RETI;----;10ms延时子程序;----DELAY:MOV R6,#50DELAY1:MOV R7,#100DJNZ R7,$DJNZ R6,DELAY1RET;----;蜂鸣器响一声子程序;---BEEP_BL:MOV R6,#100BL1: CALL BL2CPL BEEPDJNZ R6,BL1MOV R5,#25CALL DELAY2RETBL2: MOV R7,#180BL3: NOPDJNZ R7,BL3RETDELAY2: ;延时R5×10MSMOV R6,#50BL4: MOV R7,#100BL5: DJNZ R7,BL5DJNZ R6,BL4DJNZ R5,DELAY2RETEND******************************************************************************/#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 0X01void init_sys(void); /*系统初始化函数*/void Delay5Ms(void);unsigned char ZKB1,ZKB2;void main (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;}}/*******************************************************函数功能:对系统进行初始化.包括定时器初始化和变量初始化*/ void init_sys(void) /*系统初始化函数*/{/*定时器初始化*/TMOD=V_TMOD;TH0=V_TH0;TL0=V_TL0;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;elseP1_0=1;if (click<=ZKB2)P1_1=0;elseP1_1=1;}三、proteus仿真图。