单片机是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线二相的步进电机,末端注释掉的是五线的,可用)
头文件下载:
DIVER.zip
(1.96 KB, 下载次数: 116)
|