双极性的意思是通过线圈的电流有两个方向
A+ 流向 A-或者A- 流向 A+
B+ 流向 B-或者B- 流向 B+
与单极性的步进电机一样,有三种驱动方式,单四拍、双四拍、八拍
A+表示电流从A+流向A-,A-表示电流从A-流向A+
因为单四拍的步距角是7.5度,也就是说按A+,B+,A-,B-这样线圈通电顺序就可以让步进电机转动7.5度,又因为该步进电机没有减速比,所以360/7.5 = 48,48个这样的单四拍就可以让电机转动一圈,双四拍的同理
八拍步距角是3.75度,360/3.75 = 96,所以在八拍的驱动方式下,步进电机转一圈要96个这样的八拍脉冲
与单极性步进电机的程序差不多,在驱动方式上和转一圈所需的脉冲数不同
一个四拍或八拍都是让线圈轮流通电,若脉冲是A+,就让A+引脚输出高电平,A-引脚输出低电平,这样电流就从A+流向了A-,驱动转子转动
A1 = A+,A2 = A-
/*
* @name Step_One_Pulse
* @brief 步进电机步进一个脉冲
* @param Speed_Change -> 速度变化
* @retval None
*/
static void Step_One_Pulse(void)
{
static uint8_t Position = 0;
//单四拍
if(Bipolar_Step_Motor.Drive_Mode == Drive_Mode_Single_4_Beats)
{
if(Bipolar_Step_Motor.Direction == Forward_State)
{
//正向步进 A1 - B2 - A2 - B1
switch(Position)
{
case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
case 1: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
case 2: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
case 3: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
default: System.Error_Handler();
}
}
else
{
//反向步进 A1 - B1 - A2 - B2
switch(Position)
{
case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
case 1: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
case 2: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
case 3: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
default: System.Error_Handler();
}
}
//更新位置信息
if((++Position) == 4)
Position = 0;
}
//双四拍
if(Bipolar_Step_Motor.Drive_Mode == Drive_Mode_Double_4_Beats)
{
if(Bipolar_Step_Motor.Direction == Forward_State)
{
//正向步进 A1B2 - B2A2 - A2B1 - B1A1
switch(Position)
{
case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
case 1: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
case 2: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
case 3: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
default: System.Error_Handler();
}
}
else
{
//反向步进 A1B1 - B1A2 - A2B2 - B2A1
switch(Position)
{
case 0: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
case 1: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
case 2: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
case 3: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
default: System.Error_Handler();
}
}
//更新位置信息
if((++Position) == 4)
Position = 0;
}
//单八拍
if(Bipolar_Step_Motor.Drive_Mode == Drive_Mode_8_Beats)
{
if(Bipolar_Step_Motor.Direction == Forward_State)
{
//正向步进 A1 - A1B2 - B2 - B2A2 - A2 - A2B1 - B1 - B1A1
switch(Position)
{
case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
case 1: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
case 2: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
case 3: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
case 4: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
case 5: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
case 6: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
case 7: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
default:System.Error_Handler();
}
}
else
{
//反向步进 A1 - A1B1 - B1 - B1A2 - A2 - A2B2 - B2 - B2A1
switch(Position)
{
case 0: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
case 1: SET_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
case 2: CLR_Motor_A1; SET_Motor_B1; CLR_Motor_A2; CLR_Motor_B2; break;
case 3: CLR_Motor_A1; SET_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
case 4: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; CLR_Motor_B2; break;
case 5: CLR_Motor_A1; CLR_Motor_B1; SET_Motor_A2; SET_Motor_B2; break;
case 6: CLR_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
case 7: SET_Motor_A1; CLR_Motor_B1; CLR_Motor_A2; SET_Motor_B2; break;
default:System.Error_Handler();
}
}
//更新位置信息
if((++Position) == 8)
Position = 0;
}
}
电机转一圈的脉冲次数也不同
如果是四拍,则步进电机转一圈需要这样的四拍48次
如果是八拍,则转一圈需要这样的八拍96次
//定义结构体类变量
Bipolar_Step_Motor_t Bipolar_Step_Motor =
{
Stop_State,
Forward_State,
Speed_6,
0,
//Drive_Mode_Single_4_Beats,
Drive_Mode_Double_4_Beats,
//Drive_Mode_8_Beats,
0,
(uint8_t)48, //4拍,一圈转48次
//(uint8_t)96, //8拍,一圈转96次
Direction_Adjust,
Speed_Adjust,
Step_One_Pulse
};