继续继续。
步进电机转速控制
一、 任务
在SMSpeed.DSN的电路上实现:当KEY2按下时,电机停止转动,释放时继续转动。当KEY1按下时,电机以60转/min的转速正转,释放时以120转/min的转速反转。
二、 设计参考:
① 4相步进电机,每顺序切换一相(1步),电机旋转18°,电机转动1圈共需要20步。
② 用定时实现对电机转速的控制(当转速为60转/min时,步进时间间隔为50ms;当转速为120转/min时,步进时间间隔为25ms)。中断服务程序步骤如下:
If(KEY1按下)
{
重置定时时间为50ms;
正转切换到下一步;
}
Else
{
重置定时时间为25ms
反转切换到下一步;
}
③ 对于TX定时器,若其GATE=1且TRX=1时,则外部信号(INTX)可直接实现对TX定时器的运行控制(从而实现对电机转动与停止的控制)。
芯片2003不用管可以直接看IO口,长条那个数码管是用来计数的然后可以看出频率。
我的设计思路:
驱动步进电机:依次给电机的4根线低电平就可以动了,我用了简单的位操作,时间关系不多说。
按键设计:这里接在中断,我设计的可能比较复杂。
按键1:我设置的是低电平触发,一直按着就一直进去跑中断的代码。出来后主函数还有个判断就执行另一功能。
按键2:低电平触发,中断函数啥也不干,一直按着就相当于卡在中断里,就暂停了嘛。
因为涉及了几个中断服务所以设置一下优先级,不然按着暂停 电机还飞快的跑,将定时器的优先级设置成最低就行了。
#include "reg51.h" char count = 0; //计数标志位 char LED = 0; unsigned char dir = 0; //第几步的标志位 unsigned char sign_num = 50; //每步时间的标志位 char num_Switch = 0; //程序选择位 sbit key2 = P3^3; sbit key1 = P3^2; void delay50ms(void) //?? 0us { unsigned char a,b; for(b=165;b>0;b--) for(a=150;a>0;a--); } void TIMER_Init() { TMOD = 0x10; //定时器1,方式1 TH1 = 0xFC; // 初始值1MS进入一次中断 TL1 = 0x18; TR1= 1; ET1 = 1; IT0 = 0; //两个INT都设置成低电平出发 EX0 = 1; IT1 = 0; EX1 = 1; EA = 1; PT1 = 0; //设置定时器位最低优先级 PX0 = 1; //设置INT0为高优先级,这句可以不要吧嘿嘿 } void zhengzhuan() //正转函数 { LED = ~(0x01<<dir); P1 = LED; } void fanzhuan() //反转函数 { LED = ~(0x10>>dir); P1 = LED; } void main() { TIMER_Init(); LED = 0xff; //初始化LED值 while(1) { if(key1==0) num_Switch = 1; switch(num_Switch) //选择运行的程序 { case 0 : zhengzhuan();break; case 1 : fanzhuan();sign_num = 25;break; } } } void int0() interrupt 0 //按键1 { while(key1==0) { zhengzhuan(); dir++; if(dir>3)dir=0; delay50ms(); //延时来控制电机转动速度 } } void int1() interrupt 2 //按键2 { } void PWM() interrupt 3 //定时器中断 { TH1 = 0xFC; TL1 = 0x18; count++; if(dir>3)dir=0; //每走4步一个轮回 if(count == sign_num) //每走一步的时间 { dir++; count = 0; } }OK写完了。