再从新看一下下面的步进电机外不雅图和外部构造图:步进电机一共有 5 根引线,个中白色的是公共端,衔接到 5V 电源,接下来的橙、黄、粉、蓝就对应了 A、B、C、D 相;那么假如要导通 A 相绕组,就只需将橙色线接地即可,B 相则×××接地,依此类推;再依据上述单四拍和八拍任务进程的解说,可以得出下面的绕组掌握次序表,如表 9-1 所示:
表 9-1 八拍形式绕组掌握次序表
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
P1-红 | VCC | VCC | VCC | VCC | VCC | VCC | VCC | VCC |
P2-橙 | GND | GND | GND | |||||
P3-黄 | GND | GND | GND | |||||
P4-粉 | GND | GND | GND | |||||
P5-蓝 | GND | GND | GND |
我们板子上掌握步进电机局部是和板子上的显示掌握的 74HC138 译码器局部复用的P1.0~P1.3,关于跳线我们在第 3 章曾经讲过了,经过调剂跳线帽的地位可以让 P1.0~P1.3掌握步进电机的四个绕组,如图 9-5 所示。
图 9-5 显示译码与步进电机的选择跳线
假如要运用电机的话,需求把 4 个跳线帽都调到跳线组的左侧(开辟板上的实践地位),即左侧针和两头针连通(对应道理图中的两头和下边的针),就可以运用 P1.0 到 P1.3 掌握步进电机了,如要再运用显示局部的话,就要再换回到右侧了。那假如人人既想让显示局部正常任务,又想让电机任务该怎样办呢?跳线帽坚持在右侧,用杜邦线把步进电机的掌握引脚(即左侧的排针)衔接到其它的暂不运用的单片机 IO 上即可。
再来看一下我们步进电机的道理图,步进电机的掌握电路如图 9-6 所示。
图 9-6 步进电机掌握电路
固然,单片机的 IO 口可以直接输入 0V 和 5V 的电压,然则电流驱动才能,也就是带载才能十分无限,所以我们在每相的掌握线上都添加一个三极管来进步驱动才能。由图中可以看出,若要使 A 相导通,则必需是 Q2 导通,此时 A 相也就是橙色线就相当于接地了,于是A 相绕组导通,此时单片机 P1 口低 4 位应输入 0b1110,即 0xE;如要 A、B 相反时导通,那么就是 Q2、Q3 导通,P1 口低 4 位应输入 0b1100,即 0xC,依此类推,我们可以失掉下面的八拍节奏的 IO 掌握代码数组:
unsigned char code BeatCode[8] = { 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 };
到这里,似乎一切的逻辑成绩都处理了,轮回将这个数组内的值送到 P1 口就行了。然则,只需再深化想一下就会发现还有个成绩:多长工夫送一次数据,也就是说一个节奏要继续多长工夫适宜呢?是随便的吗?当然不是了,这个工夫是由步进电机的启动频率决议的。启动频率,就是步进电机在空载状况下可以正常启动的最高脉冲频率,假如脉冲频率高于该值,电机就不克不及正常启动。表 9-2 就是由厂家供给的步进电机参数表,我们来看一下。
表 9-2 28BYJ-48 步进电机参数表
供电 电压 | 相数 | 相电阻 Ω | 步进角度 | 加速比 | 启动频率 P.P.S | 转矩 g.cm | 噪声 dB | 绝缘介 电强度 |
5V | 4 | 50±10% | 5.625/64 | 1:64 | ≥550 | ≥300 | ≤35 | 600VAC |
表中给出的参数是≥550,单元是 P.P.S,即每秒脉冲数,这里的意思就是说:电机包管在你每秒给出 550 个步进脉冲的状况下,可以正常启动。那么换算成单节奏继续工夫就是1s/550=1.8ms,为了让电机可以启动,我们掌握节奏刷新工夫大于 1.8ms 就可以了。有了这个参数,我们就可以入手写出最复杂的电机迁移转变程序了,如下:
#include <reg52.h> unsigned char code BeatCode[8] = { //步进电机节奏对应的 IO 掌握代码 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 }; void delay(); void main(){ unsigned char tmp; //界说一个暂时变量 unsigned char index = 0; //界说节奏输入索引 while (1){ tmp = P1; //用 tmp 把 P1 口以后值暂存 tmp = tmp & 0xF0; //用&操作清零低 4 位 //用|操作把节奏代码写到低 4 位 tmp = tmp | BeatCode[index]; //把低 4 位的节奏代码和高 4 位的原值送回 P1 P1 = tmp; index++; //节奏输入索引递增 index = index & 0x07; //用&操作完成到 8 归零 delay(); //延时 2ms,即 2ms 履行一拍 } } /* 软件延时函数,延时约 2ms */ void delay(){ unsigned int i = 200; while (i--); }
把程序编译下载到板子上尝尝吧!看看电机转了没有?要记得换跳线哦!
转载于:https://blog.51cto.com/12009764/1843893