This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我一直使用 TMS320F28335对负载电流进行闭环 PI 控制。为此我编写了一个代码、但我在 DCLF32.h 头文件中收到了错误消息。
我已附加了代码和错误消息。
请提供解决方案并 确认问题是否与代码或 DCL 标题 结构有关。
#include "DSP28x_Project.h"
//器件头文件和示例包括文件
#include "DCL.h"
#include "DSP2833x_Device.h"
#include "DSP2833x_examples.h"
#include "DSP2833x_GlobalPrototypes.h"
#include "DCLF32.h"
#include "dcl_fdlog.h"
//#include "DCLC28.h"
#include "math.h"
//
//函数原型
//
浮点 rk = 20.0f;
浮点 YK;
浮动 lk;
Float UK;
浮动负荷;
结构 DCL_PI pi1;
DCL_pi pi1 = pi_defaults;
//
//函数原型
//
UINT16循环计数;
UINT16转换计数;
void ADC_ISR (void);
void GPIO_select (void);
void InitAdc (void);
void InitEPwm1 (void);
void control_ISR (void);
浮点 DCL_runpi_c1 (DCL_pi *p、浮点 rk、浮点 Yk);
浮点电压1;
浮点 cmpa;
//
//主菜单
//
空 main (void)
{
InitSysCtrl();
Dint;
InitPieCtrl();
EALLOW;
#IF (CPU_FRQ_150MHz)//默认- 150 MHz SYSCLKOUT
//
// HSPCLK=SYSCLKOUT/2*ADC_MODCLK2=150/ 25.0 MHz
//
#define ADC_MODCLK 0x3
#endif
#IF (CPU_FRQ_100MHz)
//
// HSPCLK=SYSCLKOUT/2*ADC_MODCLK2=100/ 25.0 MHz
//
#define ADC_MODCLK 0x2
#endif
EDIS;
EALLOW;
SysCtrlRegs.HISPCP.ALL = ADC_MODCLK;
EDIS;
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;//需要执行此操作才能写入 EALLOW 保护的寄存器
PieVectTable.ADCINT =&ADC_ISR;
EDIS;//这是禁用对 EALLOW 保护寄存器的写入所必需的
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
InitAdc ();//在本示例中,初始化 ADC
//GPIO_select ();
// InitEPwm1();
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
IER |= M_INT1;
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
LoopCount = 0;
ConversionCount = 0;
/*初始化控制器变量*/
PI1.KP=2.0f;
pi1.ki=1.0f;
PI1.Umax=0.8f;
PI1.Umin=0.2f;
Rk = 20.0f;//控制参考的初始值
lk = 1.0f;//控制环路不饱和
//
//启用从 ePWM 到启动 SEQ1的 SOCA
//
//控制回路不饱和
AdcRegs.ADCMAXCONV.all = 0x0001;//在 SEQ1上设置2个转换
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3;//将 ADCINA3设置为第一次 SEQ1转换
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;//将 ADCINA2设置为第二个 SEQ1转换
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS)
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//在组上启用 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在向上计数时从 CPMA 中选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第1个事件时生成脉冲
EPwm1Regs.CMPA.half.CMPA = 1875;//设置比较 A 值
EPwm1Regs.TBPRD = 3750;//设置 ePWM1的周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//向上计数并开始
用于(;;)
{
LoopCount++;
}
}
//
// cpu_timer0_isr -
void GPIO_select ()
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//启用 GPIO0上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;//启用 GPIO0上的上拉
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// GPIO0 = PWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;// GPIO0 = PWM1B
EDIS;
}
void InitEPwm1()
{
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//递减计数
EPwm1Regs.TBPRD = 3750;//设置计时器周期
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBPHS.half.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x001;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = 000;
EPwm1Regs.TBCTL.bit.SYNCOSEL=1;
EPwm1Regs.CMPA.half.CMPA = 1875;//设置比较 A 值
EPwm1Regs.CMPB = 1875;//设置比较 B 值
EPwm1Regs.CMPCTL.bit.LOADAMODE=1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE=0;
/* EPwm1Regs.DBCTL.bit.out_mode=3;
EPwm1Regs.DBCTL.bit.POLSEL=2;
EPwm1Regs.DBCTL.bit.IN_MODE=0;
EPwm1Regs.DBRED=100;
EPwm1Regs.DBFED=100;*/
EPwm1Regs.AQCTLA.bit.ZRO=2;//在零上设置 PWM1A
EPwm1Regs.AQCTLA.bit.CAU=1;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//在组上启用 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 1;//在向上计数时从 CPMA 中选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第1个事件时生成脉冲
}
__interrupt void ADC_ISR (void)
{
YK=((int)AdcRegs.ADCRESULT0 >>4)*300.0f/4095.0f;
//Voltage2[ConversionCount]= AdcRegs.ADCRESULT1 >>4;
//DCL_runClamp_C1 (float *数据、float Umax、float Umin);
//
LK=0.0f;
UK = DCL_runpi_c1 (&pi1、rk、yk);
如果(英国>0.8f){
英国=0.8f;
}
否则为(UK<0.1f){
UK = 0.1f;
}
//Uk=0.5f;
EPwm1Regs.CMPA.half.CMPA =(EPwm1Regs.TBPRD)*UK;//设置比较 A 值
EPwm1Regs.CMPB = EPwm1Regs.TBPRD*UK;//设置比较 B 值
//如果记录了40个转换,则重新开始
//
//
//针对下一个 ADC 序列重新初始化
//
if (ConversionCount == 9)
{
ConversionCount = 0;
}
否则
{
ConversionCount++;
}
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除 INT SEQ1位
PieCtrlRegs.PIEACK.all = PIEACK_Group1;//确认到 PIE 的中断
返回;
}
错误:
>>编译失败
subdir_rules.mk:72:目标"example_2833xAdcend.obj"的配方失败
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第146行:错误:需要表达式
V = DCL_DISABLE_INT;
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第173行:错误:结构"DCL_CSS"没有字段"STS"
如果(p->Css->STS 和 STS_UPDATE_PLOADING)
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第173行:错误:需要表达式
如果(p->Css->STS 和 STS_UPDATE_PLOADING)
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第175行:错误:需要表达式
V = DCL_DISABLE_INT;
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第261行:错误:需要一个";"
{
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第323行:错误:需要";"
{
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第430行:错误:需要表达式
V = DCL_DISABLE_INT;
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第458行:错误:结构"DCL_Pi2"没有字段"CSS"
如果(p->Css->STS 和 STS_UPDATE_PLOADING)
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第458行:错误:预期的表达式
如果(p->Css->STS 和 STS_UPDATE_PLOADING)
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第460行:错误:需要表达式
V = DCL_DISABLE_INT;
^
^
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第555行:错误:需要表达式
V = DCL_DISABLE_INT;
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第568行:错误:结构"DCL_DF11"没有字段"CSS"
如果(p->Css->STS 和 STS_UPDATE_PLOADING)
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第568行:错误:预期表达式
如果(p->Css->STS 和 STS_UPDATE_PLOADING)
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第570行:错误:需要表达式
V = DCL_DISABLE_INT;
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第590行:错误:标识符"Bool"未定义
静态内联 bool DCL_isStableDF11 (DCL_DF11 *p)
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第641行:错误:结构"DCL_DF11"没有字段"CSS"
p->sps->b0 = KP *(Ki * p->Css->T + 2.0f)/ 2.0f;
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第642行:错误:结构"DCL_DF11"没有字段"CSS"
p->SPS->B1 = KP *(Ki * p->Css->T - 2.0f)/ 2.0f;
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第733行:错误:需要表达式
V = DCL_DISABLE_INT;
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第746行:错误:结构"DCL_DF13"没有字段"CSS"
如果(p->Css->STS 和 STS_UPDATE_PLOADING)
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第746行:错误:需要表达式
如果(p->Css->STS 和 STS_UPDATE_PLOADING)
^
"C:/ti/c2000/C2000Ware_4_03_00_00/libraries/control/DCL/c28/include/DCLF32.h "、
第748行:错误:需要表达式
V = DCL_DISABLE_INT;
^
编译"../Example_2833xAdc醋 c.c"时检测到21个错误。
gmake:***[Example_2833xAdcxyobj]错误1
gmake:由于错误、未重制目标"all"。
****构建完成****
尊敬的 Ayush:
只要包含了"DCL.h"、"DCLF32.h"中的这些错误就不应该存在、这似乎很奇怪、其中包含了"DCL.h"、并且默认情况下它包含在 DCLF32.h 中。
您能否 仔细检查 DCL.h 是否存在以及 DCL.h HAV 的内容是否未被调整?
谢谢。
王森
王森、您好!
是的、DCL.h 位于要求的位置。 我只对 DCL 文件中的 float32_t 替换为 float 进行了一次更改、因为之前的错误是 float32_t 变量未定义时出现的。
我检查了所有头文件、但没有找到变量 DCL_disable_ints、STS_update_pending、CSS 结构的定义。我们是否必须手动添加?
谢谢。此致、
Ayush
尊敬的 Ayush:
CSS strcts 和 DCL_disable_ints、STS_update_pending 都是 DCL.h 的一部分。 您可能不小心删除了代码的一部分。 您是否也可以尝试重新安装 C2000Ware、看看此问题是否仍然存在?
此致!
王森
王森、您好!
我已重新安装 c2000ware。先前的错误 已解决。但下面提到的新错误已出现:
>>编译失败
Makefile:146:目标"example_2833xAdc.Adb坐 标数据"的配方失败
警告:无法解析存档
C:/ti/c2000/C2000Ware_5_01_00_00/libraries/math/FPUfastRTS/c28/lib/rts2800_f
pu32_fast_补充.lib 添加到兼容库、因为没有输入文件
;需要从输入文件构建属性信息以
确定库兼容性
第一个引用的未定义
文件中的符号
---------------- ----------------
_DCL_runpi_c1 ./example_2833xAdcobj
错误:未解析的符号仍存在
错误:链接期间遇到错误;未生成"Example_2833xAdcend.out"
gmake:***[Example_2833xAdc阳 镇 OUT]错误1
gmake:由于错误、未重制目标"all"。
****构建完成****
此处、函数已在代码和头文件中定义。仍然出现错误。
尊敬的 Ayush:
DCL_runpi_c1是外部汇编函数、因此请确保将"DCL_pi_c1.asm"文件从 DCL 源文件夹(c2000ware/libraries/control/DCL/c28/source/)复制到您的 CCS 工程中。
对于 RTS 库、请尝试 改用 EABI 格式 的库、在 CCS 工程的属性中、点击"Build -> C2000 Linker -> File Search Path"、然后将名称"rts2800_fpu32_fast_补充.lib"修改为"rts2800_fpu32_fast_补充_eabi.lib"。 如果这不起作用、或者您使用的是 COFF 二进制格式、请改用"rts2800_fpu32_FAST_补充_coff.lib"。
此致!
王森