浅谈步进电机的用法及STM32代码实现思路

这两天,在实验室搞了搞步进电机,可能只后会在电赛上用到,就弄了一个步进电机大体了解了一下。
我手上的是二相四线步进电机,步距角为1.8°,转矩为1.2N(这个我也不是很有概念),拿到手了我查了一下步进电机的工作原理

步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

看完总结一下好像就是这个步进电机和舵机差别还挺大的,步进电机只看脉冲,有一个脉冲,就转一个角,脉冲频率越高,电机速度越快,脉冲个数越多,转的角度越多。

然后就是步进电机的四线分别是红绿黄蓝,可以测一下,发现红绿导通,蓝黄导通,(到现在我也是一脸懵逼,到底咋控制它动)红绿黄蓝分别是A1 A2 B1 B2正好分成两组。
我又查了一下它的驱动,L298N!这个我熟。接线简单一说A1 A2接OUT1 2,B1 B2接OUT3 4。工作电压5v,L298N直接接12v直流电源就ok
接下来就是代码环节,我发现他居然分拍,又八拍和四拍
(1)四拍:A 1000,A- 0010,B 0100,B- 0001.
(2)八拍:A 1000,AA- 1010,A- 0010,A-B 0110,B 0100,BB- 0101,B- 0001,B-A 1001.
区别就是转子齿为50齿电机。四拍运行时步距角为θ=360度/(504)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(508)=0.9度(俗称半步)。这两个概念清楚后,我们再来计算转速,以基本步距角1.8°的步进电机为例(现在市场上常规的二、四相混合式步进电机基本步距角都是1.8°),四相八拍运行方式下,每接收一个脉冲信号,转过0.9°,如果每秒钟接收400个脉冲,那么转速为每秒400X0.9°=360°,相当与每秒钟转一圈,每分钟60转。其他情况同理可以计算得出。 (自我感觉没啥区别)

我用的是stm32f103,不细说,贴一下那个子文件吧

#include "bj.h"
#include "sys.h"
void BJ_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;     
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
 GPIO_Init(GPIOE, &GPIO_InitStructure);   
GPIO_SetBits(GPIOE,GPIO_Pin_0);       
 GPIO_SetBits(GPIOE,GPIO_Pin_1);       
 GPIO_SetBits(GPIOE,GPIO_Pin_2);      
 GPIO_SetBits(GPIOE,GPIO_Pin_3); 
}
#ifndef __BJ_H
#define __BJ_H  
#include "sys.h"
#define AIN1_1 PEout(0)// PE0
#define AIN1_2 PEout(1)// PE1 
#define BIN1_1 PEout(2)// PE2 
#define BIN1_2 PEout(3)// PE3 
void BJ_Init(void);//初始化
#endif
for(i=0;i<25;i++)
 //第一拍
{  AIN1_1=1;
  AIN1_2=0;
  BIN1_1=0;
  BIN1_2=0;
  delay_us(6000);
  //第二拍
  AIN1_1=0;
  AIN1_2=0;
  BIN1_1=1;
  BIN1_2=0;
  delay_us(6000);
  //第三拍
  AIN1_1=0;
  AIN1_2=1;
  BIN1_1=0;
  BIN1_2=0;
  delay_us(6000);
 //第四拍
  AIN1_1=0;
  AIN1_2=0;
  BIN1_1=0;
  BIN1_2=1;
  delay_us(6000);}
 for(i=0;i<25;i++)
  //第一拍
 { AIN1_1=0;
  AIN1_2=0;
  BIN1_1=0;
  BIN1_2=1;
  delay_us(6000);
  //第二拍
  AIN1_1=0;
  AIN1_2=1;
  BIN1_1=0;
  BIN1_2=0;
  delay_us(6000);
  //第三拍
  AIN1_1=0;
  AIN1_2=0;
  BIN1_1=1;
  BIN1_2=0;
  delay_us(6000);
 //第四拍
  AIN1_1=1;
  AIN1_2=0;
  BIN1_1=0;
  BIN1_2=0;
  delay_us(6000);
}

我用的是四拍,代码实现即正转180°再反转180°如此循环,延时就是控制它的频率,不太清楚它的最大频率,也就是最快转速,但不过转速越快带负载能力越差。
步进电机主要是精度高,正反转响应速度快,之前基本都是舵机,或者空心杯,直流减速电机,估计电赛可能用上步进所以看看(_)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章