步进电机是将电脉冲信号,转变为角位移或线位移的开环控制电机,又称为脉冲电机。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。当步进驱动器接收到一个脉冲信号时,它就可以驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”。
步进电机的旋转是以固定的角度一步一步运行的,可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时可以通过控制脉冲频率,来控制电机转动的速度和加速度,从而达到调速的目的。步进电机多用于数字式计算机的外部设备,以及打印机、绘图机和磁盘等装置。
优缺点
步进电机的优点和缺点都非常的突出,优点集中于控制简单、精度高,缺点是噪声、震动和效率,它没有累积误差,结构简单,使用维修方便,制造成本低。步进电机带动负载惯量的能力大,适用于中小型机床和速度精度要求不高的地方,缺点是效率较低、发热大,有时会“失步”。优缺点如下所示。
优点:
- 电机操作易于通过脉冲信号输入到电机进行控制;
- 不需要反馈电路以返回旋转轴的位置和速度信息(开环控制);
-
缺点:
需要脉冲信号输出电路;
- 当控制不适当的时候,可能会出现同步丢失;
-
功能选择 (用驱动器面板上的 DIP 开关实现)
设置电机每转步数
驱动器可将电机每转的步数分别设置为 400、500、800、1000、1250、1600、2000、2500、3200、4000、5000、6400、8000、10000、12800步。
拨码开关 SW4 位可设置成两种控制方式:
当设置成 “OFF”时,为有半流功能。
当设置成 “ON”时,为无半流功能。设置输出相电流
为了驱动不同扭矩的步进电机,用户可以通过驱动器面板上的拨码开关SW1、SW2、SW3 位来设置驱动器的输出相电流(有效值)单位安培,各开关位置对应的输出电流,不同型号驱动器所对应的输出电流值不同。具体见表。
半流功能是指无步进脉冲 500ms 后,驱动器输出电流自动降为额定输出电流的 70% ,用来防止电机发热。控制代码
/*! \brief 以给定的步数移动步进电机
* 通过计算加速到最大速度,以给定的步数开始减速
* 如果加速度和减速度很小,步进电机会移动很慢,还没达到最大速度就要开始减速
* \param step 移动的步数 (正数为顺时针,负数为逆时针).
* \param accel 加速度,如果取值为100,实际值为100*0.01*rad/sec^2=1rad/sec^2
* \param decel 减速度,如果取值为100,实际值为100*0.01*rad/sec^2=1rad/sec^2
* \param speed 最大速度,如果取值为100,实际值为100*0.01*rad/sec=1rad/sec
*/
void MSD_Move(signed int step, unsigned int accel, unsigned int decel, unsigned int speed)
{
//达到最大速度时的步数.
unsigned int max_s_lim;
//必须开始减速的步数(如果还没加速到达最大速度时)。
unsigned int accel_lim;
status.sys_step = step;
status.sys_accel = accel;
status.sys_decel = decel;
status.sys_max_speed = speed;
// 根据步数的正负来判断方向
if(step < 0)//逆时针
{
srd.dir = CCW;//CCW=0,逆时针
step = -step;
}
else//顺时针
{
srd.dir = CW;//CW=1,顺时针
}
// 输出电机方向
DIR(srd.dir);
// 配置电机为输出状态
//status.out_ena = TRUE;
// 如果只移动一步
if(step == 1)
{
// 只移动一步
srd.accel_count = -1;
// 减速状态
srd.run_state = DECEL;
// 短延时
srd.step_delay = 1000;
// 配置电机为运行状态
status.running = TRUE;
//设置定时器重装值
TIM_SetAutoreload(MSD_PULSE_TIM,Pulse_width);
//设置占空比为50%
TIM_SetCompare2(MSD_PULSE_TIM,Pulse_width>>1);
//使能定时器
TIM_Cmd(MSD_PULSE_TIM, ENABLE);
}
// 步数不为零才移动
else if(step != 0)
{
// 我们的驱动器用户手册有详细的计算及推导过程
// 设置最大速度极限, 计算得到min_delay用于定时器的计数器的值。每一个脉冲的周期最小值
// min_delay = (alpha / tt)/ w
srd.min_delay = A_T_x100 / speed;
// 通过计算第一个(c0) 的步进延时来设定加速度,其中accel单位为0.01rad/sec^2
// step_delay = 1/tt * sqrt(2*alpha/accel)
// step_delay = ( tfreq*0.676/100 )*100 * sqrt( (2*alpha*10000000000) / (accel*100) )/10000
srd.step_delay = (T1_FREQ_148 * sqrt(A_SQ / accel))/100;
// 计算多少步之后达到最大速度的限制
// max_s_lim = speed^2 / (2*alpha*accel)
max_s_lim = (long)speed*speed/(long)(((long)A_x20000*accel)/100);
// 如果达到最大速度小于0.5步,我们将四舍五入为0
// 但实际我们必须移动至少一步才能达到想要的速度
if(max_s_lim == 0)
{
max_s_lim = 1;
}
// 计算多少步之后我们必须开始减速
// n1 = (n1+n2)decel / (accel + decel)
accel_lim = ((long)step*decel) / (accel+decel);
// 我们必须加速至少1步才能才能开始减速.
if(accel_lim == 0)
{
accel_lim = 1;
}
// 使用限制条件我们可以计算出第一次开始减速的位置
//srd.decel_val为负数
if(accel_lim <= max_s_lim)
{
srd.decel_val = accel_lim - step;
}
else
{
srd.decel_val = -(long)(max_s_lim*accel/decel);
}
// 当只剩下一步我们必须减速
if(srd.decel_val == 0)
{
srd.decel_val = -1;
}
// 计算开始减速时的步数
srd.decel_start = step + srd.decel_val;
// 如果最大速度很慢,我们就不需要进行加速运动
if(srd.step_delay <= srd.min_delay)
{
srd.step_delay = srd.min_delay;
srd.run_state = RUN;
}
else
{
srd.run_state = ACCEL;
}
// 复位加速度计数值
srd.accel_count = 0;
status.running = TRUE;
//设置定时器重装值
TIM_SetAutoreload(MSD_PULSE_TIM,Pulse_width);
//设置占空比为50%
TIM_SetCompare2(MSD_PULSE_TIM,Pulse_width>>1);
//使能定时器
TIM_Cmd(MSD_PULSE_TIM, ENABLE);
}
}
驱动