黄工无刷电机学习
直播中

王飞云

7年用户 1429经验值
私信 关注
[问答]

请问STM32F103如何控制28BYJ-48步进电机正转或者反转一定的角度?

请问STM32F103如何控制28BYJ-48步进电机正转或者反转一定的角度?

回帖(1)

李永清

2021-10-15 10:56:38
介绍

  参数含义

  28——步进电机的有效最大外径是28毫米
B——表示是步进电机
Y——表示是永磁式
J——表示是减速型
48——表示四相八拍
  原理图

  
  

  

  步进电机控制威廉希尔官方网站

  
  

  

  工作原理

  通过对不同的相依次导通一定时间,使得定子转到指定角度。
最佳工作模式为八拍模式(八拍转过一个定子角度)
需要注意减速比
节拍刷新大于1.8ms即可
  单片机控制

  首先查询得步进电机节拍对应的IO控制代码
然后每隔一定的时间进行代码的刷新(这个刷新时间主要依据步进电机的启动频率)
  我看到好多此类的控制代码所需要的积分都是很多的,所以我就自己写了一份代码,包含控制正反转,还有旋转的角度,可以修改参数就可以达到自己想要的方案。
附上代码

#include "delay.h"
#include "sys.h"
#include "stdio.h"
//ALIENTEK miniSTM32开发板实验1
//跑马灯实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
//IN4: PB9  d
//IN3: PB8  c
//IN2: PB7  b
//IN1: PB6  a
//四相八拍
unsigned short phasecw[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A   反转
unsigned short phaseccw[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-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<4;i++)  
    {  
        GPIO_Write(GPIOB,phasecw);  
        delay_ms(3);  
    }  
}


void MotoRccw(void)  //正转
{  
    int i;  
    for(i=0;i<4;i++)  
    {  
        GPIO_Write(GPIOB,phaseccw);  
        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();//停止
  }
        else
        {
                for(j=0;j<64*angle/45;j++)
                {
                        MotoRcw();//反转
                }
                 MotorStop();//停止
        }
}


int main(void)
{       
        Moto_Init();                                   //电机
        delay_init();                     //延时函数初始化          
        Motor_Ctrl_Direction_Angle(1,180);//正转180度
        delay_ms(500);
        Motor_Ctrl_Direction_Angle(0,90);//反转90度
        while(1)
        {
        }
}
举报

更多回帖

×
20
完善资料,
赚取积分