新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2021-5-15
- 在线时间
- 1 小时
|
现在我可以控制步进电机的启停和正反转,但是控制不了速度,就算不用按键控制,直接修改定时器中断的时间也改变不了步进电机的转速,电机就只能一直以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();
}
}
|
|