步进电机是将电脉冲信号,转变为角位移或线位移的开环控制电机,又称为脉冲电机。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。当步进驱动器接收到一个脉冲信号时,它就可以驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”。
步进电机的旋转是以固定的角度一步一步运行的,可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时可以通过控制脉冲频率,来控制电机转动的速度和加速度,从而达到调速的目的。步进电机多用于数字式计算机的外部设备,以及打印机、绘图机和磁盘等装置。
优缺点
步进电机的优点和缺点都非常的突出,优点集中于控制简单、精度高,缺点是噪声、震动和效率,它没有累积误差,结构简单,使用维修方便,制造成本低。步进电机带动负载惯量的能力大,适用于中小型机床和速度精度要求不高的地方,缺点是效率较低、发热大,有时会“失步”。优缺点如下所示。
优点:
- 电机操作易于通过脉冲信号输入到电机进行控制;
- 不需要反馈电路以返回旋转轴的位置和速度信息(开环控制);
-
缺点:
需要脉冲信号输出电路;
- 当控制不适当的时候,可能会出现同步丢失;
-
功能选择 (用驱动器面板上的 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)/ wsrd.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) )/10000srd.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);}}
驱动


