3066|4

215

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

关于PID运算,一种10个时钟周期的另一种算法。 [复制链接]

首先是@dontium 。共同讨论C2000系列中的CLA的一个计算方法。

图片截取自网络。其中第一项是比例项,第二项是积分项,第三项是微分项。对应的系数是kp,ki,kd。然后根据这个表达式的恒等变换可以得到最后一个表达式。如果计算第一个表达式。每次需要三次减法,三次乘法,两次加法可以得到计算结果。但是使用最后一个结果只要使用三次乘法和两次加法。可以得到结果。从直观来看这样子似乎会比较省步奏。
但是实际上还有点问题。CLA还有个并行指令的功能。对于寄存器操作的加减乘法都可以有并行的移动指令。用dontium 的方法多出来的三个减法指令都可以加入并行的移动指令所以还是10个指令完成。
附上今天写的cla程序。手边没有单片机不好试。可能会有流水线冲突问题。
  1.     MMOV32   MR1,  @_deltTK2
  2.     MMOV32   MR2,  @_deltTK1
  3.     MMOV32   MR0,  @_deltT

  4.     MMPYF32  MR1,  MR1,  @_KC1
  5.     MMPYF32  MR3,  MR2,  @_KB1

  6.     MADDF32  MR3,  MR3,  MR1
  7. || MMOV32   @_deltTK2,  MR2

  8.     MPYF32   MR1,  MR0,  @_KA1

  9.     MADDF32  MR3,  MR3,  MR1
  10. || MMOV32   @_deltTK1,  MR0
复制代码
其中deltTK是从c28X内核算出来的当前误差。所以就相当于少了两个指令,所以还是很dontium的速度是一样。
程序还没调试程序很可能有流水线冲突问题。
另外还有两个小问题希望请教下@dontium 大哥
1像MMOV32   MR1,  @_deltTK2
     MMPYF32  MR1,  MR1,  @_KC1
这样的指令是否会不满足流水线操作问题。 乘法从MR1中取数据,是否不是上一个指令从deltTK2中取到的值?
2如果我有某几个参数是保存在flash里面。然后开机后复制到ram里面运行。同时这个数据我会更新他,并且要求掉电保存。
我的想法就是把他更改后的数据写到这个参数在flash保存的地址上。这样就能实现掉电保存了。但问题是我如何获得这个数据在flash中保存的位置。

最新回复

关于流水线的问题,手册中在指令说明的后面会加入一个或多个Example,可以看看TI是怎么处理的。 在调试时,可以在先用简单易看懂的数进去,让它运行后看一看结果。这样更能说明问题。  详情 回复 发表于 2015-1-27 23:16

赞赏

1

查看全部赞赏

 
点赞 关注

回复
举报

1万

帖子

25

TA的资源

裸片初长成(高级)

沙发
 
关于并行指令的安排,我也在考虑能不能减少些指令。但是遇到两个问题,一是寄存器数量受限问题,即,可以加入并行指令的指令,并行后是要使用寄存器的,使用后就占住它,如果要在以后用这个数,其它指令就不能使用这个寄存器。

二是需要用并行指令时,要处理某些数据还没有得出结果,这样也不能用并行指令了。

关于流水线延时问题,好象只有几种指令需要等待,加、减、乘、倒,等不需要等待。
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

板凳
 
对了,楼主的
    MMOV32   MR1,  @_deltTK2
中的_deltTK2,取数时(根据下面的指令)应该为浮点数,

而作PID时,取的是ADC值,是整形,需要用

MI16TOF32         MR1, xx,

这样,直接将ADC值取出,没有其它操作,会快一些。并且这条指令也是单周期的。


不然的话,这个数起码是要转换的,或者是经过计算的。

点评

这个细节还是多谢提醒啦。这个误差是从C28X里面算出来的一个浮点值。用RAM传给CLA模块的。所以我就用了MMOV32我感觉这个东西有点像是手册中CLA Pipeline Alignment里的Write Followed by Read一章提到的。第一个指  详情 回复 发表于 2015-1-27 23:02
 
 
 

回复

215

帖子

0

TA的资源

一粒金砂(高级)

4
 
dontium 发表于 2015-1-27 22:46
对了,楼主的
    MMOV32   MR1,  @_deltTK2
中的_deltTK2,取数时(根据下面的指令)应该为浮点数,

而作PID时,取的是ADC值,是整形,需要用

MI16TOF32         MR1, xx,

这样,直接将ADC值取出,没有其它操作,会快一些。并且这条指令也是单周期的。


不然的话,这个数起码是要转换的,或者是经过计算的。

这个细节还是多谢提醒啦。这个误差是从C28X里面算出来的一个浮点值。用RAM传给CLA模块的。所以我就用了MMOV32我感觉这个东西有点像是手册中CLA Pipeline Alignment里的Write Followed by Read一章提到的。第一个指令应该是在做到第八集流水线的时候,MR1才被改变,但是在后面那个指令应该在哪一级流水线去读取MR1的数据?如果在R1或者R2时候读取就读到的是之前的MR1数据。如果是在Exe的时候读取,应该就会有个冲突了?
微机原理学的不够深入。在这个地方有点不大了解。
另外关于flash地址的问题有没有什么意见。?


 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

5
 
关于流水线的问题,手册中在指令说明的后面会加入一个或多个Example,可以看看TI是怎么处理的。


在调试时,可以在先用简单易看懂的数进去,让它运行后看一看结果。这样更能说明问题。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表