原创 【原创】基于单片机的智能小车之步进电机28BYJ-48的转动_01

2020-11-15 21:18 941 7 5 分类: MCU/ 嵌入式 文集: 51单片机
最近想做一个步进电机转动,看着挺简单,也就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

//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;
}

//再增添一些
我遇到的问题:电机只震动不转 我怀疑是数据和线序的问题,到底是橙色还是蓝色为第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

作者: 坤豆豆, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1580238.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论2条评论)

登录后参与讨论

Tyron 2020-11-18 13:20

学习了

bokes 2020-11-16 15:20

谢谢,学习
相关推荐阅读
坤豆豆 2020-10-12 21:06
【原创】单片机细小知识点汇总-持续更新
第一次:2020-10-12   21:05sfr P0=0x80; //sfr:给地址0x80声明一个新的名字,因为单片机只认识0x80,sfr让单片机认识到0x80对应的新的名...
坤豆豆 2020-09-20 12:17
数字电路_规模大小的定义_Cayden_Blog4
数字电路_规模大小的定义 集成电路规模,目前国际上还没有确切的划分标准,不过人们使用中产生了相对一致意见的划分标准 :按照所含逻辑门/晶体管个数作为划分标志 小规模集成电路SSIC的标准:1...
坤豆豆 2020-09-20 11:44
【原创】数字电路_等式变换之定律计算_Cayden_Blog3
公司里有很多电路图和电路板,不可能有人花时间给你讲解,每个人都有自己的事情需要做,很多需要自己学习,自己领悟,画出数字逻辑表达式,领悟前辈的设计精髓,增长自己的能力。数字电路也有等式计算,化简最小项/...
坤豆豆 2020-09-18 21:38
【原创】数字电路_基于Multisim13的数码管电路仿真_Cayden_Blog2
数字电路_基于Multisim13的数码管电路仿真一:仿真电路模块设计电路的时候,先仿真电路模块 首先,搭建好仿真电路后 其次,开始仿真 其次,仿真结束后,查看电路仿真结果,验证设计指标是否达到 元器...
坤豆豆 2020-09-15 22:10
【原创】二进制-八进制-十进制-十六进制之间的相互转换—blog1
10年前,在大学里学习了数字电路,课本中讲到了进制之间的相互转换,最近用到数字芯片74HC125,涉及到TTL-CMOLS-进制转换,三个方面的知识,重新拿起书本,再查找资料,汇总信息如下:01:二进...
广告
我要评论
2
7
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /6 下一条