大二在做srtp时做到了这部分内容,感觉C51控制起来挺简单的,之后有做关于MSP430的魂斗罗游戏和stm32的示波器,有时间也整理上来。
程序流程图:
控制开发板自带步进电机
最开始的时候想自己搭电路,还用protues画了仿真 但是后来综合考虑还是选了开发板,直接用开发板还是能省不少事。当时会的太少,代码写的很乱,参考着开发板的教程写的控制程序。原理就是通过改变电机相序来改变转动方向,延时控制速度,缺点就是无法精确控制。
void motor_ffw(unsigned int dir,unsigned int speed)
{
unsigned int i;
for (i=0; i<8; i++)
{
if(dir==1)
{P1 = FFW[i]&0x1f;}
else if(dir==2)
{P1 = FFZ[i]&0x1f;}
delay(speed);
}
}
case(0x06):
LcdInit();
for(i=0;i<11;i++)
{
LcdWriteData(Disp1[i]);
}
K=1;
for(m=0;m<512;m++)
{
DisplayData[2] = smgduan[IrValue[2]];
if(DisplayData[2]==0x3f)
{
goto switchcase;
}
motor_ffw(K,500);
}
K=2;
for(n=0;n<512;n++)
{
DisplayData[2] = smgduan[IrValue[2]];
if(DisplayData[2]==0x3f)
{
goto switchcase;
}
motor_ffw(K,500);
}
break;
遥控控制
遥控控制使用红外控制,也是开发板自带的模块。可以用华为手机的手机遥控app进行红外控制。在app里面自定义一个波长一致的遥控器就行。
void ReadIr() interrupt 0
{
u8 j,k;
u16 err;
Time=0;
delay(700);
if(IRIN==0)
{
err=1000;
while((IRIN==0)&&(err>0))
{
delay(1);
err--;
}
if(IRIN==1)
{
err=500;
while((IRIN==1)&&(err>0))
{
delay(1);
err--;
}
for(k=0;k<4;k++)
{
for(j=0;j<8;j++)
{
err=60;
while((IRIN==0)&&(err>0))
{
delay(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0))
{
delay(10);
Time++;
err--;
if(Time>30)
{
return;
}
}
IrValue[k]>>=1;
if(Time>=8)
{
IrValue[k]|=0x80;
}
Time=0;
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}
控制42步进电机
在进一步做项目时。发现自带的步进电机无法实现所要求的扭矩,改用42步进电机,采用TB6600驱动器控制。改用42步进电机好处是能提供足够的扭矩,控制器也可以精确控制速度和转动角度,只需要改中断和控制电平就能实现,接线图如下
void Timer0() interrupt 1
{
TH0=(65536-cycle)/256;
TL0=(65536-cycle)%256;
CLK=~CLK;
count++;
DisplayData[2] = smgduan[IrValue[2]];
if(DisplayData[2]==0x3f)
{
count=2*step;
}
if(count==step)
{
DIR=~DIR;
}
if(count==2*step)
{
count=0;
TR0=0;
ENA=0;
}
}
case(0x7d):
LcdInit();
for(i=0;i<11;i++)
{
LcdWriteData(Disp6[i]);
}
count=0;
DIR=0;
ENA=1;
cycle=5000;
Timer0Init();
DisplayData[2] = smgduan[IrValue[2]];
if(DisplayData[2]==0x3f)
{
goto switchcase;
}
break;
当时做得比较简陋,但也算是第一个独立完成的项目吧。
|