继续继续。
步进电机转速控制
一、 任务
在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写完了。