一直很喜欢玩数控系统,今天用STM32写了一个简单的多轴直线插补算法,(连续插补的加减速算法还未调试出来)。给大家参考。
方法是这样的: 先计算出理论要到达的坐标,然后用步进电机去逼近这个值。
由于资源不够(或者我的算法不好 ),输出的脉冲无法达到很快,不过插补精度比较高。
[mw_shl_code=c,true]//***************************************???????ú????/
s16 bujindianjizhixiangeijing(int64_t umx, int64_t umy, int64_t umz, int64_t speed)//mm/M
{
int64_t jueduijuli;
if(speed > bujindianjizuidasudu * 60)
{
speed = bujindianjizuidasudu * 60;
}
yudingsudu = speed / 60;
cankaomaichong = 0;
yuanzuobiao[ 0 ] = jueduizuobiao[ 0 ];
yuanzuobiao[ 1 ] = jueduizuobiao[ 1 ];
yuanzuobiao[ 2 ] = jueduizuobiao[ 2 ];
umx -= jueduizuobiao[ 0 ];
umy -= jueduizuobiao[ 1 ];
umz -= jueduizuobiao[ 2 ];
jueduijuli =sqrt(umx*umx + umy*umy + umz*umz);
zuidacankao = jueduijuli * 600 / (speed ); //?????à?????????ó?ù?è???±??:???????¨?±?÷???????±?? ?ò·??®????
//*********************************************
yudingzuobiao[ 0 ] = umx;
yudingzuobiao[ 1 ] = umy;
yudingzuobiao[ 2 ] = umz;
jiansu = 0;
bujindianjiyunxing = 1;//???????ú????????
return 0;
}[/mw_shl_code]
[mw_shl_code=c,true]void TIM4_IRQHandler(void)
{
if(cankaomaichong >= zuidacankao)
{
cankaomaichong = 0;
bujindianjiyunxing = 0;
yuanzuobiao[ 0 ] = jueduizuobiao[ 0 ];
yuanzuobiao[ 1 ] = jueduizuobiao[ 1 ];
yuanzuobiao[ 2 ] = jueduizuobiao[ 2 ];
}
if(bujindianjiyunxing == 1)
{
cankaomaichong++;
}
//************************************************
jueduizuobiao[ 0 ] = cankaomaichong * yudingzuobiao[ 0 ] / zuidacankao + yuanzuobiao[ 0 ];
jueduizuobiao[ 1 ] = cankaomaichong * yudingzuobiao[ 1 ] / zuidacankao + yuanzuobiao[ 1 ];
jueduizuobiao[ 2 ] = cankaomaichong * yudingzuobiao[ 2 ] / zuidacankao + yuanzuobiao[ 2 ];
//**************************************************************************************
yudingmaichong[ 0 ] = jueduizuobiao[ 0 ] * bujindianji1yimmbujinshu / 1000;
//yudingmaichong[ 1 ] = jueduizuobiao[ 1 ] * bujindianji1yimmbujinshu / 1000;
//yudingmaichong[ 2 ] = jueduizuobiao[ 2 ] * bujindianji1yimmbujinshu / 1000;
//**************************************************************************************
if(jueduimaichong[ 0 ] < yudingmaichong[ 0 ])
{
if(bujindianji1fangxiangyinjiao != bujindianji1zhengzhuan)
{
bujindianji1fangxiangyinjiao = bujindianji1zhengzhuan;
}else
{
bujindianji1maichongyinjiao =! bujindianji1maichongyinjiao;
jueduimaichong[ 0 ]++;
}
}
if(jueduimaichong[ 0 ] > yudingmaichong[ 0 ])
{
if(bujindianji1fangxiangyinjiao != bujindianji1fanzhuan)
{
bujindianji1fangxiangyinjiao = bujindianji1fanzhuan;
}else
{
bujindianji1maichongyinjiao =! bujindianji1maichongyinjiao;
jueduimaichong[ 0 ]--;
}
}
//**************************************************************************************
if(zuidacankao <= (cankaomaichong + jiasudujishi))
{
//jiansu = 1;
}
//**************************************************************************************
tim[ 1 ]++;
TIM_ClearFlag(TIM4, TIM_FLAG_Update);//??TIMx???????
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);//????TIMx???????????í??
}[/mw_shl_code]
|