現在我可以控制步進電機的啟停和正反轉,但是控制不了速度,就算不用按鍵控制,直接修改定時器中斷的時間也改變不了步進電機的轉速,電機就只能一直以10s一圈的速度轉動,小弟問下各位大哥大姐們什么情況。
#include <reg51.h>
unsigned int Tspeed[3]={20,4000,10000};
unsigned char motor_time;
unsigned int CYCLE=20
bit Run_Status=0;
sbit CLK=P3^4;//脈沖
sbit ENA=P3^2; //使能
sbit DIR=P3^3; //方向
sbit StopStart=P1^2; //啟停
sbit P_ADJ=P1^3; //增速
sbit N_ADJ=P1^4; //降速
sbit P_TS=P1^5;//正反轉
unsigned int PWM;
void key_Set()
{
ENA=0;
CLK=0;
DIR=0;
}
void delay() //延時函數
{
unsigned int i =500;
while (i--);
}
void TimeInit() //定時器初始化
{
TMOD |= 0x01;
TH0=(65536-CYCLE)/256; //給time0裝初值
TL0=(65536-CYCLE)%256;
TH1=(65536-1000)/256; //給time1裝初值
TL1=(65536-1000)%256;
IE = 0x8A;
PT1=1; //使得time1的優先級高于time0
TR0=1; //打開兩個中斷
TR1=1;
}
void Key_motor()
{
{
if(P_ADJ==0) //減速
{
delay();
if(P_ADJ==0)
{
while(!P_ADJ);
a--;
if(a<1)
a=0;
CYCLE=Tspeed[a];
}
}
}
if(P_TS==0) //正反轉
{
delay();
if(P_TS==0)
{
while(!P_TS);
DIR=1;
b++;
if(b%2==0)
{
DIR=0;
}
}
}
if(N_ADJ==0) //加速
{
delay();
if(N_ADJ==0)
{
while(!N_ADJ);
a++;
if(a>2)
a=2;
CYCLE=Tspeed[a];
}
}
if(StopStart==0) //啟停件
{
delay();
if(StopStart==0)
{
while(!StopStart);
Run_Status=~Run_Status;
if(Run_Status)
{
ENA=1;
TR0=1;
}
else
{
ENA=0;
TR0=0;
}
}
}
}
void Time0() interrupt 1
{
TH1=(65536-CYCLE)/256; //產生脈沖信號
TL1=(65536-CYCLE)%256;
CLK=~CLK;
PWM++;
}
void Time1() interrupt 3
{
TH1=(65536-1000)/256; //按鍵中斷
TL1=(65536-1000)%256;
Key_motor();
}
void main()
{
key_Set();
TimeInit();
while(1)
{
Key_motor();
}
}
|