42motorTB6600FB120自动正反可用单片机源程序如下:- #include<reg52.h>
- //电机控制引脚
- sbit CLK = P1^0; //PUL-
- sbit ENA = P1^1; //ENA-
- sbit DIR = P1^2; //DIR-
-
- //按键控制端
- sbit speedup = P3^2; //调速+
- sbit speeddown = P3^0; //调速-
- sbit StopStart = P3^1; //停止与启动
- unsigned int count=0;
- unsigned int Tspeed[5]={250,500,1000,2500,3000};
- //调速等级表,5个档位。1细分, 200脉冲一圈。 一个脉冲是1.8度。
- //计算:
- //4000,8ms一个脉冲(高电平4MS,低电平4MS,共是8MS)。 200个脉冲就是:1.6秒, 即1.6秒步进电机走一圈。37.5圈/分
- //4000 起步会失步在1细分的情况下。
- //3000 6ms 1.2 50圈/分
- //2000, 4ms一个脉冲(高电平2MS,低电平2MS,共是4MS)。 200个脉冲就是:0.8秒, 即0.8秒步进电机走一圈。75圈/分
- //1000,就是0.4秒/圈, 150圈/分。
- //500 0.2秒/圈, 300圈/分
- //250 0.1秒/圈 600圈/分。 500US一个脉冲。1S就是2000个脉冲,IO输出就是2MHZ.在STC89C52的范围内。
- //再细分下去,超出C52的范围。
- //我这步进最佳最快有效是600转/分。最快1000圈/分
- bit Run_Status=1; //默认是电机启动状态
- unsigned int SPEED=0; //脉冲频率初始6ms
- unsigned int counttemp=0; //暂存停止前的COUNT计数
- void Init_time();
- void Key_scan();
- void delay(unsigned int hehe); //延时hehe毫秒
- void main()
- {
- CLK=0;
- ENA=1; //ENA-接的控制口,但一样的,如果ENA=0,步进电机卡起
- DIR=1; //DIR-接的控制口。初始化电机 低电平有效,测试,DIR=1,是正转, DIR=0反转。
- SPEED=Tspeed[4];
- P2=0X00;
- delay(2000); //延时2秒等待系统稳定。
- P2=0XFF;
-
- Init_time(); //初始化定时器
-
- while(1)
- {
- Key_scan();
-
- }
- }
- void Init_time() //初始化定时器
- {
- TMOD |= 0x01;
- TH0=(65536-SPEED)/256; //给time0装初值
- TL0=(65536-SPEED)%256;
- IE = 0x82;
- TR0=0; //开启中断产生脉冲信号
- EA=0;
- }
- void Enter_Timer0() interrupt 1 //进入定时器中断
- {
- TH0=(65536-SPEED)/256;
- TL0=(65536-SPEED)%256;
- CLK=~CLK; //发送脉冲……
- count++;
- if(count<100)
- SPEED=3000; //如果调到2000失控 1细分
- if(count<200)
- SPEED=2000;
- else
- SPEED=3000;
- if(count==300) //计数2次为一个脉冲周期 所以180度为计数200.如果计数100只有90度
- {
-
- DIR=~DIR;
- count=0;
- CLK=0;
- TR0=0; //开启中断产生脉冲信号
- EA=0;
- delay(300);
- CLK=0;
- TR0=1;
- EA=1;
- }
- }
- void delay(unsigned int n) //delay几个毫秒,入口参数为几个毫秒
- //正反转切换时速度太快了。延时保护电机
- {
- unsigned int i,y;
- for(i=n;i>0;i--)
- for(y=114;y>0;y--);
- }
- void Key_scan()
- {
- if(StopStart==0)
- {
- delay(10);
- if(StopStart==0)
- {
-
- Run_Status=~Run_Status;
- if(Run_Status)
- {
- count=counttemp;
- TR0=1; //开启中断产生脉冲信号
- EA=1;
-
- }
- else
- {
- counttemp=count;
- TR0=0; //关闭中断停止脉冲信号
- EA=0;
- }
- } while(!StopStart);
- }
- }
- /**********************************
- static char i=0;
- static char j=4;
- if(speedup==0) //加速
- {
- delay(10);
- if(speedup==0)
- {
-
- j--;
- if(j<1)
- j=0;
- SPEED=Tspeed[j];
- }
- } while(!speedup);
- if(speeddown==0) //减速
- {
- delay(10);
- if(speeddown==0)
- {
-
- i++;
- if(i>4)
- i=4;
- SPEED=Tspeed[i];
- }
- } while(!speeddown);
- }
- *************************************/
复制代码
|