这个项目使用步进电机高速启停并换向。需要在尽可能短时间完成相应的圈数。常用的线性加速启停的时候有很大的噪声。需要做一点运动控制。达到加速度变化连续的效果。7段加减速控制策略分t1~t7 7个阶段,Am 为速度上升段最大加速度,An为速度下降段最大加速度。
可以得到如下加速度表达式
对应的速度可以用加速度对t积分求不定积分得到
显然Vm 为 t3时刻的速度,即
Vm = 1/2*Am*t1+Am*(t2-t1)+1/2*Am(t3-t2) = 1/2*Am*(t3+t2-t1)
由速度在t6
修改下降沿数据,可以发现急动度有所增加。
可以将t2-t1设置为0,得到5段变速控制。
另一种变通的方案是速度曲线使用升余弦。相对简单。似乎比线性加速度的控制策略效果更好。
依据前面分析的速度对称性,可得总距离 S
S = 1/2*Vm*Tr + Vm*Td + 1/2*Vm*Tf
使用 matlab 分析如下
intv = 5;Tt = 500/intv; % TimeTottle msTr = 200/intv;Tf = 200/intv;Td = Tt - Tr - Tf;Ts = 37200/2; %tottle stepst = 1:Tt;Vm = Ts/(Td+Tr/2+Tf/2)*1000/intv;% 升余弦Vlist = ones(1,length(t))*Vm;Vlist(1:Tr) = (1-cos(pi/Tr*t(1:Tr)))/2*Vm;Vlist(Tr+Td+1:Tr+Td+Tf)=(1+cos(pi/Tf*t(1:Tf)))/2*Vm;subplot(3,1,1)plot(Vlist,'.')title(['Vm = ' num2str(Vm) '/' num2str(Vm/16) 'pps' '/' num2str(Vm/16/200*60) 'rpm'])grid onAlist = Vlist - [0 Vlist(1:length(Vlist)-1)];subplot(3,1,2)plot(Alist,'.')title(['Am = ' num2str(Am)]);grid onJlist = Alist - [0 Alist(1:length(Alist)-1)];subplot(3,1,3)plot(Jlist,'.')title('Jark');grid onfor i=0:fix(length(Vlist)/10-1)fprintf('%6d,',round(Vlist(i*10+1:i*10+10)));fprintf('\n');endfprintf('%6d,',round(Vlist(i*10+11:length(Vlist))))
对于步进电机,其Vm取决于所需要的输出扭矩,可以设定Vm 反推出在不同控制策略下运行指定的距离需要的时间。
实际的运动控制相当于将速度曲线定时播放出来,控制电机的运行。
下面是依据电机和驱动器参参数实际经过优化后的步进电机高速启停换向演示,因拍摄采样率的问题,实际效果远比视频中丝滑。
video: https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3427024882503041031
|