步进电机作为一种将电脉冲信号转化为角位移或线位移的开环控制电机,在现代数字程序控制系统中扮演着关键角色,其应用领域极为广泛。在未超载状态下,电机的转速和停止位置仅由脉冲信号的频率和数量决定,不受负载变化影响。皖南电机价格表 每当步进驱动器接收到一个脉冲信号,便驱动步进电机按照预定方向转动一个固定的角度,即“步距角”,其运行模式为以固定角度分步进行。通过调整脉冲数量,可以精确控制角位移,实现精准定位;同时,通过调整脉冲频率,可以控制电机的转速和加速度,实现调速功能。
步进电机属于感应电机,其工作原理是通过电子电路将直流电转化为分时供电的多相时序控制电流,为步进电机提供能量,驱动器则负责为步进电机提供这种分时供电的多相时序控制电流。皖南电机
关于步进电机的S型曲线加减速算法及实现,S型曲线的方程如下,图形在[-5,5]范围内如下所示:
若将此曲线应用于步进电机的加减速过程,需在XY坐标系中平移方程,并对曲线进行拉伸变换:其中A分量在y方向平移,B分量在y方向拉伸,ax+b分量在x方向平移和拉伸。
在项目加速过程中,从5600Hz加速至64000Hz,采用4细分,输出比较模块所用的定时器驱动频率为10M,采用1000个点进行加速处理。根据项目需求,在加速过程中采用的曲线方程如下:
其中Fcurrent为length(1000)个点中的单个频率值。Fmin起始频率为5600;Fmax为*大频率64000;-flexible*(i-num)/num是对S型曲线进行拉伸变换,其中flexible代表S曲线区间(越大代表压缩越严重,中间(x坐标0点周围)加速度越大;越小越接近匀加速。理想的S曲线取值为4-6),i是循环计算过程中的索引,从0开始,num为length/2大小(这样可以使得S曲线对称)。在项目中i的区间[0,1000),num=1000/2=500。这些参数均可修改。提供的计算接口如下。
对应的计算接口code:
void CalculateSModelLine(float freq[], unsigned short period[], float len, float freq_max, float freq_min, float flexible)
{
int i=0;
float deno;
float melo;
float del=freq_max-freq_min;
for(;;i++)
{
melo=flexible*(i-len/2)/(len/2);
deno=1.0/(1+expf(-melo));//expf是指数函数库中的函数
freq[i]=del*deno+freq_min;
period[i]=(unsigned short)(10000000.0/freq[i]);//10000000是定时器驱动频率
}
return;
}
//启动电机
void StartPWM()
{
DriverMotorFlag=TRUE;
Index=0;
MOTOR_EN_DISABLE=ENABLE;
OpenOC4(OC_ON|OC_TIMER_MODE16|OC_TIMER3_SRC|OC_PWM_FAULT_PIN_DISABLE,0,0);
//将RC13映射到OC4输出
RPC13R=11;
//50%占空比
OC4RS=OC_PERIOD_MIN/2;
OpenTimer3(T3_ON|T3_PS_1_8, OC_PERIOD_MIN);
INTSetVectorPriority(INT_TIMER_3_VECTOR, INT_PRIORITY_LEVEL_6);
INTSetVectorSubPriority(INT_TIMER_3_VECTOR, INT_SUB_PRIORITY_LEVEL_1);
EnableIntT3;
}
//停止电机,此处没有减速
void StopPWM()
{
DriverMotorFlag=FALSE;
Index=0;
MOTOR_EN_DISABLE=DISENABLE;
OpenOC4(OC_OFF|OC_TIMER_MODE16|OC_TIMER3_SRC|OC_PWM_FAULT_PIN_DISABLE,0,0);
//将RC13映射到OC4输出
RPC13R=0;
PORTCbits.RC13=0;
CloseTimer3();
DisableIntT3;
}
//在对应的定时器中断中更改定时器周期值,而不是在其他地方更改,否则电机可能会偶尔卡住。
//*初我在另一个定时器中断中每隔1ms更改应用在OC模块的timer3的周期值,这偶尔会造成电机在加速过程中卡住。实际上应该在timer3的中断中更改。
static unsigned short CountForAcc=0;
void __ISR(_TIMER_3_VECTOR,ipl6) Timer3OutHandler(void)
{
//清除中断标志,否则中断不会再次发生。
mT3ClearIntFlag();
if(CountForAcc++>2)//这里可以调整加速的总时间
{
CountForAcc=0;
//if(DriverMotorFlag==TRUE&&PR3>OC_PERIOD_MAX+SPEED_STEP)
if(DriverMotorFlag==TRUE&&Index { PR3=Period[Index++]; OC4RS=PR3/2; } } } 通过CalculateSModelLine接口得到如下几条不同的加速曲线: 黄色:CalculateSModelLine(Freq, Period, 1000, 56000, 16000, 4); 橙色:CalculateSModelLine(Freq, Period, 1000, 64000, 500, 8); 蓝色:CalculateSModelLine(Freq, Period, 1000, 64000, 500, 15); 灰色:CalculateSModelLine(Freq, Period, 1000, 40000, 500, 5); *后可以估算加速过程的时间和角位移,以橙色曲线为例:CalculateSModelLine(Freq, Period, 1000, 64000, 500, 8)为例(假设在中断中没有if(CountForAcc++>2)条件限制): 时间:Period第一个点的值为10000000/500=20000,*后点的值为10000000/64000=156,平均值为10000左右,timer中断的平均时间Tn=10000/10000000=1ms,1000个点,总时间为1s,当然,起始频率大加速时间就越短,比如Fmin=16000Hz,Fmax=64000,则40ms左右即可完成加速过程。安徽皖南电机 角位移:1.8(单步)*1000(步数)/4(细分)=450° 上述为加速过程,减速过程同理,只需将方程改为: 可以得到减速曲线如下所示: