标题:
步进电机STM32程序(用A4988控制)与限位开关配合使用
[打印本页]
作者:
不成佛便成魔
时间:
2020-7-25 09:42
标题:
步进电机STM32程序(用A4988控制)与限位开关配合使用
单片机是STM32的,有需要的可以参考一下,提供了.c和.h文件,只需添加在工程中就好,这里使用了3个步进电机和三个限位开关,添加的话可以对照着修改。
部分代码显示如下。
#include "delay.h"
#include "diver.h"
#include "oled.h"
#include "usart.h"
//暂不知道步距角
//电机引脚初始化
extern u8 endB;
void Step_Motor_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.12高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.12高
limit1=1;
limit2=1;
limit3=1;
}
void SetMotor1_forward(u16 speed)
{
DIR1=False;
STEP1=1;
delay_us(1);
STEP1=0;
delay_us(speed);
}
void SetMotor1_back(u16 speed)
{
DIR1=Turn; //后退
STEP1=1;
delay_us(1);
STEP1=0;
delay_us(speed);
}
void SetMotor2_forward(u16 speed)
{
DIR2=False;
STEP2=1;
delay_us(1);
STEP2=0;
delay_us(speed);
}
void SetMotor2_back(u16 speed)
{
DIR2=Turn; //后退
STEP2=1;
delay_us(1);
STEP2=0;
delay_us(speed);
}
void SetMotor3_forward(u16 speed)
{
DIR3=False;
STEP3=1;
delay_us(1);
STEP3=0;
delay_us(speed);
}
void SetMotor3_back(u16 speed)
{
DIR3=Turn; //后退
STEP3=1;
delay_us(1);
STEP3=0;
delay_us(speed);
}
void step1_forward(u16 steps,u16 speed)
{
u16 i;
for(;i<=steps;i++)
{
if(limit_1==1)//判断限位开关是否被按下,没有则执行下去
SetMotor1_forward(speed);
else break;//否则就跳出循环
}
USART1_RX_BUF[endB]=0;//清零准备下一次接收
}
void step1_back(u16 steps,u16 speed)
{
u16 i;
for(;i<=steps;i++)
{
if(limit_2==1)
SetMotor1_back(speed);
else break;
}
USART1_RX_BUF[endB]=0;
}
void step2_forward(u16 steps,u16 speed)
{
u16 i;
for(;i<=steps;i++)
{
if(limit_2==1)
SetMotor2_forward(speed);
else break;
}
USART1_RX_BUF[endB]=0;//清零准备下一次接收
}
void step2_back(u16 steps,u16 speed)
{
u16 i;
for(;i<=steps;i++)
{
if(limit_2==1)
SetMotor2_back(speed);
else break;
}
USART1_RX_BUF[endB]=0;
}
void step3_forward(u16 steps,u16 speed)
{
u16 i;
for(;i<=steps;i++)
{
if(limit_3==1)
SetMotor3_forward(speed);
else break;
}
USART1_RX_BUF[endB]=0;//清零准备下一次接收
}
void step3_back(u16 steps,u16 speed)
{
u16 i;
for(;i<=steps;i++)
{
if(limit_3==1)
SetMotor3_back(speed);
else break;
}
USART1_RX_BUF[endB]=0;
}
void step1_2_forward(u16 steps,u16 speed)
{
u16 i;
for(;i<=steps;i++)
{
if(limit_1==1&&limit_2==1)
{
SetMotor1_forward(speed);
SetMotor2_forward(speed);//两个步进电机一起运动
}
else break;
}
USART1_RX_BUF[endB]=0;
}
void step1_2_back(u16 steps,u16 speed)
{
u16 i;
for(;i<=steps;i++)
{
if(limit_1==1&&limit_2==1)
{
SetMotor1_back(speed);
SetMotor2_back(speed);//两个步进电机一起运动
}
else break;
}
USART1_RX_BUF[endB]=0;
}
/************以下是****************/
//void STEP_1(u16 speed)
//{ STEP1=0;delay_us(speed); STEP2=0; delay_us(speed);STEP3=0; delay_us(speed);STEP4=1;delay_us(speed);}
//void STEP_2(u16 speed)
//{ STEP1=0;delay_us(speed); STEP2=0; delay_us(speed);STEP3=1;delay_us(speed); STEP4=0;delay_us(speed);}
//void STEP_4(u16 speed)
//{ STEP1=0; delay_us(speed);STEP2=1;delay_us(speed);STEP3=0;delay_us(speed); STEP4=0;delay_us(speed);}
//void STEP_8(u16 speed)
//{ STEP1=1;delay_us(speed); STEP2=0;delay_us(speed); STEP3=0;delay_us(speed);STEP4=0;delay_us(speed);}
//void SetMotor_forward(u16 steps,u16 speed)//正转
//{
// u8 inch;
// u16 add;
// for(add=0;add<steps;add++)//转半圈
// for(inch=0;inch<4;inch++)//完成一个拍数4*0.36°
// switch(inch)
// {
// case 0: STEP_1(speed); break;
// case 1: STEP_2(speed); break;
// case 2: STEP_4(speed); break;
// case 3: STEP_8(speed); break;
// }
//}
//void SetMotor_back(u16 steps,u16 speed)//反转
//{
// u8 inch;
// u16 add;
// for(add=0;add<steps;add++)//转半圈
// for(inch=0;inch<4;inch++)//完成一个拍数4*0.36°
// switch(inch)
// {
// case 0: STEP_8(speed); break;
// case 1: STEP_4(speed); break;
// case 2: STEP_2(speed); break;
// case 3: STEP_1(speed); break;
// }
//}
复制代码
//已使用过,没有任何问题。(使用的是4线二相的步进电机,末端注释掉的是五线的,可用)
51hei.png
(4.61 KB, 下载次数: 61)
下载附件
2020-7-25 14:48 上传
头文件下载:
DIVER.zip
(1.96 KB, 下载次数: 116)
2020-7-25 09:42 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
biubiubiu2124
时间:
2024-3-19 10:31
USART1_RX_BUF[endB]=0;//清零准备下一次接收
请问这个串口这个去掉,会有问题嘛,这句话是用来提示当前状态的嘛
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1