在掌握了GPIO口的使用后,就可以利用它的输出工作模式来实现对步进电机的控制。
步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等工作。受驱动能力的限制,要驱动步进电机还要为它配上一个功率驱动模块,这两者如图1所示。

图1 步进电机与驱动模块
为了驱动步进电机,除了硬件方面的准备,还需必要的软件配合。
要编写步进电机驱动程序主要分为以下几步:
1)分配引脚
步进电机与开发板的连接关系为:
MA---PB6
MB---PB7
MC---PB8
MD---PB9
其使用的接口为J6,见图2所示。

图2 所用接口
比较让人吐槽的是,开发板上竟没有一个5V的电源输出引脚以供步进电机工作。
后来在原理图上找到一个接口J7可提供5V电源输出,但还是早期的版本,现已被清除掉了。
为此,只能提供外部电源供电。

图3 早期的J7接口

图4 最终的连接形式
2)高低电平的输出
为便于输出高低电平,所作的定义语句为:
#define MAL GPIO_Set_Data(GPIOB, GPIO_NUM_6, GPIO_DATA_CLEAR)
#define MAH GPIO_Set_Data(GPIOB, GPIO_NUM_6, GPIO_DATA_SET)
#define MBL GPIO_Set_Data(GPIOB, GPIO_NUM_7, GPIO_DATA_CLEAR)
#define MBH GPIO_Set_Data(GPIOB, GPIO_NUM_7, GPIO_DATA_SET)
#define MCL GPIO_Set_Data(GPIOB, GPIO_NUM_8, GPIO_DATA_CLEAR)
#define MCH GPIO_Set_Data(GPIOB, GPIO_NUM_8, GPIO_DATA_SET)
#define MDL GPIO_Set_Data(GPIOB, GPIO_NUM_9, GPIO_DATA_CLEAR)
#define MDH GPIO_Set_Data(GPIOB, GPIO_NUM_9, GPIO_DATA_SET)
3)配置引脚工作模式
要驱动步进电机工作,必须使各引脚按时序要求来输出高低电平,其引脚工作模式的配置函数为:
void bjdj_init(void)
{
RCC_Peripheral_ClockEn(GPIOBCLC);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
4)配置延时函数
配置延时函数的作用在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。
对于步进电机来说其速度是与驱动脉冲相有关的,但也并非脉冲越快,电机的转速就越快。因为电机属机械器件,要建立相应的磁场以达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,而无法旋转。
5)控制电机旋转方向
对于4相5线式步进电机来讲,可通过8个节拍的脉冲序列来控制其正反转。
正转的驱动函数为:
void zx(int n)
{
unsigned char X,Y;
for(X=0;X<64;X++)
{
for(Y=0;Y<8;Y++)
{
MDL;
MAH;
cf_delay_ms(n);
MBH;
cf_delay_ms(n);
MAL;
cf_delay_ms(n);
MCH;
cf_delay_ms(n);
MBL;
cf_delay_ms(n);
MDH;
cf_delay_ms(n);
MCL;
cf_delay_ms(n);
MAH;
cf_delay_ms(n);
}
}
}
反转的驱动函数为:
void fx(int n)
{
unsigned char X,Y;
for(X=0;X<64;X++)
{
for(Y=0;Y<8;Y++)
{
MDH;
MAH; //A
cf_delay_ms(n);
MAL; //AB
cf_delay_ms(n);
MCH; //B
cf_delay_ms(n);
MDL; //BC
cf_delay_ms(n);
MBH; //C
cf_delay_ms(n);
MCL; //CD
cf_delay_ms(n);
MAH; //D
cf_delay_ms(n);
MBL; //DA
cf_delay_ms(n);
}
}
}
对于变量n来讲,其作用是控制电机转动的快慢。
6)控制电机运行
控制电机正反转的函数为:
void clkz(int d,int m)
{
int i;
MAL;
MBL;
MCL;
MDL;
cf_delay_ms(20);
for(i=0;i<m;i++)
{
if(d==0) fx(1);
else zx(1);
}
}
在该函数中。控制参数d用于控制电机的转动方向,参数m用于控制电机的转动圈数。
控制电机运行的主程序为:
void main(void)
{
bjdj_init();
cf_delay_ms(20);
clkz(1,3);
cf_delay_ms(500);
clkz(0,3);
while (1);
}
编译后的结果如图5所示,说明程序实际没有问题。

图5 完成编译
后续,会利用步进电机的精准控制与超声波测距模块相配合来实现一个可摆动检测距离的装置。