使用场合:步进电机带动旋转部件,另外旋转带有一个编码器,用以检测实际旋转位置
配置:雷赛步进驱动+57步进电机+减速机(减速比1156:225)+齿轮传动(减速机齿轮25,旋转体齿轮90)/编码器齿轮16
按照旋转部件最大速度30rpm,1s加速时间。减速其实速度为0,每10ms更新一次脉冲频率,得出的计算表格如附件。
计算想法:
1、按照旋转的加速度计算每增加10ms,旋转部件旋转到多少圈(0.5*a*t*t),然后按传动比计算电机旋转旋转多少圈,然后按照电机3200脉冲一圈,计算需要多少个脉冲
比如:旋转部件30rpm=0.5rps,a=v/t=0.5r/s2
200ms时,旋转部件应旋转圈数:0.5*0.5*0.2*0.2=0.01r,按传动比计算电机旋转0.185r,按3200脉冲一圈计算,电机需运行592(计算591.87)个脉冲
由此加速出加减速的脉冲数量和对应OCR1A值
uint pulsetotal[100]=
{
1,6,13,24,37,53,73,95,120,148,
179,213,250,290,333,379,428,479,534,592,
653,716,783,852,925,1000,1079,1160,1244,1332,
1422,1515,1611,1711,1813,1918,2026,2137,2251,2367,
2487,2610,2736,2865,2996,3131,3269,3409,3553,3699,
3849,4001,4156,4315,4476,4640,4807,4978,5151,5327,
5506,5688,5873,6061,6252,6445,6642,6842,7045,7250,
7459,7671,7885,8103,8323,8547,8773,9002,9235,9470,
9708,9949,10194,10441,10691,10944,11200,11459,11721,11985,
12253,12524,12798,13074,13354,13637,13922,14211,14502,14797
};
uint ocr1a[100]=
{
12456,4151,2490,1779,1383,1131,957,829,732,655,
592,541,497,460,429,401,376,355,336,318,
303,289,276,264,253,243,234,225,218,210,
203,197,191,185,180,174,170,165,161,157,
153,149,146,142,139,136,133,130,127,125,
122,120,118,115,113,111,109,107,105,104,
102,100,99,97,96,94,93,91,90,89,
87,86,85,84,83,81,80,79,78,77,
76,75,74,74,73,72,71,70,69,69,
68,67,66,66,65,64,64,63,62,62
};
2、按以上计算结果,加速到最大速度,电机需要脉冲为14797(计算14796.8)个脉冲
3、如果实际要求旋转脉冲超过14797*2时,则加速到最大速度,然后减速
4、如果脉冲少于14797*2时,则判断需要加速到哪个速度等级(共100级)。
比如脉冲数量为1284,则电机加速运行592脉冲,减速运行592脉冲,匀速运行100脉冲
3-4步代码如下
rotpulnum为总脉冲数,accpulse为加速脉冲,conpulse为匀速脉冲,decpulse为减速脉冲,step_max标记为加速到哪一级,step为当前加减速等级:
//Get Step
pulnum=rotpulnum;
pulnumtemp=rotpulnum;
pulnumtemp>>=1;
for(i=0;i<100;i++)
{
if(pulnumtemp>=pulsetotal)
{
step_max=i;
}
}
//Get pulse1,pulse2
accpulse=pulsetotal[step_max];
decpulse=accpulse;
conpulse=pulnum-accpulse-decpulse;
//Set original
pulsecounter=0;
step=0;
5、开启TIMER1的匹配中断,按步进电机实际运行脉冲数进行累积,并判断下一步如何运行
思路为:
加速时:如果总脉冲数小于加速脉冲,则为加速;如果超过,则转为匀速
如果脉冲数达到下一级速度的脉冲值,则速度增加
匀速时:如果没有达到减速脉冲值,不操作,达到后转为减速
减速时:如果剩余脉冲小于减速脉冲,则为减速速;
如果剩余脉冲数达到下一级速度的脉冲值,则速度降低
停止: 剩余脉冲数为0,则停止
void Tim1CompA(void)
{
//Step Counter
pulsecounter++;
pulseremain=pulnum-pulsecounter;
//acc-mode
if(pulsecounter<=accpulse)
{
if((pulsecounter==pulsetotal[step+1])&&(step<step_max))
{
step++;
OCR1A=ocr1a[step];
}
}
//con speed mode
else if((pulsecounter>accpulse)&&(pulsecounter<(pulnum-decpulse)))
{
}
//dec speed mode
else if((pulseremain<=decpulse)&&(pulseremain!=0))
{
if((pulseremain==pulsetotal[step-1])&&(step<=step_max))
{
step--;
OCR1A=ocr1a[step];
}
}
//stop
else if(pulseremain==0)
{
TCCR1A=0x00;
TCCR1B=0x00;
TCCR1C=0x00;
OCR1A=0x00;
TIMSK&=~BIT(4);
}
}
6、问题
测试运行32000脉冲,电机应旋转10圈。实测会达到10圈多一点,多次循环运行可以看出来
专门将脉冲计数器pulsecounter的最终值显示出来看了一下,确实达到32000。
故求助!
|