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.

[参考译文] CCS/TMDSDOCK28335:如何确认 DF22控制器与 TMDSDOCK28335配合工作正常?

Guru**** 2563960 points
Other Parts Discussed in Thread: SFRA, C2000WARE, CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/712295/ccs-tmdsdock28335-how-to-confirm-that-df22-controller-is-working-fine-with-tmdsdock28335

器件型号:TMDSDOCK28335
Thread 中讨论的其他器件:SFRAC2000WAREcontrolSUITE

工具/软件:Code Composer Studio

主席先生,

我已经计算了升压转换器的受控体传递函数、并且还使用 MATLAB 中的 SISO 工具为其设计了一个2类补偿器。 然后我使用......将传输函数从 s 域转换为 z 域 方法并获得系数、还可 通过 DF22控制器在 CCS 中实现。  

无论如何、请建议我检查此控制器的性能。

此致、

Soumya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Soumya、

    有几种方法可以实现这一目的。 但是、DCL 或 TI 的其他地方没有预先配置任何内容、因此您需要做一些工作。

    假设您的原始设计规格位于频域中(例如极点-零点频率)、并且您有一个实际的物理设备(即您不仅要对其进行仿真)、最好的方法是连接控制器并测量实际的频率响应。 您可以连接单独的频率分析器仪器、也可以使用数字电源 SDK 中的 SFRA 实用程序、无需任何外部测试设备即可实现此目的。 它将以波特图的形式测量受控体、开环和闭环频率响应。 然后、您可以将结果曲线与原始仿真进行比较、以确认您获得了预期结果。

    如果您没有物理受控体但有受控体模型、一种方法是在 Simulink 中运行瞬态响应测试、捕获控制器输入和输出数据、然后通过器件上的控制器运行这些数据、并与原始仿真进行比较。 这将显示器件上的控制器的运行方式与仿真的运行方式完全相同。 它很复杂、但您可以使用 DCLv3中的 Simulink PID 示例作为起点。 由于您已经使用了 SISOtool、我假设您熟悉并可以访问 Simulink。

    您可以在以下位置找到 Matlab 文件"pid_example.m":
    C:\ti\c2000Ware_1_00_05_00\libraries\control\DCL\c28\models
    您可以修改此示例以使用 DF22控制器和您自己的工厂。 从 PID 模型中打开 DCL Simulink 块集(同一目录中的 DCL.slx)。 找到 DF22_C1块并将其添加到模型中。 删除 PID 块并将 DF22控制器插入其位置。 您将 e (k)输入连接到进入"fericr"变量的行。 双击 DF22控制器块并键入您的系数。 使用您自己的模型修改受控体模型-传输函数位于文件"pid_config.m"中、当您运行模型时会打开该文件。 在"pid_example.m"中、您需要修改第66行以捕获"铁镜像"、而不是"输入"。 根据您的系统、您可能还需要进行其他更改。

    成功运行模型并获得预期结果后、您将在上面的目录中找到名为"pid_input.dAT"的文件。 这是进入控制器的数据流。 您可以在 DCL 的 DF22示例中直接使用它来代替"DF22_edata.dAT"。 到目前为止、您已经修改了该代码以在 F28335上运行、因此只需按照 DCL 用户指南(第126页)中的说明将.dat 文件加载到"eBuf"中并运行该代码。 然后、您可以将控制器输出数据缓冲器(u1k 或 u2k)复制到另一个数据文件中(在 CCS 中、"Tools -> Save memory...") 您可以将其导入 Matlab 工作区并与仿真中的"fcontrol"进行比较。

    这只是我的建议、您需要详细了解。 或者、您可能更喜欢创建新模型、而不是将 PID 示例用作模板。 由你决定。

    但愿这对您有所帮助。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    主席先生,
    实际上、我将升压转换器作为我的受控体、并为其闭环运行设计了2类补偿器。 但现在我对如何将输入数据提供给控制器(DF22)感到困惑。
    我必须将其输入主程序还是子例程 void ADC_ISR (void)中?

    在 DF22示例中、它刚刚采用了默认值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Soumya、

    对 DCL_runDF22的调用在 ISR 中发生、因此以控制循环速率发生、但您可以在主程序中定义和修改 rk。  通常、这就是我们要做的事情。

    对于电压模式升压转换器、控制环路仅具有级联连接中的控制器(请参阅随附的 C2000双向直流/直流套件文档)。  在 ADC ISR 代码中、您将读取 ADC (附件中的 Vhv_fb)、转换为浮点、从基准中减去、然后将其传递到 DF22控制器。  如下所示:

    YK=((浮点) AdcRegs.ADCRESULT0)/4096.0f;

    EK = rk - YK;

    UK = DCL_runDF22_C1 (&controller1、EK);

    此致、

    Richard

    e2e.ti.com/.../User_5F00_Guide_5F00_v1.0-48.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    主席先生,
    我已经完成了上述程序。
    但我对它的实现还是有点困惑。
    这是我的中断 void ADC_ISR (void)代码。

    _interrupt void ADC_ISR (void)

    /*.................................. 控制块.......................... *
    ADC_OUT=(AdcRegs.ADCRESULT0 >>4)/4096.0f;
    YK=(float) ADC_out;
    float rk= 12.5f/4096f;
    EK-rk-YK;
    u1k = DCL_runDF22_C1 (&controller1、EK);
    out = int (u1k);




    //清除计时器标志&确认中断
    CpuTimer0Regs.TCR.bit.TIF = 1;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

    //读取数据并运行控制器
    if (eBuf.dptr < eBuf.lptr)

    //读取输入数据
    EK = DCL_readLog (&eBuf);

    //运行完整的控制器
    u1k = DCL_runDF22_C1 (&controller1、EK);

    //运行预计算的控制器
    u2k = DCL_runDF22_C2 (&controller2、EK);
    V = DCL_runClamp_C1 (&u2k、upperLim、lowerLim);
    如果(0 == v)

    DCL_runDF22_C3 (&controller2、EK、u2k);


    //计算差异
    dk = u1k - u2k;

    //存储结果
    DCL_writeLog (&u1Buf、u1k);
    DCL_writeLog (&u2Buf、u2k);
    DCL_writeLog (&dBuf、dk);

    其他

    //在此处放置断点
    asm (" NOP");


    IsrCount++;


    if (IdleLoopCount=0)

    if (v == data_length)

    V = 0;
    IdleLoopCount=1;

    其他

    vadc =(AdcRegs.ADCRESULT0>>4);
    e_array[v]= vadc;
    V++;



    //为下一个 ADC 序列重新初始化
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断


    返回;


    请检查代码一次。

    此致、
    Soumya。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Soumya、

    您似乎已经在这个 ISR 顶部附近放置了与我建议的代码类似的代码、但更进一步的是其他代码、它看起来像 DCL 示例、并且看起来正在执行类似的操作(无论如何、u1k 会被覆盖)。

    我希望您将自己的代码放入 ISR 中。 除非您想并行运行 DCL 示例、否则您不需要在...

    //读取数据并运行控制器
    ...和...
    //为下一个 ADC 序列重新初始化

    这就是您的代码所在的位置。 您能稍微介绍一下令人困惑的内容吗?

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    主席先生,

    我尝试在闭环电压控制模式下运行升压转换器。 此外、我已经成功地在 MATLAB 中仿真并运行模型。

    现在、我已经在 条件循环中编写了您之前建议的代码。 但 EPwm2端口上仍然没有输出。

    此外、我随附了最终代码。  

    //######################################################################################################################
    //$TI 发布:F2833x/F2823x 头文件和外设示例 V142 $
    //$发布 日期:2016年11月1日$
    //$版权:版权所有(C) 2007-2016德州仪器(TI)公司-
    //             http://www.ti.com/ 保留所有权利$
    //############################################################################################################
    
    #include "DSP28x_Project.h" //设备头文件和示例包括文件
    #include "DCL.h"
    //#include "F2833x_Device.h"
    //#include "F2833x_examples.h"
    //#include "F2833x_GlobalPrototypes.h"
    #include "DCLF32.h"
    #include "DCL_fdlog.h"
    
    //原型文件中找到的函数。
    _interrupt void ADC_ISR (void);
    void InitEPwm2Example (void);
    #define EPWM1_TIMER_TBPRD 1500 //周期寄存
    器#define EPWM1_CMPA 1050
    //input data
    #define DATA_LENG_DEFAULTS;
    
    
    
    
    //完整控制器结果
    #pragma DATA_SECTION (U1_array、"QDataLogSection") float e_array[DATA_LENG];FDLOG eBuf = FDLOG_DEFAULTS;//完整控制器结果#pragma DATA_SECTION (U1_DATA
    
    
    
    
    );float_OUT_RATION_OUT_DATA_SECTION
    
    
    
    
    = FAULT_AULT_AULT_AULT_AULT_AULT_AULT_SECTION;
    
    FDLOG dBuf = FDLOG_DEFAULTS;
    
    // extern 中断 void CONTROL_ISR (void);
    __interrupt void ADC_ISR (void);
    //全局变量
    long IdleLoopCount = 0;
    long IsrCount = 0;
    float u1k;
    float u2k;
    float Udk;
    upperLim;
    float lowerLim;
    uint16_t v;
    DCL_DF22
    
    
    
    
    
    
    
    
    控制器1 = DF22_DEFAULTS;DCL_DF22控制器2 = DF22_DEFAULTS;int vadc=0;FDLOG eBUf = FDLOG_DEFAULTS;int out=0;//本示例中使用的全局变量:// uint16 Conversionc=0;float = 1.40f
    
    
    (rf);(float)(r16f = 1.40f);(rf)/float = 1.40f)。 初始化系统控制:
    // PLL、看门狗、启用外设时钟
    //此示例函数位于 DSP2833x_sysctrl.c 文件中。
    
    InitSysCtrl();
    DINT;
    InitEPwm2Gpio();
    /* ADC_BLOCK .................. */
    EALLOW;
    #IF (CPU_FRQ_150MHz) //默认- 150MHz SYSCLKOUT
    #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0MHz
    #endif
    (CPU_FRQ_100MHz)
    #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)= 25.0MHz
    #endif
    EDIS;
    
    //定义 ADCCLK 时钟频率(小于或等于25MHz)
    //假设 InitSysCtrl()已将 SYSCLKOUT_MOCLK
    
    设置为150MHz; //高速外设时钟设置为25MHz
    EDIS;
    
    //步骤2。 初始化 GPIO:
    //此示例函数位于 DSP2833x_GPIO.c 文件中,
    //说明了如何将 GPIO 设置为其默认状态。
    // InitGpio();//跳过此示例
    
    //步骤3。 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    
    
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态是禁用所有 PIE 中断并
    清除标志//。
    //此函数位于 DSP2833x_PIECTRL.c 文件中。
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
    EDIS;
    InitEPwm2Examples();
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;
    
    InitPieCtrl();
    
    //禁用 CPU 中断并清除所有 CPU 中断标志:
    IER = 0x0000;
    IFR = 0x0000;
    
    //使用指向 shell 中断
    //服务例程(ISR)的指针初始化 PIE 矢量表。
    //这将填充整个表,即使在
    本示例中未使用中断//也是如此。 这对于调试很有用。
    //可以在 DSP2833x_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 DSP2833x_PieVect.c 中找到
    InitPieVectTable();
    
    //此示例中使用的中断被重新映射到
    这个文件中的// ISR 函数。
    EALLOW;//这是写入 EALLOW 受保护寄存
    器 PieVectTable.ADCINT =&ADC_ISR;
    PieVectTable.TINT0 =&ADC_ISR;
    EDIS;//这是禁用写入 EALLOW 受保护寄存器
    
    所必需的//步骤4。 初始化所有器件外设:
    //此函数可在 DSP2833x_InitPeripherals.c
    中找到// InitPeripherals ();//此示例
    InitAdc ()不需要;//对于此示例,初始化 ADC
    
    //步骤5。 特定于用户的代码、启用中断:
    
    //在 PIE
    PieCtrlRegs.PIEIER1.bit.INTx6中启用 ADCINT = 1;
    IER |= M_INT1;//启用 CPU 中断1
    EINT; //启用全局中断 INTM
    ERTM; //启用全局实时中断 DBGM
    v = 0;
    //配置 ADC
    AdcRegs.ADCTRL1.bit.ACQ_PS = 0x2;
    AdcRegs.ADCTRL1.bit.CPS = 0x1;
    //AdcRegs.ADCTRL3.bit.ADCCLKPS= 0x1;
    AdcRegs.ADCMAX0000 = 0x0000;全部; //在 SEQ1
    AdcRegs.ADCCHSELSEQ1.bit.CONV00上设置2 conv = 0x0;//将 ADCINA0设置为第一个 SEQ1转换器
    //AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;//将 ADCINA1设置为第2个 SEQ1转换器
    AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从 ePWM 启用 SOCA 以启动 SEQ1
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS) AdcRegs.ADCTRL3.bit.SMODE_SEQ1 = 1;//
    
    
    假设已启用 eETQ1
    中断(每个 EOS = 1);AdcRegs.ADCTRL3.bit.SMODE_EN.USTRL = 1;//已启用 eUSTREN.USTRL = 1;eUSTREMP.ETRL = 1;eEN.EN.USTRL //在组
    EPwm1Regs.ETSEL.bit.SOCASEL = 2上启用 SOC; //从 CPMA 中选择 SOC,向上计数
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在第一个事件
    EPwm1Regs.CMPA.half.CMPA = 0x08FF 时生成脉冲; //设置比较 A 值
    EPwm1Regs.TBPRD = 0x0FFF; //为 ePWM1
    EPwm1Regs.TBCTL.bit.SYNCOSEL 设置周期= 0x01;
    EPwm1Regs.TBCTL.bit.CTRMODE = 0; //递增计数并开始
    
    //等待 ADC 中断
    /* for (;)
    {
    
    }*/
    *.......... 控制器部分................... //
    
    配置 CPU 定时器0
    InitCpuTimer();
    ConfigCpuTimer (&CpuTimer0、90.0、1.0e+03);
    
    //初始化数据数组
    DCL_initLog (&eBuf、e_array、data_length);
    DCL_initLog (&u1Buf、U1_array、data_length);
    DCL_initLog (&u2Buf、U2_array、data_length);
    DCL_initLog (&dBuf、d_array、data_length);
    DCL_clearLog (&u1Buf);
    DCL_clearLog (&u2Buf);
    DCL_fillLog (&dBuf、1.234567f);
    
    //初始化完整的控制器
    Controller1.A1 =-0.5075f;
    Controller1.A2 =-0.4925f;
    Controller1.b0 = 0.01614f;
    Controller1.B1 = 3.84e-5F;
    Controller1.B2 =-0.0161f;
    
    //初始化预计算控制器
    controller2.A1 = controller1.A1;
    controller2.A2 = controller1.A2;
    controller2.b0 = controller1.b0;
    controller2.b1 = controller1.b1;
    controller2.b2= controller1.b2;
    
    //钳位限制
    upLIM = 1000.0f;
    LIM 下限=-1000.0f;
    
    //启用中断
    PieCtrlRegs.PIEIER1.bit.INTx7=1;
    IER |= M_INT1;
    EINT;
    StartCpuTimer0();
    
    //空闲循环
    while (1)
    {
    IdleLoopCount++;
    }
    
    }// main
    
    
    
    __interrupt void ADC_ISR (void)结束
    {
    /*.................................. 控制块.......................... *
    
    
    //清除计时器标志&确认中断
    CpuTimer0Regs.TCR.bit.TIF = 1;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
    
    //读取数据并运行控制器
    if (eBuf.dptr < eBuf.lptr)
    {
    //读取输入数据
    YK=((浮点) AdcRegs.ADCRESULT0)/4096.0f;
    
    EK = rk - YK;
    //运行完整的控制器
    u1k = DCL_runDF22_C1 (&controller1、EK);
    OUT =(int) u1k;
    EPwm2Regs.CMPA.half.CMPA = u1k * 4096.0f;
    
    //运行预计算的控制器
    u2k = DCL_runDF22_C2 (&controller2、EK);
    V = DCL_runClamp_C1 (&u2k、upperLim、lowerLim);
    如果(0 == v)
    {
    DCL_runDF22_C3 (&controller2、EK、u2k);
    }
    
    //计算差异
    dk = u1k - u2k;
    
    //存储结果
    DCL_writeLog (&u1Buf、u1k);
    DCL_writeLog (&u2Buf、u2k);
    DCL_writeLog (&dBuf、dk);
    }
    其他
    {
    //在此处放置断点
    asm (" NOP");
    }
    
    IsrCount++;
    
    
    if (IdleLoopCount=0){
    if (v =data_length)
    {
    V = 0;
    IdleLoopCount=1;
    }
    否则
    {
    vadc =(AdcRegs.ADCRESULT0>>4)/4096.0f;
    // IADC =~(AdcRegs.ADCRESULT1 >>4)- 3478)+1;
    e_array[v]= vadc;
    // adc_val2[ConversionCount]= IADC;
    V++;
    
    }
    
    }
    //重新初始化下一个 ADC 序列
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位
    PieCtrlRegs.PIEACK.all = PIEACK_Group1;//确认到 PIE
    返回的中断;
    }
    
    void InitEPwm2Examples()
    {
    //设置 TBCLK
    EPwm2Regs.TBPRD = 0x0FFF; //设置定时器周期801 TBCLK
    EPwm2Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0
    EPwm2Regs.TBCTR = 0x0000; //清除计数
    
    器//设置比较值
    EPwm2Regs.CMPA.half.CMPA = vadc * 4096.0f; //设置比较旧数据1953
    EPwm2Regs.CMPB = EPWM1_CMPA; //设置比较 B 值
    
    //设置计数器模式
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数 n 向下计数
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //时钟与 SYSCLKOUT
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    EPwm2Regs.TBCTL.bit.SYNCOSEL = 0x00;
    
    //设置重影
    EPwm2Regs.CMCTL.bit.EPTL.ADCMOREG= CC_ZERO;
    EPwCMOCC.ADDR.ADCMTL.ADCMTL.R0_ADCMTL.ADCMTL.ADDR.CLK = 0_ADCMTL.ADCMTL.ADCMTL.ADDR.AM_ADCMTL.RCODE=OCC_MOTL.RTO.R0_ADCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.RCMTL.
    
    
    
    
    
    //在事件 A 上设置 PWM1A、向上计数
    EPwm2Regs.AQCTLA.bit.CAD = AQ_SET; //在事件 A 上清除 PWM1A,倒计数
    } 

    请帮我解决问题、哪里出了问题?

    N.B:-当我在无限循环中注释时,显示了一条名为“无法到达语句 InitCpuTimer();”的警告。

    此致、

    Soumya。

    //###################################################################################################################### //描述//! 添加到组 F2833x_example_list//!

    ADC 转换开始(ADC_SoC)

    //!//! 此 ADC 示例使用 ePWM1在 SEQ1上生成周期性 ADC SOC。//! 两个通道被转换为 ADCINA3和 ADCINA2。//!//! b 监视\b 变量\n//! - Voltage1[10] -最后10个 ADCRESULT0值//! - Voltage2[10] -最后10个 ADCRESULT1值//! - ConversionCount  -当前结果编号0-9//! -循环计数   -空闲循环计数器////// ###################################################################################################################### //$TI 发布:F2833x/F2823x 头文件和外设示例 V142 $//$发布 日期: 2016年11月1日$//版权所有:版权所有(C) 2007-2016德州仪器(TI)公司-//        http://www.ti.com/ 保留所有权利://######################################################################################################
    #include "DSP28x_Project.h"   //器件头文件和示例包括文件#include "DCL.h"/#include "F2833x_Device.h"/#include "F2833x_examples.h"/#include "F2833x_GlobalPrototypes.h"#include "DCLF32.dcl"包含"dcl"
    //此文件中找到的函数的原型语句。__interrupt void ADC_ISR (void); void InitEPwm2Example (void);#define EPWM1_TIMER_TBPRD 1500 //周期寄存器#define EPWM1_CMPA   //输入数据#define DATA_LENGTH 1601#define DATA_SECTION (e_array、"PMG_DEFAULT_DLF1050];#define DATA_RATION_DLOGY = FLENG_LENG[FAST]
    //完整控制器结果#pragma DATA_SECTION (U1_array、"QDataLogSection") float U1_array[data_length];FDLOG u1Buf = FDLOG_DEFAULTS;
    //预计算的控制器结果#pragma DATA_SECTION (U2_array、"RDataLogSection") float U2_array[DATA_LENG];FDLOG u2Buf = FDLOG_DEFAULTS;
    //控制器差异 DATA#pragma DATA_SECTION (d_array、"SDataLogSection") float d_array[data_length];FDLOG dBuf = FDLOG_DEFAULTS;
    // extern interrupt void CONTROL_ISR (void);__interrupt void ADC_ISR (void);//全局 变量 long IdleLoopCount = 0;long IsrCount = 0;float u1k;float u2k;float lim;float lowerfloat DFLIM;uint16_t v;DCL_DF22 controller1 = 0;float UD20/ 默认值= 0;df = 0;df1;df1;df1 = 0;df1;df1;f1 = 0;df1;f1;f1 = 0;fu2;fu2;fu2;fu2;fu2;fu1;fu2;fu2;fu2;fu2;fu2;fu2;fu2;fu2 初始化系统控制:// PLL、看门狗、启用外设时钟//此示例函数位于 DSP2833x_sysctrl.c 文件中。
      InitSysCtrl();  DINT;  InitEPwm2Gpio();  /*.......................... ADC_BLOCK .................. */  EALLOW;  #IF (CPU_FRQ_150MHz)   //默认- 150MHz SYSCLKOUT   #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2 CL3)  = 25.0MHz  #endif  (CPU_2*ADC_MODCLK=0x100MHz         )#MODCLK=2
      //定义 ADCCLK 时钟频率(小于或等于25MHz)  //假设 InitSysCtrl()已将 SYSCLKOUT 设置为150MHz  EALLOW;  SysCtrlRegs.HISPCP。all = ADC_MODCLK;//高速外设时钟设置为25MHz  EDIS;
    //步骤2. 初始化 GPIO://此示例函数位于 DSP2833x_GPIO.c 文件中,//说明如何将 GPIO 设置为其默认状态。// InitGpio (); //针对此示例跳过
    //步骤3. 清除所有中断并初始化 PIE 矢量表://禁用 CPU 中断

    //将 PIE 控制寄存器初始化为默认状态。//默认状态是禁用所有 PIE 中断并清除标志//。//此函数位于 DSP2833x_PIECTRL.c 文件中。   EALLOW;    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;   EDIS;       InitEPwm2Examples();     EALLOW;    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;  EDIS;
      InitPieCtrl();
    //禁用 CPU 中断并清除所有 CPU 中断标志:  IER = 0x0000;  IFR = 0x0000;
    //使用指向 shell 中断//服务例程(service routines,ISR)的指针初始化 PIE 矢量表。//这将填充整个表,即使在本示例中未使用中断//也是如此。  这对于调试很有用。// shell ISR 例程位于 DSP2833x_DefaultIsr.c.//此函数位于 DSP2833x_PieVect.c   InitPieVectTable();
    //此示例中使用的中断被重新映射到//此文件中的 ISR 函数。   EALLOW; //这是写入 EALLOW 受保护寄存  器 PieVectTable.ADCINT =&ADC_ISR;  PieVectTable.TINT0 =&ADC_ISR;  EDIS;  //这是禁用写入 EALLOW 受保护寄存器所必需的
    //步骤4. 初始化所有器件外设://此函数可在 DSP2833x_InitPeripherals.c// InitPeripherals ()中找到;//此示例  InitAdc ()不需要; //对于此示例,初始化 ADC
    //步骤5. 特定于用户的代码、启用中断:
    //在 PIE  PieCtrlRegs.PIEIER1.bit.INTx6中启用 ADCINT = 1;  IER |= M_INT1;//启用 CPU 中断1  EINT;      //启用全局中断 INTM  ERTM;      //启用全局实时中断 DBGM  v = 0; //配置 ADC  AdcRegs.ADCTRL1.bit.ACQ_PS = 0x2;  AdcRegs.ADCTRL1.bit.CPS = 0x1;  //AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x1;AdcRegs.ADCAL1.bit.ADCSEQ1      = 0x1  ;ADCREGs.ADC0000.ADCSEQ1 = 0x1;ADCONSEV/ ADC0 = ADCSEQ1 = 0x1;ADC0 = ADCONSEQ1 = ADC0 = ADC0。ADCCONV.ENCOM.Q1 = 0x1。ADCSEQ1 = ADCSEQ1 = ADC000/ ADCONSEQ1 = AD   //AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;//将 ADCINA1设置为第2个 SEQ1转换器   AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从 ePWM 启用 SOCA 以启动 SEQ1  AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //启用 SEQ1中断(每个 EOS)  AdcRegs.ADCTRL3.bit.SMODE_SEL = 1;
    //假设 ePWM1时钟已在 InitSysCtrl()中启用;  EPwm1Regs.ETSEL.bit.SOCAEN = 1;     //在组  EPwm1Regs.ETSEL.bit.SOCASEL = 2上启用 SOC;    //从 CPMA 中选择 SOC 在向上计数  EPwm1Regs.ETPS.bit.SOCAPRD = 1上;     //在第一个事件  EPwm1Regs.CMPA.half.CMPA = 0x08FF 时生成脉冲;   //设置比较值  EPwm1Regs.TBPRD = 0x0FFF;        //为 ePWM1  EPwm1Regs.TBCTL.bit.SYNCOSEL 设置周期= 0x01;  EPwm1Regs.TBCTL.bit.CTRMODE = 0;    //向上计数并启动
    //等待 ADC 中断 /* for (;)  {
      }*/  /*…………………………… 控制器部分................... *
      //配置 CPU 定时器0  InitCpuTimer();  ConfigCpuTimer(&CpuTimer0、90.0、1.0e+03);
      //初始化数据数组  DCL_initLog (&eBuf、e_array、data_length);  DCL_initLog (&u1Buf、U1_array、 data_length);  DCL_initLog (&u2Buf、U2_array、data_length);  DCL_initLog (&dBuf、 d_array、data_length);  DCL_clearLog (&u1Buf);  DCL_clearLog (&u2Buf);  DCL_fillLog (&dBuf、 1.234567f);
      //初始化完整的控制  器1.A1 =-0.5075f;  控制器1.A2 =-0.4925f;  控制器1.b0 = 0.01614f;  控制器1.b1 = 3.84e-5F;  控制器1.b2 =-0.0161f;
      //初始化预计算控制  器 controller2.A1 = controller1.A1;  controller2.A2 = controller1.A2;  controller2.b0 = controller1.b0;  controller2.b1 = controller1.b1;controller2.b2  = controller1.b2;
      //钳位限制  upperLim = 1000.0f;  lowerLim =-1000.0f;
      //启用中断  PieCtrlRegs.PIEIER1.bit.INTx7 = 1;  IER |= M_INT1;  EINT;  StartCpuTimer0 ();
      //空闲循环  while (1)  {     IdleLoopCount++;  }
    }// main 结束


    _interrupt void ADC_ISR (void){   /*.................................. 控制块.......................... *

      //清除计时器标志&确认中断     CpuTimer0Regs.TCR.bit.TIF = 1;     PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
        //读取数据并运行控制器     if (eBuf.dptr < eBuf.lptr)     {       //读取输入数据        YK=((浮点) AdcRegs.ADCRESULT0)/4096.0f;
            EK = rk - YK;       //运行完整的控制器       u1k = DCL_runDF22_C1 (&controller1、EK);       OUT =(int) u1k;       EPwm2Regs.CMPA.half.CMPA = u1k * 4096.0f;
          //运行预计算的控制器       u2k = DCL_runDF22_C2 (&controller2、EK);       V = DCL_runClamp_C1 (&u2k、upperLim、lowerLim);       如果(0 == v)       {         DCL_runDF22_C3 (&controller2、EK、u2k);      }
          //计算差异       dk = u1k - u2k;
          //存储结果       DCL_writeLog (&u1Buf、u1k);       DCL_writeLog (&u2Buf、u2k);       DCL_writeLog (&dBuf、dk);    }     其他     {       //在此处放置断点       asm (" NOP");    }
        IsrCount++;

     if (IdleLoopCount=0){ if (v == data_length) {   v =0;   IdleLoopCount=1; } 否则 {   vadc =(AdcRegs.ADCRESULT0 >>4)/4096.0f; //  IADC =~((AdcRegs.ADCRESULT1 >>>>3478      );v=v4+adc+数组   ;v=v3478
     }
     } //重新初始化下一个 ADC 序列 AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;      //重置 SEQ1 AdcRegs.ADCST.BIT.INT_SEQ1_CLR = 1;    //清除 INT SEQ1位 PieCtrlRegs.PIEACK.all = PIEACK_Group1;  //确认 PIE 返回中断;}
     void InitEPwm2Examples(){  //设置 TBCLK  EPwm2Regs.TBPRD = 0x0FFF;       //设置定时器周期801 TBCLK  EPwm2Regs.TBPHS.Half.TBPHS = 0x0000;       //相位为0  EPwm2Regs.TBCTR = 0x0000;            //清除计数器
      //设置比较值  EPwm2Regs.CMPA.half.CMPA = vadc * 4096.0f;   //设置比较 A 值旧数据1953  EPwm2Regs.CMPB = EPWM1_CMPA;         //设置比较 B 值
      //设置计数器模式  EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数 n 向下计数  EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;     //禁用相位加载  EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    //时钟与 SYSCLKOUT  EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;  EPwm2Regs.TBCTL.bit.SYNCOSEL = 0x00;
      //设置重影  EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADDADE;  EPwm2Regs.CMPCTL.bit.SHDMODE = CC_SHADDADE;  EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //零 EPwmCTR.CMPCTL.BIT.LOADDR.BIT.BOODE = CC_ZERO;//加载 EPwmCTR   

      //设置操作  EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;        //在事件 A 上设置 PWM1A、向上计数  EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;       //在事件 A 上清除 PWM1A,倒计数}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Soumya、

    我认为方括号被弄乱了。 在 ADC_ISR 中对它们进行计数:我认为可能有一个太多的闭合花括号、可能280行中的一个不应该存在。   

    修复后、在 ISR 的第一行上放置一个断点并运行代码。  程序是否进入 ISR?

    如果是、PWM2计数器是否递增?  我看不到您在 PWM2中启用计数的位置(TBCTL 中的 CTRMODE)。

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    主席先生,

    ADC_ISR 中没有这样的额外大括号。 还放置了一个断点并运行程序、它将进入 ISR。

     运行程序时既不会出现任何错误、也不会出现任何警告。

    但 EPwm2端口上没有输出 PWM 脉冲。

    随附了一个屏幕截图供您参考、其中 u1k 和 u2k 的值似乎不常见。

    我所在工厂的输入电压为5V,输出电压 为12.5V (即占空比为0.6),传感器增益为1/10。

    等待您的指导。

    此致、

    Soumya。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    主席先生,
    我想,我需要通过写入 DCL_writeLog (&eBuf、EK)之类的内容,将 EK 的值存储在 e_array 中;
    但是、在哪里放置这条线呢? 如果我的计划中有误、也建议我这样做。 请详细了解该计划。
    急切地等待您的回复。
    此致、
    Soumya。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    主席先生,
    我想,我需要通过写入 DCL_writeLog (&eBuf、EK)之类的内容,将 EK 的值存储在 e_array 中;
    但是、在哪里放置这条线呢? 如果我的计划中有误、也建议我这样做。 请详细了解该计划。
    急切地等待您的回复。
    此致、
    Soumya。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Soumya、

    不确定我是否理解您在该程序中尝试执行的操作。 DCL 示例使用数据记录器通过控制器流式传输数据样本并检查结果。 如果您要控制物理设备、则不需要记录器、除非出于某种原因而实际需要记录控制数据。

    "if (eBuf.dptr < eBuf.lptr)"的作用是什么?

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    主席先生,
    我必须在闭环电压控制中运行升压转换器。
    运行该程序时、GPIO2上没有输出脉冲。
    因此,请告诉我代码中需要哪些修改才能获得输出。

    我从 示例本身中获取了语句'if (eBuf.dptr < eBuf.lptr)'。 我认为它是用于遍历数据数组。 如果不需要此条件、则应修改代码以在闭环中运行受控体。  


    此致、
    Soumya。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的先生:
    还有一件事、根据我必须在第198和199行中选择上限和下限值的值?
    等待您的帮助!

    此致、
    Soumya
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    主席先生,

    我标记了一些新的东西。

    当我运行程序时、它会进入 ILLEGAL_ISR (void)。 为什么会这样呢?

    是否有任何导致这种情况的错误?

    随附的屏幕截图供您参考。

    但是,在这之后,如果我再次按下“恢复”按钮,程序将运行,而不会出现任何错误或警告。

    等待您的指导。

    此致、

    Soumya。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Soumya、

    您已经发布了几个不同的问题、因此我将尝试按顺序处理这些问题。

    1.-"请告诉我代码中需要哪些修改才能获得输出。"
    这与 PWM2上没有输出有关。 假设您已正确配置 PWM 模块、并且计数器正在递增(我在之前的帖子中要求您检查)、则问题最有可能与 GPIO 引脚配置有关。 检查您是否已将所需的 PWM2引脚配置为输出(F28069上的 GPIO2和 GPIO3)-有关更多信息、请参阅用户指南和头文件示例。

    2.-"...在闭环中运行受控体的代码修改应该是什么。"
    应删除"if (eBuf.dptr < eBuf.lptr)"测试。 除非您使用测试数据、否则 ISR 只需读取输入、运行控制器以及计算和输出 PWM 占空比。

    3.-"...根据我在第198和199行中必须选择的上限和下限值?"
    我不清楚您在运行哪个控制器。 示例代码显示了 DF22补偿器的完整(C1)和预计算(C2和 C3)形式。 您只需要具有预计算类型的钳位。 上限和下限将限制控制器的输出。 由于我认为您使用的是标准化占空比、通常下限为零、上限为1.0f、但这取决于您如何缩放环路中的变量。 思考数字对于工厂意味着什么。

    4.-"当我运行程序时、它进入 ILLEGAL_ISR (void)。 为什么会这样呢?"
    通常会发生非法 ISR、因为已尝试访问无效存储器。 这可能是因为您正在对缓冲区的末尾进行索引。 可能是上面的#2。

    BTW、这个线程变得很长。 我建议关闭它并打开一个新的问题、以便本论坛上的其他人可以在不浏览多个页面的情况下查看该问题。 谢谢。

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的先生:

    我已经检查了您的1、2和3号点、并检查了所有内容。 程序仍在进入"interrupt void"

    ILLEGAL_ISR (void)"。  

    关于 EPwm2的计数器值的递增、它达到了一个特定的值、之后不会递增。

    根据您的建议、我将为非法 ISR 打开一个新线程。

    此外、我还附上了一些显示 TBCTR 值和变量的屏幕截图。

    此致、

    Soumya。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    主席先生,
    我已按照您的建议发布了一个新主题。 有人回答了,但后来他没有答复。
    我是否需要创建另一个线程以从您的一方接收答复?
    否则、请在此处回复。 我卡在 ILLEGAL_ISR (void)的位置。 请帮帮我。
    此致、
    Soumya。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Soumya、

    请再次 ping 另一个线程。  我想、有时事情会意外落下、因此发送提醒没有任何问题。  这个主题很难遵循、因为有很多帖子。  我将在这里发表评论、但请专注于新话题。

    帖子中没有足够的信息来确定代码为什么以 ILLEGAL_ISR 结束。  这很可能是因为您正在访问无效存储器、但要了解发生这种情况的位置和原因并不明显。 仔细检查代码中未初始化的变量或索引超出范围的数组。  此外、查看.map 文件以检查所有程序和数据段是否符合预期。  这可能是链接器命令文件中的错误。

    如果您仍然找不到它、请尝试设置断点并单步执行代码以查看是否可以找到它。  如果没有、则必须删除代码、直到代码开始工作、然后从代码中生成代码、从而进行反向跟踪。  请记住、可以依赖 C2000Ware 中的 TI 示例来工作、因此值得仔细比较您的代码与类似示例(例如 F2833x PWM 示例)。  遗憾的是、没有简单的答案。

    此致、  

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    主席先生,

    我的最新帖子的链接是    

    我在那里简洁地定义了我的问题。

    请在此处回复。

    此致、

    Soumya。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经创建了一个包含 C2000ware 中所有文件(头文件和源文件)的新项目、现在它没有进入 ILLEGAL_ISR 模式。 之前我想我已经添加了一些来自 C2000器件的文件、以及一些来自 controlSUITE 的文件。
    现在、我的项目运行良好。
    感谢让我轻松学习 DSP 之旅的所有专家。
    感谢大家。

    此致、
    Soumya。