如何将DCL添加到用户代码中

        该数字控制库旨在与用C编程语言编写的CCS项目一起使用。用户负责在调用控制器` run `函数之前初始化控制器结构的元素。通常,所需的控制器函数被插入到由硬件事件触发的中断服务例程(ISR)中。这确保了控制器以固定的速率执行,并且它们的时间与传入数据的可用性同步。在CLA上使用的控制函数将从CLA任务调用,同样,这通常由硬件事件以固定的速率触发。

        控制器参数和动态数据封装在一个C结构中,该结构是一个指针,它作为参数传递给控制器的` run `函数。通常,控制器结构将是用户程序中的全局变量,其内容在第一次调用` run `函数之前初始化。控制器的` run `函数是不可重入的,因为它们依赖于全局变量(在本例中是控制器结构)。用户有责任确保在执行类似的控制器函数时不会调用控制器函数。

将DCL添加到现有C代码的步骤

加到现有C程序的推荐步骤顺序。参考第5章的代码示例,这些示例说明了配置和使用CLA的DCL。

1---步骤1。指定包含文件

在开始使用库之前,必须将适当的控制器头文件添加到项目中。
要使用32位浮点DCL函数,请包含文件DCLF32.h。

#include “DCLF32.h”

要使用定点CLA函数,包括文件DCLCLA.h。

#include “DCLCLA.h”
要使用双精度浮点DCL函数,包括文件DCLF64.h。
#include “DCLF64.h”

要使用任何非线性控制器,请包含文件DCL_NLPID.h。

#include “DCL_NLPID.h”

没有必要显式地包含公共库文件DCL.h,因为该文件包含在上面的控制器头文件中。CCS必须以这样一种方式配置,即DCL头文件对所有引用控制器变量或函数的程序源文件可见。CCS中的包含文件搜索选项允许用户为每个项目指定头文件路径。在CCS中,Include选项可以通过右键单击项目名称,选择
“属性”,然后导航到“包含选项”部分。

如果希望使用数据记录器、MLOG或TCM,还必须包含相应的头文件(注意,MLOG和TCM模块包含相关的数据日志头文件)。有关头文件依赖的更多信息,请参阅第2.2节。

2---步骤2。将源文件添加到项目中

        如果您希望使用任何程序集编码控制器,则必须将您希望使用的控制器的源文件添加到CCS项目中。您可以手动将这些文件复制到您的项目目录中,或者在CCS编译器选项中指定库路径名。有关控制器源文件的列表,请参见表9。只需要为您希望使用的那些函数添加源文件。

3---步骤3。在链接器命令文件中分配控制器功能

在FPU32或C28x内核上运行的DCL功能可以在链接器命令文件中分配到特定的内存块。通常将控制器功能放置在零等待状态的内部RAM中,因为这允许它们以设备的最大速度运行。注意,所有CLA函数必须从内部零等待状态RAM运行。
所有DCL库函数都放在用户定义的代码节.dclfuncs中。下面显示了一个示例,展示了如何将此部分映射到内部L4 RAM内存块。

dclfuncs : > RAML4, PAGE = 0

另请参阅链接器命令文件F28069_DCL。CMD在项目示例(第5章)。
在独立应用程序中,代码必须存储在非易失性存储器中(如内部闪存),并在运行时复制到RAM中。

4---步骤4。创建控制器实例

您必须声明希望使用的控制器的实例。例如,要创建一个名称为“pid1”的32位浮点PID控制器的初始化实例:

DCL_PID pid1 = PID_DEFAULTS;

此步骤将创建PID控制器结构的实例,其中的元素加载了文件DCLF32.h中指定的默认参数和数据值。
注意,CLA变量必须在运行时由用户代码初始化(也就是说,它们不能在变量声明时初始化)。这通常是使用单独的CLA任务完成的

5---第5步。创建支持结构的实例(可选)

如果您希望使用库中的错误检查或安全参数更新特性,则必须声明SPS和CSS子结构的实例,并对它们进行适当的初始化。如果您不希望使用这些功能,则可以忽略此步骤。
要为PID控制器声明一个初始化的SPS实例,您将执行以下操作:

DCL_PID_SPS spid = PID_SPS_DEFAULTS;

要为PID控制器声明CSS的初始化实例,您将执行以下操作:

DCL_CSS cpid = DCL_CSS_DEFAULTS;

将上述每个结构分配给步骤4中的PID控制结构。

pid1.sps = &spid; 
pid1.css = &cpid;

这将创建一个类型为“DCL_PID”的变量,其中的元素被初始化为DCL.h头文件中指定的默认值。像任何C变量一样,该结构必须对引用它的任何源文件可见。
使用控制器更新速率的函数要求预先加载CSS子结构的“T”元素。可以使用
DCL_SET_CONTROLLER_PERIOD宏。例如,100毫秒的更新周期将加载如下:

DCL_SET_CONTROLLER_PERIOD(pid1, 0.1f);

6---步骤6。声明变量

除了指向控制器结构的指针之外,每个DCL控制器函数都需要将某些输入变量作为参数传递给函数,并将返回一个控制输出。您应该在代码中声明这些变量的实例,并确保所有调用控制器函数的文件都可以引用它们。例如:

float uk; // control
float rk = 0.0f; // reference 
float yk = 0.0f; // feedback 
float lk = 1.0f; // saturation

注意,CLA变量不能在声明时初始化。有关如何初始化CLA变量的示例,请参阅第5章中的CLA代码。

7---步骤7。初始化控制器

(FPU32或C28x)控制器结构的元素在步骤3中初始化为默认设置。在调用函数之前,用户程序必须用特定的值配置任何控制器元素。例如:

pid1.Kp = 9.4f; // set proportional gain to 9.4 
pid1.Umax = 10.0f; // upper output clamp limit = 10

如果使用基于CLA的控制器,则必须始终使用单独的任务初始化其参数。有关clac编译器的更多信息,请参阅
《TMS320C28x优化C/ c++编译器用户指南》

直接形式控制结构包括一个或两个延迟线,保存以前的控制器数据。在调用控制器函数之前,这些参数必须初始化为零,这可以通过适当的“DCL_reset”函数来完成。如果不这样做,可能未初始化的延迟线数据,特别是在递归路径中,可能导致控制器饱和或提供不正确的结果。延迟线元件的初始化是用户的责任。参考本章示例1和示例2中的代码
4为延迟线初始化的例子

8---步骤8。调用控制器函数

通常,控制器功能将被插入到中断服务程序(ISR)中,该程序由硬件计时器触发。每个控制函数返回一个代表控制器输出的浮点变量。下面是一个FPU32控制器函数调用的示例。

uk = DCL_runPID_C1(&pid1, rk, yk lk);

从程序集调用标准库函数

DCL中的汇编代码函数被编写为可以从C程序调用。每个函数中的上下文保存和恢复部分只保护那些C环境尚未保护的核心寄存器。在必须从汇编程序中调用DCL控制器函数的应用程序中,用户必须在每个被调用函数的开始、结束附近放置额外的寄存器保存和恢复指令。对于C28x,有关寄存器使用和调用约定的详细信息,请参考《TMS320C28x优化C/ c++编译器用户指南》7.2节和7.3节。关于CLA,请参阅同一文档的10.2.4节。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值