社区导航

 
查看: 771|回复: 0

[讨论] 【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












回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2017-4-29 09:34 , Processed in 0.152623 second(s), 16 queries , Redis On.

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