基于跟踪微分器的步进电机自适应速度曲线设计

链接

知网链接
https://kns.cnki.net/kcms/detail/11.5664.V.20220308.0850.002.html

投稿期刊的word输出的pdf
链接: https://pan.baidu.com/s/1juRwojIz0UU2dNuUoByzfQ 提取码: bvtk

论文的latex版本
https://gitee.com/xd15zhn/stepmotorpaper/releases
  下面两个都是之前的版本,最新版看知网,不过内容都差不多,后面都是按照审稿意见改的没什么用,建议看最早的latex版本,自认为latex比较好看。

勘误说明

下面的公式有点小错误,感谢网友指正。公开的版本好像不能改了,latex版本我已经修改。
原文中的公式为
{ y = x 1 + h x 2 d = h 2 r k ′ = 1 2 ( 1 + 1 + 8 ∣ y ∣ d ) k = sign ( k ′ − fix ( k ′ ) ) + fix ( k ′ ) u = { − y + h x 2 d , ∣ y ∣ ≤ d ( 1 − k 2 ) s − x 1 + k h x 2 ( k − 1 ) d , 1 ) , ∣ y ∣ > d fsun = r sat ( u ) \begin{cases} y=x_1+hx_2\\ d=h^2r\\ k'=\displaystyle{\frac{1}{2}(1+\sqrt{1+\frac{8|y|}{d}}})\\ k=\text{sign}(k'-\text{fix}(k'))+\text{fix}(k')\\ u=\begin{cases} \displaystyle{-\frac{y+hx_2}{d},|y|{\le}d}\\ \displaystyle{(1-\frac{k}{2})s-\frac{x_1+khx_2}{(k-1)d},1),|y|>d}\\ \end{cases}\\ \text{fsun}=r\text{sat}(u) \end{cases} y=x1+hx2d=h2rk=21(1+1+d8∣y )k=sign(kfix(k))+fix(k)u= dy+hx2,yd(12k)s(k1)dx1+khx2,1),y>dfsun=rsat(u)
应改为
{ y = x 1 + h x 2 d = h 2 r k ′ = 1 2 ( 1 + 1 + 8 ∣ y ∣ d ) k = sign ( k ′ − fix ( k ′ ) ) + fix ( k ′ ) u = { − y + h x 2 d , ∣ y ∣ ≤ d ( 1 − k 2 ) sign ( y ) − x 1 + k h x 2 ( k − 1 ) d , ∣ y ∣ > d fsun = r sat ( u ) \begin{cases} y=x_1+hx_2\\ d=h^2r\\ k'=\displaystyle{\frac{1}{2}(1+\sqrt{1+\frac{8|y|}{d}}})\\ k=\text{sign}(k'-\text{fix}(k'))+\text{fix}(k')\\ u=\begin{cases} \displaystyle{-\frac{y+hx_2}{d},|y|{\le}d}\\ \displaystyle{(1-\frac{k}{2})\text{sign}(y)-\frac{x_1+khx_2}{(k-1)d},|y|>d}\\ \end{cases}\\ \text{fsun}=r\text{sat}(u) \end{cases} y=x1+hx2d=h2rk=21(1+1+d8∣y )k=sign(kfix(k))+fix(k)u= dy+hx2,yd(12k)sign(y)(k1)dx1+khx2,y>dfsun=rsat(u)
{ y = x 1 + h x 2 d = h 2 r k ′ = 1 2 ( 1 + 1 + 8 ∣ y ∣ d ) k ′ = sign ( k ′ − fix ( k ′ ) ) + fix ( k ′ ) u ′ = { − y + h x 2 d , ∣ y ∣ ≤ d ( 1 − k 2 ) sign ( y ) − x 1 + k h x 2 ( k − 1 ) d , ∣ y ∣ > d u = r sat ( u ) fsun = { u , x 2 + h u ≤ p sat ( p sign ( x 2 ) − x 2 h , − r , r ) , x 2 + h u > p \left\{\begin{aligned} &y=x_1+hx_2\\ &d=h^2r\\ &k'=\displaystyle{\frac{1}{2}(1+\sqrt{1+\frac{8|y|}{d}}})\\ &k'=\text{sign}(k'-\text{fix}(k'))+\text{fix}(k')\\ &u'=\begin{cases} \displaystyle{-\frac{y+hx_2}{d},|y|{\le}d}\\ \displaystyle{(1-\frac{k}{2})\text{sign}(y)-\frac{x_1+khx_2}{(k-1)d},|y|>d}\\ \end{cases}\\ &u=r\text{sat}(u)\\ &\text{fsun}=\\ &\begin{cases} u,x_2+hu\le p\\ \text{sat}(\displaystyle{\frac{p\text{sign}(x_2)-x_2}{h}},-r,r),x_2+hu>p\\ \end{cases}\\ \end{aligned}\right. y=x1+hx2d=h2rk=21(1+1+d8∣y )k=sign(kfix(k))+fix(k)u= dy+hx2,yd(12k)sign(y)(k1)dx1+khx2,y>du=rsat(u)fsun= u,x2+hupsat(hpsign(x2)x2,r,r),x2+hu>p
错了两个地方,都是同一个错误。

正文

  一开始我自己定的论文题目是《跟踪微分器实现步进电机的速度曲线设计》,后来根据审稿人的意见改成《步进电机自适应速度曲线设计及其物理仿真验证》,最后又改成现在这个题目。我的毕设是步进电机驱动的六轴机械臂 AR3,写程序的时候感觉直接计算定时器的输出脉宽有点复杂,然后忽然想到了跟踪微分器的安排过渡过程方法,然后就想办法把这两个东西结合起来,并加入一些优化,称其为“脉冲自适应跟踪算法”(PAT算法)。
  后来网上搜了一圈没人这么搞过,没有代码没有论文,好像国内外我是第一个这么搞的,就干脆拿这点子写论文了。本来自己搞出一个新东西还挺高兴的,但将近一年过去我感觉这个想法可能真的没什么用,也就平时玩玩还可以,但工业应用就感觉太low了。而且跟传统方法相比并没有提升什么性能,只是换了个算法而已。人生第一篇论文就这么水过去了。。。
  下面正式介绍一下算法思路。我用的stm32,核心代码长下面这样

/**********************
20ms控制周期
**********************/
void Control_Loop(void)
{
    u8 i;
    float u;
    for(i=0; i<6; ++i){
        u=ADRC_fhan(PulseBase[i]-PulseTarget[i], TDx2[i], MaxAcc[i], MaxSpeed[i]);
        TDx1[i] += H*TDx2[i];
        TDx2[i] += H*u;
        if((ABS(TDx2[i])<=3.06) || (PulseBase[i]==PulseTarget[i])){
            dir[i] = TDx2[i] = 0;
            continue;
        }
        HalfWidth[i] = ABS(50000/TDx2[i]) + 0.5;
        dir[i] = (TDx2[i]>0) ? 1 : -1;
    }
}

下面是定时器里控制生成PWM脉冲的代码

/**********************
生成PWM脉冲
**********************/
s8 PWM_Generate(int n, s16 *period)
{
    static u8 isHigh=0xFF;  // 上升沿或下降沿标志位
    if (isHigh & (1<<n)){  // 上升沿标志一个脉冲结束
        MOTOR_PWM_OUTPUT_HIGH(n);
        if(dir[n]==-1) MOTOR_DIR_OUTPUT_LOW(n);
        else MOTOR_DIR_OUTPUT_HIGH(n);  // 停转或正转设置为正方向
        PulseBase[n]+=dir[n];  // 脉冲步数更新
        *period = HalfWidth[n];  // 设置下一次脉冲的脉宽
        if (dir[n]) isHigh ^= (1<<n);
        return dir[n];
    }
    else{  // 下降沿触发脉冲,此时不可修改脉宽或方向
        MOTOR_PWM_OUTPUT_LOW(n);
        *period = 0;  // 下一次脉宽为0表示下降沿不修改脉宽
        isHigh ^= (1<<n);
        return 1;  // 定时器保持工作状态
	}
}

下面是定时器中断函数

void TIM2_IRQHandler(void)
{
    s16 TIM_Period;
    if (!(TIM2->SR & TIM_IT_Update)) return;
    if (!PWM_Generate(0, &TIM_Period)) TIM2->CR1 &=~ TIM_CR1_CEN;
    if (TIM_Period) TIM2->ARR = TIM_Period;
    TIM2->SR = ~TIM_IT_Update;
}

而且就像论文里说的,可以在电机运行过程中随意修改目标位置、方向、初始速度、最大限制速度和加速度等参数,这主要是为了我在给机械臂调参时方便。我没试过传统方法,也不知道我的代码是不是真的在跟传统方法实现类似功能的情况下更短更简洁。类似代码很多,随便找几个
利用stm32控制步进电机 速度&&加速度控制
基于STM32F103的步进电机S型曲线加减速算法与实现
STM32步进电机加减速
然后我写的stm32同时驱动多个步进电机的代码见 stm32用定时器通过驱动器控制多个步进电机
  跟踪微分器和脉宽相结合的主要困难在于跟踪微分器计算的是速度而脉宽控制的是时间,简单的计算倒数会有一些细节上的问题,论文里有讲这个问题。而且步进电机的速度曲线里是有最大速度的,跟踪微分器里可没有。另一个困难也算是论文的创新点是我需要随时调参数,而且我也是看中了跟踪微分器可以用作指令规划的功能,以及对最速控制函数添加了一些改动。
  更多的细节有人看的话再写。
  下面是我自己写的对应的可以修改所有参数的机械臂上位机。
在这里插入图片描述
在这里插入图片描述
现在论文发表了的话代码就可以公开了。
论文插图代码:https://gitee.com/xd15zhn/paperplot
stm32控制器代码:https://gitee.com/xd15zhn/ar3stm32
上位机由于涉及到另外的算法,暂时不能公开,等我毕业了再公开。
最后列一下论文的参考文献中比较重要的几篇论文,其它的都是凑数的。

  • 孙彪. 离散系统最速控制综合函数 [J]. 控制与决策,2010,25(3):473-477.
  • Atmel Corporation. AVR446: Linear speed control of stepper motor. http://ww1.microchip.com/downloads/en/AppNotes/doc8017.pdf. 2006.
  • Austin D . Generate stepper-motor speed profiles in real time[J]. Embedded Systems Programming, 2005, 18(1):p.28-30,32-35.
    这篇论文网上有翻译(应该是机翻):实时生成步进电机速度曲线
  • P.J. Siripala, Y. Ahmet Sekercioglu, A generalised solution for generating stepper motor speed profiles in real time, Mechatronics,Volume 23, Issue 5,2013,Pages 541-547,ISSN 0957-4158
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值