在之前的驱动步进电机的基础上引入了按键的功能,可以通过按键实现电机的正转、反转和停止。
硬件连接如下:
OUT1:步进电机4
OUT2:步进电机3
OUT3:步进电机2
OUT4:步进电机1
步进电机5:VCC电源正极(5V)
GND:共地
COM:VCC电源正极(5V)
5V直流电源:STM32F103ZET6开发板上的5V电压引脚
废话不多说,直接上代码。
这个代码是有bug的,就是开机之后只能选择一次运行方式,正转/反转/停止,如果想要更换运行方式只能重新复位
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "stm32f10x.h"
u16 phasecw1[4] ={0x0008,0x0040,0x0001,0x2000};// 逆时针
u16 phaseccw2[4]={0x2000,0x0001,0x0040,0x0008};// 顺时针
//单四拍
#define DC_A_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_3)
#define DC_B_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_2)
#define DC_C_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_0)
#define DC_D_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_13)
#define DC_A_ON GPIO_SetBits(GPIOC,GPIO_Pin_3)
#define DC_B_ON GPIO_SetBits(GPIOC,GPIO_Pin_2)
#define DC_C_ON GPIO_SetBits(GPIOC,GPIO_Pin_0)
#define DC_D_ON GPIO_SetBits(GPIOC,GPIO_Pin_13)
void Motor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//默认ULN2003四路输入低电平,输出高电平
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
GPIO_ResetBits(GPIOC,GPIO_Pin_3);
}
步进电机正转函数
void Motorcw1(void)
{
{
uint8_t i;
for(i=0;i<4;i++)
{
GPIO_Write(GPIOC,phasecw1[i]);
delay_ms(6);
}
}
}
步进电机反转函数
void Motorcw2(void)
{
DC_A_OFF;
DC_B_OFF;
DC_C_OFF;
DC_D_ON;
delay_ms(6);
DC_A_OFF;
DC_B_OFF;
DC_C_ON;
DC_D_OFF;
delay_ms(6);
DC_A_OFF;
DC_B_ON;
DC_C_OFF;
DC_D_OFF;
delay_ms(6);
DC_A_ON;
DC_B_OFF;
DC_C_OFF;
DC_D_OFF;
delay_ms(6);
}
//电机停止函数
void MotorStop(void)
{
GPIO_Write(GPIOC,0x0000);
}
//主函数
int main(void)
{
vu8 key=0;
delay_init(); //延时函数初始化
KEY_Init(); //初始化与按键连接的硬件接口
Motor_Init();
while(1)
{
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case KEY2_PRES: //控制电机正转
while(1)
{
Motorcw1();
}
break;
case KEY1_PRES: //控制电机反转
while(1)
{
Motorcw2();
}
break;
case KEY0_PRES: //控制电机停止
while(1)
{
MotorStop();
}
break;
}
}
else delay_ms(10);
}
}