【天祥TX-1C增强版51单片机开发板试用体验】+红外步进电机

  • 建模太难了
  • LV3工程师
  • |      2017-08-27 00:34:07
  • 浏览量 1162
  • 回复:4


先来说点步进电机的资料,解码用的就是板卡自带的 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度 位置等控制领域用步进电机来控制变的非常的简单。虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机也非易事,它涉及到机械、电机、电子及计算机等许多专业知识。 步进电机分类 z永磁式(PM) 永磁式步进电机一般为两相,转矩和体积较小,步进角一般为 7.5 度或 15 度。 z反应式(VR) 反应式步进电机一般为三相,可实现大转矩输出,步进角一般为 1.5 度,但 噪声和振动都很大。在欧美等发达国家 80 年代已被淘汰。 z混合式(HB) 混合式步进是指混合了永磁式和反应式的优点。它又分为两相和五相:两相 步进角一般为 1.8 度而五相步进角一般为 0.72 度。这种步进电机的应用最为广泛。 4、技术指标 (1)步进电机的静态指标 z相数: 是指电机内部的线圈组数,目前常用的有二相、三相、四相、五相步进电机。 电机相数不同,其步距角也不同,一般二相电机的步距角为 0.9°/1.8°、三相的为0.75°/1.5°、五相的为 0.36°/0.72° 。在没有细分驱动器时,用户主要靠选择不同相数的步进电机来满足自己步距角的要求。如果使用细分驱动器,则“相数”将变得没有意义,用户只需在驱动器上改变细分数,就可以改变步距角。 z步距角: 它表示控制系统每发一个步进脉冲信号,电机所转动的角度。电机出厂时给 出了一个步距角的值,如 86BYG250A 型电机给出的值为 0.9°/1.8°(表示半步工作时为 0.9°、整步工作时为 1.8°),这个步距角可以称之为“电机固有步距角”,它不一定是电机实际工作时的真正步距角,真正的步距角和驱动器有关。 z拍数: 完成一个磁场周期性变化所需脉冲数或导电状态,或指电机转过一个步距角所需脉冲数,以四相电机为例,有四相四拍运行方式即 AB-BC-CD-DA-AB,四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。 z定位转矩: 电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以及机 械误差造成的)。




#include 



#define uchar unsigned char 

#define Imax 14000 //此处为晶振为11.0592时的取值, 

#define Imin 8000 //如用其它频率的晶振时,

#define Inum1 1450 //要改变相应的取值。

#define Inum2 700 

#define Inum3 3000 



sbit dula = P2^6; 

sbit wela = P2^7;



uchar code table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段码

uchar code table1 = {0x01,0x02,0x04,0x08,0x08,0x04,0x02,0x01};//电机4拍拍数

uchar table2 = {0x00};



uchar Im = {0x00,0x00,0x00,0x00};

uchar f;

uchar IrOK;

unsigned long m,Tc;

uchar maichong = 0,table_begin = 0; //maichong步进电机速度档4为最慢 1为最快

//table_begin是table1数组开始位置

//table_begin=0正转 table_begin=1反转

//table1-为正转拍数

//table1-为反转拍数

uchar Start_Flag = 0; //启动标志 0为停止 1为启动



/* 函数名称 : delay */



void delay(uchar i)

{

uchar j,k; 



for(j = i;j > 0;j--)

{

for(k = 125;k > 0;k--);

} 

}



/* 函数描述 : 显示函数函数 */



void display()

{ 

dula = 0;

if(maichong == 0) //开机maichong=0 显示0

{ 

P0=table;

dula = 1;

dula = 0;



P0 = 0xfd;

wela = 1;

wela = 0;

delay(5);

}

else //遥控器调整档位后maichong不为0

{ 

P0 = table; //显示档位maichong=1 对应4档 

dula = 1;

dula = 0;



wela = 0;

P0 = 0xfd;

wela = 1;

wela = 0;

delay(10);



P0 = table2; //反转时显示"-"

dula = 1;

dula = 0;



wela = 0;

P0 = 0xfe;

wela = 1;

wela = 0;

delay(10);

}

}



/* 函数描述 : 外部中断解码程序 */



void intersvr1(void) interrupt 2 using 1

{

Tc = TH0 * 256 + TL0; //提取中断时间间隔时长

TH0 = 0; 

TL0 = 0; //定时中断重新置零



if((Tc > Imin) && (Tc < Imax))

{ 

m = 0;

f = 1;

return;

} //找到启始码



if(f == 1)

{

if(Tc > Inum1 && Tc < Inum3) 

{

Im = Im >> 1 | 0x80;

m++; 

}

if(Tc > Inum2 && Tc < Inum1) 

{

Im = Im >> 1; 

m++; //取码

}

if(m == 32) 

{

m = 0; 

f = 0;

if(Im ==~ Im) 

{

IrOK =1 ; 

}

else 

{

IrOK = 0; //取码完成后判断读码是否正确

}

}

}	

}

/******************************************************************************/

/* 函数名称 : Motor_Driver */

/* 函数描述 : 电机驱动函数 */

/* 输入参数 : 无 */

/* 参数描述 : 无 */ 

/* 返回值 : 无 */

/******************************************************************************/

void Motor_Driver(void)

{

uchar i,j;

for(j= 0 + table_begin;j < 4 + table_begin;j++) 

{

P1=table1;

for(i = 0;i < maichong;i++)

{

display();

}

}

}



/* 函数描述 : 红外接收处理函数 */



void Inf_Dispose(void)

{

if(IrOK == 1) 

{ 

switch(Im) 

{

case 0x0c: //遥控器1键按下 调为1档

maichong = 4;

break;



case 0x18: //遥控器2键按下 调为2档

maichong = 3;

break;



case 0x5e: //遥控器3键按下 调为3档

maichong = 2;

break;



case 0x08: //遥控器4键按下 调为4档

maichong = 1;

break;



case 0x44: //遥控器 开始/停止 键按下 启动停止控制

Start_Flag =~ Start_Flag;

break;



case 0x43: //遥控器 |<< 键按下 正转

if( maichong != 0) //不是0档的时候设置正反转

{

table_begin = 0;

table2 = 0; //数码管不显示 

} 

break;



case 0x40: //遥控器 >>| 键按下 反转



if( maichong != 0) //不是0档的时候设置正反转

{

table_begin = 4;

table2 = 0x40; //"-"码 

} 

break;



default:

break;

}

IrOK = 0;	

}

}



/* 函数描述 : 主函数 */



void main(void)

{ 

m = 0;

f = 0;

EA = 1;



IT1 = 1;

EX1 = 1;



TMOD = 0x11; 

TH0 = 0;

TL0 = 0;

TR0 = 1;



while(1)

{

Inf_Dispose(); //红外接收处理

if(Start_Flag) //如果允许电机启动 

{

Motor_Driver(); //电机驱动

}

else //如果不允许电机启动

{

P1 = 0x00; //不给电机输出脉冲

display(); //显示

} 

}

}

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:5
great_CC 2017-09-28
图,图,图,图呢。 下回来点图,大家一起开心下。
0   回复
举报
发布
不靠近阿城 2017-09-27
支持支持
0   回复
举报
发布
ooowoainmi 2017-09-16
厉害了,你竟然申请到了
0   回复
举报
发布
lygo 2017-09-06
楼上说的有道题 +1
0   回复
举报
发布
qq1328512480 2017-08-29
加一些效果图更好的
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子