28BYJ-48步進電機+ULN2003驅動程式四相八拍(stm32f103c8t6)

前面發布的四相四拍,這次的程式是四相八拍:
AD-A-AB-B-CB-C-DC-D 四相八拍正轉
- 對應的引腳:(請務必使用該引腳,因為是暫存器操作,更換引腳將配置的輸出對應不上輸出)
//IN4: PB9 d //IN3: PB8 c //IN2: PB7 b //IN1: PB6 a- 四相四拍和四相八拍都在其中,使用那種啟用和注釋對應的即可實作轉換
//四相四拍電流0.35A,四相八拍電流0.7A
//四相四拍運行方式:
unsigned short phasecw[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A 四相四拍反轉
unsigned short phaseccw[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D 四相四拍正轉
//四相八拍運行方式:
//unsigned short phasecw[8] ={0x0200,0x300,0x100,0x180,0x0080,0xC0,0x0040,0X60};// D-DC-C-CB-B-BA-A-AD 四相八拍反轉
//unsigned short phaseccw[8]={0x60,0x004,0xC0,0X80,0X180,0X100,0X300,0x0200};// AD-A-AB-B-CB-C-DC-D
- 如果想自己自定義引腳使用請參照下圖自行定義:橙黃粉藍分別代表28BYJ-48步進電機的線序

- 程式step.c
//IN4: PB9 d
//IN3: PB8 c
//IN2: PB7 b
//IN1: PB6 a
#include "stdio.h"
#include "sys.h"
#include "delay.h"
#include "step.h"
//四相四拍電流0.35A,四相八拍電流0.7A
//四相四拍運行方式:
unsigned short phasecw[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A 四相四拍反轉
unsigned short phaseccw[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D 四相四拍正轉
//四相八拍運行方式:
//unsigned short phasecw[8] ={0x0200,0x300,0x100,0x180,0x0080,0xC0,0x0040,0X60};// D-DC-C-CB-B-BA-A-AD 四相八拍反轉
//unsigned short phaseccw[8]={0x60,0x004,0xC0,0X80,0X180,0X100,0X300,0x0200};// AD-A-AB-B-CB-C-DC-D 四相八拍正轉
void Moto_Init(void)
{//引腳初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;//引腳按著INT1順序接就行了
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 );
}
void MotoRcw(void) //反轉
{
int i;
// for(i=0;i<8;i++) //四相八拍
for(i=0;i<4;i++)
{
GPIO_Write(GPIOB,phasecw[i]);
delay_ms(3);
}
}
void MotoRccw(void) //正轉
{
int i;
// for(i=0;i<8;i++) //四相八拍
for(i=0;i<4;i++)
{
GPIO_Write(GPIOB,phaseccw[i]);
delay_ms(3);
}
}
void MotorStop(void) //停止
{
GPIO_Write(GPIOB,0x0000);
}
//控制電機正轉還是反轉某個角度
//direction方向,1為正轉,0為反轉
//angle角度,可為0-360具有實際意義
void Motor_Ctrl_Direction_Angle(int direction, int angle)
{
u16 j;
if(direction == 1)
{
for(j=0;j<64*angle/45;j++)
{
MotoRccw();//正轉
}
MotorStop();//停止
//delay_ms(3);
}
else
{
for(j=0;j<64*angle/45;j++)
{
MotoRcw();//反轉
}
MotorStop();//停止
//delay_ms(3);
}
}
- step.c
#ifndef __STEP_H
#define __STEP_H
void Moto_Init(void);
void Motor_Ctrl_Direction_Angle(int direction, int angle);
void MotorStop(void);//停止
void MotoRccw(void); //正轉
void MotoRcw(void); //反轉
#endif
- main.c
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "step.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設定中斷優先級分組2
Moto_Init();
LED_Init();
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
delay_init();
while(1){
Motor_Ctrl_Direction_Angle(1, 360); //正轉1圈
delay_ms(2000);
Motor_Ctrl_Direction_Angle(0, 360); //反轉一圈
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272950.html
標籤:其他
上一篇:echarts 畫動態水球
