您的位置 首页 硬件

51单片机完成直流电机的调速操控

前一段时间一直拿一个开发板练习51,觉得对AD还不是很熟练,就想单独画一块板子,图都做完了一查价钱,小小的一个样板就要上百,实在有点舍

前一段时间一向拿一个开发板操练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左右,详细的解决办法不是很清楚,期望有高人路过,不吝赐教!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/258283.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部