【原创】基于单片机的智能小车之步进电机28BYJ-48的转动_01
【原创】基于单片机的智能小车之步进电机28BYJ-48的转动_01_Cayden
最近想做一个步进电机转动,看着挺简单,也就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[]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06}; //单片机直接和步进电机相连
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<reg52.h>
//cnt_duty
unsigned char cnt_1ms=0;
//unsigned char code tab_motor[]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06}; //4项8拍
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[i++];
++cnt_1ms;
if(i>=8)
i=0;
}
//中文:坤豆豆
//英文:Cayden
//时间:2020-11-15