微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机实现直流电机的调速控制

51单片机实现直流电机的调速控制

时间:11-26 来源:互联网 点击:
前一段时间一直拿一个开发板练习51,觉得对AD还不是很熟练,就想单独画一块板子,图都做完了一查价钱,小小的一个样板就要上百,实在有点舍不得,就先再proteus上仿真了一下,然后准备在万用板上搭电路。

电路图如下



占空比18%-82%连续可调,通过调节电路中的电位器实现。

做了单定时器控制和双定时器控制两个程序,电路图一样。

单定时器控制程序

#include //
#include
int count0=1000;
bit A=0;
sbit IN1=P3^4;
sbit IN2=P3^5;
sbit INTR=P3^2;
sbit wr=P3^6;
sbit rd=P3^7;
sbit PB1=P3^0;
int T0_H,T0_L;
char TAB[11]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff};
void delay(int);
void display(void);
main()
{int i,DATA;
IE=0x82;
TMOD=0x01;
T0_H=(65535-count0)/256;
T0_L=(65535-count0)%6;
TH0=T0_H;
TL0=T0_L;
IN1=0;
IN2=1;
TR0=1;
P2=0xff;
while(1)
{INTR=1;
wr=1;
rd=1;
P0=0xff;
PB1=1;
wr=0;
_nop_();
wr=1;
_nop_();
while(INTR==1);
for(i=0;i<10;i++)
{_nop_();}
rd=0;
_nop_();
DATA=P0;
wr=1;
DATA=DATA<5;
count0=1000+DATA;
display();
}
}

void t0(void)interrupt 1
{if(A==0)
{
T0_H=(65535-count0)/256;
T0_L=(65535-count0)%6;
TH0=T0_H;
TL0=T0_L;
IN1=~IN1;IN2=0;
A=1;
}
else
{
T0_H=(55535+count0)/256;
T0_L=(55535+count0)%6;
TH0=T0_H;
TL0=T0_L;
IN1=~IN1;IN2=0;
A=0;
}

}

void display(void)
{int i,j,per,scan;
per=count0;
if(per<2700)per=per+650;
else if((per>2700)&(per<4400))per=per+250;
else if((per>5800)&(per<6700))per=per-250;
else if(per>6700)per=per-650;
scan=0x03;
for(i=0;i<4;i++)
{j=per;
P1=scan;
P2=TAB[j];
delay(4);
per=per/10;
scan=scan-1;
}
}
void delay(int x)
{int i,j;
for(i=0;ifor(j=0;j<120;j++);
}

双定时器控制的程序

#include //
#include
#define LED P2
int count1=0;
int count0=10000;
#define T0_H (65535-count0)/256
#define T0_L (65535-count0)%6
#define T1_H (65535-count1)/256
#define T1_L (65535-count1)%6
sbit IN1=P3^4;
sbit IN2=P3^5;
sbit INTR=P3^2;
sbit wr=P3^6;
sbit rd=P3^7;
char TAB[11]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff};
void delay(int);//1ms
void display(void);
void T(int);
main()
{int i;
unsigned char DATA;
IE=0x8a;
TMOD=0x11;
TH0=T0_H;TL0=T0_L;
TH1=T1_H;TL1=T1_L;
TR0=0;
TR1=1;
IN1=1;
IN2=0;
P2=0xff;
while(1)
{INTR=1;wr=1;rd=1;
P0=0xff;
wr=0;
_nop_();
wr=1;
_nop_();
_nop_();
while(INTR==1);
for(i=0;i<10;i++)
{_nop_();}
rd=0;
_nop_();
_nop_();
DATA=P0;
wr=1;
T(DATA);
display();
}
}
void t1(void)interrupt 3
{TH1=T1_H;TL1=T1_L;
IN1=0;
TR0=1;
TR1=0;
}
void t0(void)interrupt 1
{count0=10000-count1;
TH0=T0_H;TL0=T0_L;
IN1=1;
TR1=1;
TR0=0;
}
void T(int Tw)
{ Tw=Tw<5;
count1=1000+Tw;
}
void display(void)
{int i,j,per,scan;
per=count1;
if(per<2650)per=per+300;
else if(per>5890)per=per-300;
scan=0x03;
for(i=0;i<4;i++)
{j=per;
P1=scan;
LED=TAB[j];
delay(4);
per=per/10;
scan=scan-1;
}
}
void delay(int x)
{int i,j;
for(i=0;ifor(j=0;j<120;j++);
}
不足之处:这两种方法实现都有一个问题,输出PWM波的周期时长与期望有一定相差,期望一周期10ms,仿真后得到波形周期为12.5ms左右,具体的解决办法不是很清楚,希望有高人路过,不吝赐教!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top