單片機是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
|