赞
踩
c2000数字控制库(DCL)为使用TI c2000单片机的数字控制应用程序开发人员提供了一套软件功能,当前为3.4版。全部库中的函数以C或汇编代码的形式提供。该库同时支持C28内核和CLA(需要调用不同的函数)。
该库的用户手册是[1]。
除了支持传统的PID形式外,还支持直接使用传函的ZPK3形式:
本文仅总结传统PI控制器,其他控制器未来有需要时再研究。
另外在[6]的相同路径下还提供了PI调试的帮助文档《PID Controller Tuning Guide》、《Nonlinear PID Controller Tuning Guide》。
函数的命名法则如图所示:
每个控制器结构包含两个32位指针,每个指针保存一个独立的支撑子结构。
第一个这样的子结构包含一个影子参数集(SPS),用户可以使用它在执行参数更新序列之前加载。在复制参数并重新启用它们之前,更新序列执行通过禁用中断,将SPS参数安全复制到主控制器结构中。不会使用部分更新的参数集运行,并允许在不干扰控制回路的情况下更改控制器参数,这确保了控制器的可靠性。
第二个子结构是公共支撑结构(CSS)。CSS包含用于错误检查和参数更新的支持数据。
SPS和CSS的使用是可选的,不需要该附加功能的用户可以安全地忽略这些结构。
该库包含测试所有直接形式补偿器稳定性的函数。稳定性由基于传递函数分母系数的极点位置确定。通用多项式稳定性函数可在库头文件DCL.h中找到,在一阶情况下,结论是不重要的。对于二阶和三阶补偿器,采用Jury阵列法。所有稳定性测试函数返回bool数据类型:如果所有补偿器极点位于单位圆内,则返回“真”,否则返回“假”。
手册中的这节详细对比了各个函数的执行速度和占用空间,所有测试都是在没有开启编译优化的条件下进行的。这里挑几个自己用的记录一下,其中FPU32就是传统的C28浮点内核。
函数 | 形式 | 语言 | CPU | Cycles | Size (W) |
---|---|---|---|---|---|
DCL_runPI_C3 | 并联 | inline C | FPU32 | 122 | 126 |
DCL_runPI_C4 | 并联 | 汇编 | FPU32 | 48 | 37 |
DCL_runPI_L2 | 并联 | 汇编 | CLA | 33 | 40 |
DCL_runPI_L4 | 并联 | inline C | CLA | 122 | 248 |
DCL_runPI_C5 | 并联 增强抗饱和 | 汇编 | FPU32 | 194 | 180 |
函数 | 形式 | 语言 | CPU | Cycles | Size (W) |
---|---|---|---|---|---|
DCL_runPI_C1 | 串联 | 汇编 | FPU32 | 52 | 54 |
DCL_runPI_C2 | 串联 | inline C | FPU32 | 117 | 121 |
DCL_runPI_L1 | 串联 | 汇编 | CLA | 34 | 42 |
DCL_runPI_L3 | 串联 | inline C | CLA | 118 | 238 |
DCL_runPI_C6 | 串联 Tustin积分 | inline C | FPU32 | 140 | 133 |
DCL_runPI_C7 | 串联 Tustin积分 | 汇编 | FPU32 | 51 | 40 |
DCL_runPI_L5 | 串联 Tustin积分 | inline C | CLA | 138 | 272 |
手册2.3节介绍了将DCL整合至现有工程的方法。
#include "DCLF32.h" // C28
#include "DCLCLA.h" // CLA
"DCL.h" // 这个文件需要包含到工作目录,会被上述两个头文件自动引用
介绍了如何在线安全的修改PI参数,需要用到前文提到的SPS和CSS指针。
库函数分成两个大类:parallel并联型和ideal型,ideal型也被称为串联型。
PI调节器的介绍在51页3.2节,均集成抗饱和和输出限幅功能。
与平时自己写的积分器不太相同的是,Ki=Kii*Tsc,也就是设计积分系数时需要将采样周期乘进去。
几个代码的区别:
后缀C3和C4的函数功能完全一致:C3是用C写的,只需要包含DCLF32.h头文件就可以;C4是用汇编写的,需要复制一个汇编文件到工程。
适用于CLA的代码同理,L2是用汇编写的,L4是用C写的。
C5并联形式PI控制器包含增强型抗饱和复位逻辑,允许积分路径从饱和状态恢复,即使比例增益为零。
C6、C7和L5控制器将串联形式的PI与Tustin积分器相结合。这种配置最适合于基于高频环路增益和零频率选择控制器增益的应用,因为Kp和Ki在串联形式的控制器中有效地解耦。此外,Tustin积分器在低于奈奎斯特极限的所有频率下都有固定的90度相位滞后,简化了补偿器的设计。
在手册的141页第5章提供了很多示例,使用的DSP是28069,移植到其他芯片上也很简单。这里记录一个典型的示例。
这个例子演示了在CLA上运行PI控制器的一种方法。CPU程序包含一个ISR,该ISR由转换的ADC的end-of-conversion (EOC)触发。反馈数据从C28x CPU上的ISR中从ADC读取,并使用位于CPU-to-CLA message RAM中的变量(yk)和给定参考(rk)传递给CLA。ISR将ADC结果转换为有符号浮点格式,然后在CLA上触发任务3并等待其完成。
CLA task 3调用函数DCL_runPI_L1(),该函数使用汇编函数中的PI控制器,存储在位于CLA-to-CPU message RAM的uk中。
一个典型的PI控制器结构体如下:
//! \brief Defines the DCL_PI_CLA controller structure //! typedef volatile struct { float32_t Kp; //!< Proportional gain 比例增益 float32_t Ki; //!< Integral gain 积分增益 float32_t i10; //!< I storage 存储积分值 float32_t Umax; //!< Upper control saturation limit 控制器输出上限 float32_t Umin; //!< Lower control saturation limit 控制器输出下限 float32_t i6; //!< Saturation storage 饱和标志位,不饱和为1 float32_t i11; //!< I storage float32_t Imax; //!< Upper integrator saturation limit 积分上限 float32_t Imin; //!< Lower integrator saturation limit 积分下限 } DCL_PI_CLA; //! \brief Defines the DCL_PI controller structure //! typedef volatile struct dcl_pi { float32_t Kp; //!< Proportional gain float32_t Ki; //!< Integral gain float32_t i10; //!< I storage float32_t Umax; //!< Upper control saturation limit float32_t Umin; //!< Lower control saturation limit float32_t i6; //!< Saturation storage float32_t i11; //!< I storage float32_t Imax; //!< Upper integrator saturation limit float32_t Imin; //!< Lower integrator saturation limit DCL_PI_SPS *sps; //!< Pointer to the shadow parameter set DCL_CSS *css; //!< Pointer to the common support structure } DCL_PI;
//! \brief Executes a parallel form PI controller on the FPU32 //! Implemented as inline C function //! \param[in] p Pointer to the DCL_PI structure //! \param[in] rk The controller set-point reference //! \param[in] yk The measured feedback value //! \return The control effort //! static inline float32_t DCL_runPI_C3(DCL_PI *p, float32_t rk, float32_t yk) { float32_t v1, v2, v4, v5, v9; v1 = rk - yk; v2 = p->Kp * v1; v4 = (v1 * p->Ki * p->i6) + p->i10; p->i10 = v4; v5 = v2 + v4; v9 = (v5 > p->Umax) ? p->Umax : v5; v9 = (v9 < p->Umin) ? p->Umin : v9; p->i6 = (v5 == v9) ? 1.0f : 0.0f; #ifdef DCL_TESTPOINTS_ENABLED p->css->tpt = v5; #endif return(v9); }
//! \brief Executes an inline series form PI controller on the FPU32 //! \param[in] p Pointer to the DCL_PI structure //! \param[in] rk The controller set-point reference //! \param[in] yk The measured feedback value //! \return The control effort //! static inline float32_t DCL_runPI_C2(DCL_PI *p, float32_t rk, float32_t yk) { float32_t v2, v4, v5, v9; v2 = p->Kp * (rk - yk); v4 = p->i10 + (p->Ki * p->i6 * v2); v5 = v2 + v4; v9 = (v5 > p->Umax) ? p->Umax : v5; v9 = (v9 < p->Umin) ? p->Umin : v9; p->i10 = v4; p->i6 = (v5 == v9) ? 1.0f : 0.0f; #ifdef DCL_TESTPOINTS_ENABLED p->css->tpt = v5; #endif return(v9); }
其实就是梯形积分,注意相比于前面的普通积分,这里等效的Ki参数是这样的:Ki = Kii * Tsc * 0.5
//! \brief Executes a series form PI controller with Tustin integrator //! on the FPU32. //! \param[in] p Pointer to the DCL_PI structure //! \param[in] rk The controller set-point reference //! \param[in] yk The measured feedback value //! \return The control effort //! static inline float32_t DCL_runPI_C6(DCL_PI *p, float32_t rk, float32_t yk) { float32_t v2, v4, v5, v8, v9; v2 = (rk - yk) * p->Kp; v8 = v2 * p->Ki * p->i6; v4 = v8 + p->i11 + p->i10; v5 = v2 + v4; p->i10 = v4; p->i11 = v8; v9 = (v5 > p->Umax) ? p->Umax : v5; v9 = (v9 < p->Umin) ? p->Umin : v9; p->i6 = (v5 == v9) ? 1.0f : 0.0f; #ifdef DCL_TESTPOINTS_ENABLED p->css->tpt = v4; #endif return(v9); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。