matlab ramp函数,一文教你快速搞懂 FOC ramp function 斜坡函数的作用和实现

文章目录

1 预备知识

x(t)={0,t<0At,t≥0x(t)={0,t<0At,t≥0 x(t) = \begin{cases}0,t<0\\At,t \ge 0\\\end{cases}x(t)={0,t<0At,t≥0

其中A为增益,相当于给定一个速度,在时间 [0,t][0,t] [0, t ][0,t]期间内,按照A作为加速度,匀加速或者匀减速到速度给定值 vrefvref v_{ref}vref

如上图所示,这种函数就相当于控制系统中均速变换的位置信号,在三环控制的位置中,相当于这样一个过程;

设定最终的位置量为x(t0)x(t0) x(t_0)x(t0​);

系统按照A的速度进行均匀的位置变换,A=dxdtA=dxdt A = \cfrac{dx}{dt}A=dtdx​;

最终到达 t0t0 t_0t0​ 时刻,系统到达设定的位置x(t0)x(t0) x(t_{0})x(t0​);

同样的,也适用于速度环,对于不同的被控对象,增益AA AA的物理意义也不同,但是斜坡函数的最终目的就是让输入信号变得更加平缓,减少系统超调,从而优化系统的时间响应。

进行离散化

将方程进行离散化,按照 △T△T \bigtriangleup_{T}△T​的时间采样,那么可以将输入离散化:

x(i)={0,i<0Ai,i≥0x(i)={0,i<0Ai,i≥0 x(i) = \begin{cases}0,i<0\\Ai,i \ge 0\\\end{cases}x(i)={0,i<0Ai,i≥0

2 设计思路

首先这里简单讲一下斜坡函数实现的思路:

采样时间,需要根据采样时间对系统进行离散;

当前值,系统当前状态被控量的值,即 x(i)x(i) x(i)x(i);

目标值,系统最终期望到达的值,即x(i0)x(i0) x(i_0)x(i0​);

延迟时间,系统到达目标值所需要的时间;

步数,系统达到目标值的步数,通常为 i=tdelay△Ti=tdelay△T i = \cfrac{t_{delay}}{\bigtriangleup_{T}}i=△T​tdelay​​;

斜率,斜率为 Xtarget−XinitalstepXtarget−Xinitalstep \cfrac{X_{target} - X_{inital}}{step}stepXtarget​−Xinital​​,也就是每一步需要增加的值,最终一步一步增加到目标值;

通常在实际控制系统中,在定时器中断或者事件函数中,需要根据系统当前值,目标值,和延迟时间进行一次计算,得到斜坡函数需要执行的步数和斜坡函数的斜率。

下面用matlab先用模拟一下斜坡函数的生成,另外实际测试了一下C语言在实际硬件上的运行情况。

3 matlab 程序

以下程序模拟了采样时间为1,并且在delay时间(delay为sample_time的整数倍)之后最终到达target,具体程序如下所示;

function ramp_func()%采样时间为1sample_time = 1;current = 0;%到达目标值期望的时间delay = 10;%需要步数step = delay/sample_time;fprintf("step:%d\n",step);%目标值target = 20;%斜率 增益Ainc_dec = (target - current)/step;output = 1:1:step;i=1;while i <= step output(i) = current inc_dec; current = output(i); fprintf("output(%d):%d\n",i,output(i)); i = i 1;endplot(output);end

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

最终的运行结果如下;

4 C语言程序

下面是一个速度的斜坡函数,相关参数封装到speed_ramp_mod中,具体如下所示;

struct speed_ramp_mod{ int16_t target_val; //目标参考值 int16_t present_ref; //当前参考值 int16_t step_val; //当前参考值到目标参考值所需要的步数 int16_t inc_val; //步长/斜率 int16_t freq_hz; //速度环频率};typedef struct speed_ramp_mod speed_ramp_mod_t;speed_ramp_mod_t user_ramp = { .target_val = 0, //目标参考值 .present_ref = 0, //当前参考值 .step_val = 0, //当前参考值到目标参考值所需要的步数 .inc_val = 0, //步长 .freq_hz = RAMP_SPEED_FREQ //速度采样频率};int16_t speed_ramp_calc(speed_ramp_mod_t *p){ int32_t ref; ref = p->present_ref; if(p->step_val > 1){ ref = p->inc_val; p->step_val--; }else if(p->step_val == 1){ ref = p->target_val; p->step_val = 0; }else{ /** Do Nothing */ } p->present_ref = ref; return ref;}uint8_t speed_ramp_exec(speed_ramp_mod_t *p,int16_t target_val,int16_t durationms){ int32_t inc = 0; int16_t ref = 0; ref = p->present_ref; if(durationms == 0){ p->step_val = 0; p->inc_val = 0; p->present_ref = target_val; }else{ p->target_val = target_val; //计算步长度 p->step_val = (int32_t)durationms*p->freq_hz / 1000; p->inc_val = (p->target_val - ref)/p->step_val; }}uint8_t speed_ramp_completed(speed_ramp_mod_t *p){ uint8_t retval = 0; if(p->step_val == 0){ retval = 1; } return retval;}void speed_ramp_stop(speed_ramp_mod_t *p){ p->step_val = 0; p->inc_val = 0;}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

下面是测试程序,可以将程序放到定时器中进行周期性执行;

int16_t spd_ref = 0;int16_t speed_ramp_ref = 0;int16_t rpm_speed_set = 0;void test(void){ if(speed_ramp_completed(&user_ramp)){ speed_ramp_exec(&user_ramp,rpm_speed_set,USER_RAMP_DELAY); } speed_ramp_ref = speed_ramp_calc(&user_ramp); printf("%d\r\n", speed_ramp_ref);}

1

2

3

4

5

6

7

8

9

10

11

最终给定的速度曲线和实际的速度采样曲线如下图所示;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值