最近想做一个步进电机转动,看着挺简单,也就5根线连接,结果栽在了线序上 先简单讲讲编程所需要的相关必要知识,再说驱动步进电机的程序 一:先来认识 步进电机28BYJ-48 28BYJ-48:全称为:4项8拍-28mm最大有效外径-永磁减速步进电机 28:有效的最大外径28mm B:步进电机 Y:永磁 J:减速电机 4:4项 8:8拍 二:步进电机编程的必要知识 A:步进电机的3个关键参数:步进角+减速比+空载启动频率 01)步进角 4项8拍时,步进角5.625°(旋转360°,需要转动8个循环,每1个循环为1个4项8拍 64=8循环*8拍) 4项4拍时,步进角11.25°(旋转360°,需要转动8个循环,每1个循环为1个4项4拍 32=8循环*4拍) 本程序选择:每拍转动的角度5.625° 02:减速比 4项8拍时,步进角5.625°,如果减速比64,那么步进角=5.625°/64 4项4拍时,步进角11.25°,如果减速比64,那么步进角=11.25°/64 结论:减速比越高,精度越高,但是转速越慢(因为旋转每一拍的时间有限定,涉及到第三个参数:空载启动频率) 03:空载启动频率 空载启动频率最大为550Hz,也就是最小时间为1.8ms(T=1/f=1/550=1.8ms),本程序选定的是2ms/拍; 4项8拍,旋转360°需要的时间: cnt=360/(5.625/64)=4096拍 T=2ms*4096拍=8192ms=8.192s,时间还是挺长的。 其实,步进电机还有一个参数:带载能力。只是此处编程用不上,我也没有列到关键参数里,等接下来的42步进电机+TB6600驱动器,再重点讲述,在此处,已经够用。 B:引脚电平 上图里列出8拍的电平,每4项8拍为一次循环 四相八拍 A=0 0x0e 0x01(ULN2003) A=0;B=0; ... ... B=0; ... ... B=0;C=0; ... ... C=0; ... ... C=0;D=0; ... ... D=0; 0x07 0x08(ULN2003) D=0;A=0; 0x06 0x09(ULN2003) A=0; unsigned char code tab_motor ={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//ULN2003和步进电机直接相连 C:引脚 上午为了步进电机28BYJ-48引脚头痛很久,怎么弄都是光震动不转动, //版本1:我淘宝网购买,有白色接插件,限定线序 步进电机引脚: VCC:蓝色 A:粉色 P0^0 B:黄色 P0^1 C:橙色 P0^2 D:红色 P0^3 sbit motor_rotation_A=P0^0; sbit motor_rotation_B=P0^1; sbit motor_rotation_C=P0^2; sbit motor_rotation_D=P0^3; //版本2:网上讲解最多的线序 步进电机引脚: VCC:红色 A:橙色 P0^0 B:黄色 P0^1 C:粉色 P0^2 D:蓝色 P0^3 sbit motor_rotation_A=P0^0; sbit motor_rotation_B=P0^1; sbit motor_rotation_C=P0^2; sbit motor_rotation_D=P0^3; 三:编程思路 定时器T0定时中断,每2ms中断一次,中断里,数据变更一次输出到步进电机,循环输出或者4096次之后不再输出,两种方式都可以 /**************************************** 电路元器件:STC89s52+步进电机28BYJ-48+ULN2003驱动 ****************************************/ #include //cnt_duty unsigned char cnt_1ms=0; //unsigned char code tab_motor ={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //4项8拍 //************************// //功能:初始化函数 //输入:无 //输出:无 //************************// void motor_rotation_Init(void) { P0=0x00; } //************************// //功能:初始化函数 //输入:无 //输出:无 //************************// void T0_init() { TMOD=0x01; TH0=0xF8; //2ms TL0=0xcc; ET0=1; EA=1; TR0=1; } //************************// //功能:主函数main() //输入:无 //输出:无 //************************// void main(void) { motor_rotation_Init(); T0_init(); while(1) { } } //************************// //功能:T0中断函数 //输入:无 //输出:无 //************************// void T0_intr(void) interrupt 1 using 1 { static unsigned char i=0; TH0=0xF8; //2ms TL0=0xcc; //版本04 //ok // if(cnt_1ms%2==0) //fuck! (%) and(/),I can't define it //if(cnt_1ms/2==0) // P0=tab_motor ; ++cnt_1ms; =8) i=0; } //再增添一些 我遇到的问题:电机只震动不转 我怀疑是数据和线序的问题,到底是橙色还是蓝色为第0脚,赋值问题; A1 : 将电机线成对的交换一下,相的导通顺序的不对,也可以改程序。 A2 : 原因: 1 ,步进电机的转速虽说和脉冲频率有关,但不是任何频率都行的。只能在某个特定的范围内调速才行; 2 ,脉冲频率太快,会丢步,即步进电机转子振荡很厉害。内部不动,外部在动,那是已经失步了,步进电机在一个位置振荡,根本没启动; 3 ,频率不对,也即是给两个脉冲中间的延时不对。 解决方法: 最好是用定时器给一个较精确的延时来调试,找出一个可以让它转的合适的延时。 A3: 首先要确认你外围接线是否正确。 再设定好步进的控制方式及细分,是双脉冲还是脉冲加方向控制。 最后再检测你的脉冲输出,脉冲频率先从低到高慢慢增加。 A4: 橙,黄,粉,蓝,就对应 A,B,C ,D ; 根据电路的设置,我们可以把电机每转动一个小角度的值给他算出来,分别是 :0xe,0xc,xd,0x9,0xb,0x3,0x7,0x6; //中文:坤豆豆 //英文:Cayden //时间:2020-11-15 //链接:https://blog.csdn.net/caozhaokun/article/details/109710113