【C2000的使用经验】CLA与C28各用其长。
[复制链接]
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
|