社区导航

 
查看: 857|回复: 1

[讨论] 【C2000的使用经验】CLA与C28各用其长。

[复制链接]

1万

TA的帖子

34

TA的资源

版主

Rank: 6Rank: 6

发表于 2015-4-22 18:05:59 | 显示全部楼层 |阅读模式
C2000 CPU,部分器件具有控制率加速器,它实际上相当于一个浮点CPU,运算能力超强。而C28是定点(或有浮点运算)处理器。



C28 CPU作主器件,CLA作从器件。CPU启动CLA时,不象CPU执行中断指令那样,需要十多个时钟周期后才可以执行中断功能的操作,C28 CPU执行中断时还需要作相应的入栈出栈操作。而CPU启动CLA时,是立即执行的,没有延时问题。



对于运算中经常遇到处理浮点数的运算,交给CLA去做是最恰当的事了。



过去,曾在网上下载了PID运算的程序段,是这样的:



double PIDCalc( PID *pp, double NextPoint )
{
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 积分
dError = pp->LastError - pp->PrevError; // 当前微分
pp->PrevError = pp->LastError; pp->LastError = Error;
return (pp->Proportion * Error // 比例项
+ pp->Integral * pp->SumError // 积分项
+ pp->Derivative * dError // 微分项
}






当然了,开始时是将它交给CPU在中断中处理的。调试程序中发现,在执行它时,竟然达千把个时钟周期,后来分析,主要存在两个方面的问题:



一是C28处理了浮点数;二是语句写法(如return中过于繁杂使用编译后的程序反复调用其它过程)不恰当。



后来改为CLA来处理,并使用CLA的并行运算指令,使用程序仅用11个时钟:



PID .macro
    MI16TOF32  MR1, SetValue
    MI16TOF32  MR0, AdcReg              
    MSUBF32    MR0, MR1, MR0     
    ||MMOV32   MR1,Error1   
    MSUBF32       MR3, MR0, MR1
    ||MMOV32   MR2,Error2
    MSUBF32       MR2, MR1, MR2
    ||MMOV32   Error2,MR1
    MSUBF32       MR2, MR3, MR2
    ||MMOV32   MR1,Kd
    MMPYF32       MR2, MR1, MR2
    ||MMOV32   MR1,Ki
    MMPYF32       MR1, MR1, MR0
    ||MMOV32   Error1,MR0
    MADDF32       MR0, MR1, MR2
    ||MMOV32   MR1,Kp
    MMPYF32       MR3, MR1, MR3
    MADDF32       MR0, MR3, MR0
    .endm











此帖出自TI C2000论坛

回复

使用道具 举报

36

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-7-19 10:14:49 | 显示全部楼层
坐下沙发,学习

回复 支持 反对

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-8-21 22:04 , Processed in 0.218880 second(s), 16 queries , Redis On.

快速回复 返回顶部 返回列表