再从头看一下上面的步进电机外观图和内部结构图:步进电机一共有5根引线,其间赤色的是公共端,连接到 5 V 电源,接下来的橙、黄、粉、蓝就对应了 A、B、C、D 相;那么假如要导通 A 相绕组,就只需将橙色线接地即可,B 相则黄色接地,依此类推;再依据上述单四拍和八拍作业进程的解说,可以得出下面的绕组操控次序表,如表9-1所示:
咱们板子上操控步进电机部分是和板子上的显现操控的 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 口可以直接输出 0 V 和 5 V 的电压,可是电流驱动才能,也便是带载才能十分有限,所以咱们在每相的操控线上都添加一个三极管来进步驱动才能。由图中可以看出,若要使 A 相导通,则有必要是 Q2 导通,此刻 A 相也便是橙色线就相当于接地了,所以A 相绕组导通,此刻单片机 P1 口低4位应输出 0b1110,即 0xE;如要 A、B 相一起导通,那么便是 Q2、Q3 导通,P1 口低4位应输出 0b1100,即 0xC,依此类推,咱们可以得到下面的八拍节拍的 IO 操控代码数组:
unsignedcharcodeBeatCode[8]={0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6};
到这儿,好像一切的逻辑问题都处理了,循环将这个数组内的值送到 P1 口就行了。可是,只需再深化想一下就会发现还有个问题:多长时刻送一次数据,也便是说一个节拍要继续多长时刻适宜呢?是随意的吗?当然不是了,这个时刻是由步进电机的发动频率决议的。发动频率,便是步进电机在空载情况下可以正常发动的最高脉冲频率,假如脉冲频率高于该值,电机就不能正常发动。表9-2便是由厂家供给的步进电机参数表,咱们来看一下。
表9-2 28BYJ-48 步进电机参数表
供电电压相数相电阻Ω步进视点减速比发动频率P.P.S转矩g.cm噪声dB绝缘介电强度5V450±10%5.625/641:64≥550≥300≤35600VAC
表中给出的参数是≥550,单位是 P.P.S,即每秒脉冲数,这儿的意思便是说:电机确保在你每秒给出550个步进脉冲的情况下,可以正常发动。那么换算成单节拍继续时刻便是 1 s/550=1.8 ms,为了让电机可以发动,咱们操控节拍改写时刻大于 1.8 ms 就可以了。有了这个参数,咱们就可以着手写出最简略的电机滚动程序了,如下:
#includeunsignedcharcodeBeatCode[8]={//步进电机节拍对应的IO操控代码0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6};voiddelay();voidmain(){unsignedchartmp;//界说一个暂时变量unsignedcharindex=0;//界说节拍输出索引while(1){tmp=P1;//用tmp把P1口当时值暂存tmp=tmp&0xF0;//用&操作清零低4位//用|操作把节拍代码写到低4位tmp=tmp|BeatCode[index];//把低4位的节拍代码和高4位的原值送回P1P1=tmp;index++;//节拍输出索引递加index=index&0x07;//用&操作完成到8归零delay();//延时2ms,即2ms履行一拍}}/*软件延时函数,延时约2ms*/voiddelay(){unsignedinTI=200;while(i–);}
把程序编译下载到板子上试试吧!看看电机转了没有?要记住换跳线哦!