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.

[参考译文] TMS320F28379D:将 Sci_echoback 示例与 ADC_SoC_ePWM_cpu01示例相结合

Guru**** 2601915 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/676948/tms320f28379d-combining-the-sci_echoback-example-with-the-adc_soc_epwm_cpu01-example

器件型号:TMS320F28379D
Thread 中讨论的其他器件:controlSUITE

您好!  

我将 SCI_Echoback 主文件添加到 "adc_soc _ePWM_cpu01"中 、以便将两者合并到同一项目中。 但是、当我构建示例时、我得到了所附图片中显示的错误。 如果我双击该错误、那么我怎么解决该错误的任何想法都不会显示任何错误的响应。 我遇到的错误包括:

错误#10056:重新定义符号"_main":首先在"./example_2837xDSci_Echoback.obj"中定义;在"./adc_soc_ePWM_cpu01.obj"中重新定义
错误#10010:链接期间遇到错误;未构建"ADC_SoC_ePWM_cpu01.out"

>>编译失败
Makefile:147:目标'adc_soc _ePWM_cpu01.out'的配方失败
gmake:***[ADC_SoC_ePWM_cpu01.out]错误1
gmake:目标"全部"不会由于错误而重新生成。

我的主要目的是 、我可以使用 sci 通信将 ADC 缓冲区结果传输到监视器。  

此致  

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

    项目中只能有一个 main()函数。 也就是说、您可以添加到项目中、但在 C RTS 库完成执行后只能输入一个 main()函数。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

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

    我不知道如何在单独的文件中管理此问题、因此我尝试将 ADC_SoC_ePWM_cpu01中的 sci_file 组合为流:

    //
    //包含的文件
    //
    #include "F28x_Project.h"

    //
    //函数原型
    //
    void ConfigureADC (void);
    void ConfigureEPWM (void);
    void SetupADCepwm (uint16通道);

    void scia_echoback_init (void); //来自 sci 示例
    void scia_fifo_init (void);
    void scia_xmit (int a);
    void scia_msg (char * msg); //来自 sci 示例

    中断 void adca1_ISR (void);
    中断 void adcb1_ISR (void);
    中断 void adcd1_ISR (void);

    //
    //定义
    //
    #define results_buffer_size 256
    #define ADC_SAMPLE_PERIOD 1999 // 1999 = 100MHz ePWM 时钟的50kHz 采样

    //
    //全局
    //
    uint16 AdcaResults[results_buffer_size];
    uint16 AdcbResults[results_buffer_size];
    uint16 AdcdResults[results_buffer_size];
    uint16结果索引;
    uint16环计数; //来自 sci 示例
    易失性 uint16 bufferFull;

    void main (void)

    uint16 ReceivedChar; //来自 sci 示例
    char *msg;
    // char * msg1; //来自 sci 示例

    //
    //步骤1. 初始化系统控制:
    // PLL、安全装置、启用外设时钟
    //此示例函数位于 F2837xD_SYSCTRL.c 文件中。
    //
    InitSysCtrl();

    //
    //步骤2. 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件和中
    //说明了如何将 GPIO 设置为其默认状态。
    //
    InitGpio();//针对此示例跳过

    GPIO_SetupPinMux (28、GPIO_MUX_CPU1、1); //来自 sci 示例
    GPIO_SetupPinOptions (28、GPIO_INPUT、GPIO_PushPull);
    GPIO_SetupPinMux (29、GPIO_MUX_CPU1、1);
    GPIO_SetupPinOptions (29、GPIO_OUTPUT、GPIO_异 步); //来自 sci 示例

    //
    //步骤3. 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    Dint;

    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE 中断和标志
    //被清除。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    InitPieCtrl();

    //
    //禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;

    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。 这对于调试很有用。
    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    InitPieVectTable();

    //
    //映射 ISR 函数
    //
    EALLOW;
    PieVectTable.ADCA1_INT =&adca1_ISR;//针对 ADCA 中断1的函数
    PieVectTable.ADCB1_INT =&adcb1_ISR;//用于 ADCA 中断1的函数
    PieVectTable.ADCD1_INT =&adcd1_ISR;//用于 ADCA 中断1的函数
    EDIS;

    //
    //配置 ADC 并为其加电
    //
    ConfigureADC();

    //
    //配置 ePWM
    //
    ConfigureEPWM();

    //
    //在通道0上设置用于 ePWM 触发转换的 ADC
    //
    SetupADCepwm (0);

    //
    //启用全局中断和更高优先级的实时调试事件:
    //
    IER |= M_INT1;//启用组1中断
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM

    //
    //初始化结果缓冲区
    //
    for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)

    AdcaResults[resultsIndex]=0;
    AdcbResults[resultsIndex]= 0;
    AdcdResults[resultsIndex]=0;

    resultsIndex = 0;
    bufferFull = 0;

    //
    //启用 PIE 中断
    //
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
    PieCtrlRegs.PIEIER1.bit.INTx2 = 1;
    PieCtrlRegs.PIEIER1.bit.INTx6=1;

    //
    //同步 ePWM
    //
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;

    //
    //循环无限地进行转换
    //
    操作

    //
    //启动 ePWM
    //
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
    EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式

    //
    //等待、而 ePWM 导致 ADC 转换、然后导致中断、
    //填充结果缓冲区,最终设置 bufferFull
    //flag
    //
    while (!bufferFull);
    bufferFull = 0;//清除缓冲区已满标志

    //
    //停止 ePWM
    //
    EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用 SOCA
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器

    //
    //此时,AdcaResults[]包含一系列转换
    //从所选通道
    //

    //
    //软件断点,再次点击运行以获取更新的转换
    //
    asm (" ESTOP0");
    } while (1);


    //
    // ConfigureADC -写入 ADC 配置并为两者加电
    // ADC A 和 ADC B
    //
    空配置 ADC (空)

    EALLOW;

    //
    //写入配置
    //
    AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
    AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);

    AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
    AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);

    AdcdRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
    AdcSetMode (ADC_ADCD、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);

    //
    //将脉冲位置设置为晚期
    //
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
    AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    AdcdRegs.ADCCTL1.bit.INTPULSEPOS = 1;

    //
    //为 ADC 加电
    //
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    //
    //延迟1ms 以允许 ADC 加电时间
    //
    DELAY_US (1000);

    EDIS;


    //
    // ConfigureEPWM -配置 ePWM SOC 并比较值
    //
    空配置 EPWM (空)

    EALLOW;
    //假设 ePWM 时钟已启用
    EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
    EPwm1Regs.CMPA.bit.CMPA = 0x0800; //将比较 A 值设置为2048个计数,为0*0800
    EPwm1Regs.TBPRD = 0x1000; //将周期设置为4096个计数, 它是0*1000
    EPwm1Regs.TBCTL.bit.CTRMODE = 3; //冻结计数器
    EDIS;


    //
    // SetupADCepwm -设置 ADC ePWM 采集窗口
    //
    void SetupADCepwm (uint16通道)

    uint16 acqps;

    //
    //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
    //
    if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)

    acqps = 14;//75ns

    否则、//分辨率为16位

    acqps = 63;//320ns


    //
    //选择要转换的通道和转换结束标志
    //
    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
    EDIS;

    //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
    //
    if (adc_resolution_12bit = AdcbRegs.ADCCTL2.bit.resolution)

    acqps = 14;//75ns

    否则、//分辨率为16位

    acqps = 63;//320ns


    //
    //选择要转换的通道和转换结束标志
    //
    EALLOW;
    AdcbRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
    AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
    AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发
    AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
    AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
    AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
    EDIS;


    //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
    //
    if (adc_resolution_12bit = AdcdRegs.ADCCTL2.bit.resolution)

    acqps = 14;//75ns

    否则、//分辨率为16位

    acqps = 63;//320ns


    //
    //选择要转换的通道和转换结束标志
    //
    EALLOW;
    AdcdRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
    AdcdRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
    AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发
    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
    AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
    EDIS;



    //
    // adca1_ISR -在 ISR 中读取 ADC 缓冲器
    //
    中断 void adca1_ISR (void)

    AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;
    if (results_buffer_size <= resultsIndex)

    resultsIndex = 0;
    bufferFull = 1;


    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;



    // adcb1_ISR -在 ISR 中读取 ADC 缓冲器
    //
    中断空 adcb1_ISR (空)

    AdcbResults[resultsIndex++]= AdcbResultRegs.ADCRESULT0;
    if (results_buffer_size <= resultsIndex)

    resultsIndex = 0;
    bufferFull = 1;


    AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;



    // adcd1_ISR -在 ISR 中读取 ADC 缓冲器
    //
    中断 void adcd1_ISR (void)

    AdcdResults[resultsIndex++]= AdcdResultRegs.ADCRESULT0;
    if (results_buffer_size <= resultsIndex)

    resultsIndex = 0;
    bufferFull = 1;


    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;




    //
    //步骤4. 用户特定代码:
    //
    LoopCount = 0;

    scia_fifo_init(); //初始化 SCI FIFO
    scia_echoback_init ();//初始化用于 echoback 的 SCI

    MSG ="\r\n\n\nHello World!\0";
    scia_msg (msg);

    /* char values[5]={'1'、'0'、'2'、'5'、'5'}; //我添加了第182 - 191行
    int z;
    对于(z=0;z<5;z++){
    * msg1 =值[z];
    // msg1 ="\r\n 数组索引的值为\n",z,values[z];
    scia_msg (msg1);
    MSG ="\r\n 数组索引的值为\n";
    // }*/

    int values[5]={'1'、'2'、'2'、'5'、'6'}; //我添加了第185 - 192行
    int z;
    对于(z=0;z<5;z++){
    int num =值[z];
    // printf ("\n num\n");
    // msg1 ="\r\n 数组索引的值为\n",z,values[z];
    scia_xmit (num);
    // msg ="\r\n 数组索引的值为\n";





    MSG ="\r\n 您将输入一个字符,DSP 将回显它! \n\n";

    scia_msg (msg);

    for (;;)

    MSG ="\r\n 输入字符:\0";
    scia_msg (msg);

    //
    //等待 inc 字符
    //
    while (SciaRegs.SCIFFRX.bit.RXFFST ==0){}//等待空状态

    //
    //获取字符
    //
    ReceivedChar = SciaRegs.SCIRXBUF.ALL;

    //
    //回显字符
    //
    MSG ="您已发送:\0";
    scia_msg (msg);
    scia_xmit (ReceivedChar);

    LoopCount++;



    //
    // scia_echoback_init -测试1、SCIA DLB、8位字、波特率0x000F、
    // 默认值、1个停止位、无奇偶校验
    //
    void scia_echoback_init ()

    //
    //注意:SCIA 外设的时钟被打开
    //在 InitSysCtrl()函数中
    //

    SciaRegs.SCICCR.all = 0x0007;// 1停止位,无回路
    //无奇偶校验,8个字符位,
    //异步模式,空闲线协议
    SciaRegs.SCICTL1.all = 0x0003;//启用 TX、RX、内部 SCICLK、
    //禁用 RX ERR、睡眠、TXWAKE
    SciaRegs.SCICTL2.all = 0x0003;
    SciaRegs.SCICTL2.bit.TXINTENA=1;
    SciaRegs.SCICTL2.bit.RXBKINTENA=1;

    //
    // SCIA 为9600波特
    //@LSPCLK = 50MHz (200MHz SYSCLK) HBAUD = 0x02且 LBAUD = 0x8B。
    //@LSPCLK = 30MHz (120MHz SYSCLK) HBAUD = 0x01且 LBAUD = 0x86。
    //
    SciaRegs.SCIHBAUD.ALL = 0x0002;
    SciaRegs.SCILBAUD.ALL = 0x008B;

    SciaRegs.SCICTL1.all = 0x0023;//从复位中撤回 SCI


    //
    // scia_xmit -从 SCI 发送一个字符
    //
    void scia_xmit (int a)

    while (SciaRegs.SCIFFTX.bit.TXFFST!= 0){}
    SciaRegs.SCITXBUF.ALL =A;


    //
    // scia_msg -通过 SCIA 发送消息
    //
    void scia_msg (char * msg)

    int i;
    I = 0;
    while (msg[i]!='\0')

    scia_xmit (msg[i]);
    i++;




    // scia_fifo_init -初始化 SCI FIFO
    //
    void scia_fifo_init()

    SciaRegs.SCIFFTX.ALL = 0xE040;
    SciaRegs.SCIFFRX.ALL = 0x2044;
    SciaRegs.SCIFFCT.all = 0x0;



    //
    //文件结束
    //


    当我构建程序时、我收到了一个长错误列表、如下所示:

    #148声明与"uint16 LoopCount"(在第58行声明)不兼容ADC_SoC_ePWM_cpu01.c/ADC_SoC_ePWM_cpu01第400行C/C++问题

    #148声明与"void scia_echoback_init (void)"(在第36行声明)不兼容ADC_SoC_ePWM_cpu01.c/ADC_SoC_ePWM_cpu01行403C/C++问题

    #148声明与"void scia_fifo_init (void)"(在第37行声明)不兼容ADC_SoC_ePWM_cpu01.c/ADC_SoC_ePWM_cpu01行402C/C++问题

    #148声明与"void scia_msg (char *)"(在第39行声明)不兼容ADC_SoC_ePWM_cpu01.c/ADC_SoC_ePWM_cpu01第406行C/C++问题
    #148声明与"volatile struct SCI_regs SciaRegs"(在"C:\ti\controlSUITE\device_support\f2837xd\V210\F2837xD_headers\include\F2837xD_sci.h"的第218行声明)不兼容ADC_SoC_ePWM_cpu01.c/adc_soc ePWM+c488+C 问题代码行

    #171预计出现 ADC_SoC_ePWM_cpu01.c/ADC_SoC_ePWM_cpu01第419行C/C++问题
    171预计会出现 ADC_SoC_ePWM_cpu01.c/ADC_SoC_ePWM_cpu01第434行C/C++问题
    171预计出现 ADC_SoC_ePWM_cpu01.c/ADC_SoC_ePWM_cpu01第457行C/C++问题
    #171预计出现 ADC_SoC_ePWM_cpu01.c/ADC_SoC_ePWM_cpu01第489行C/C++问题

    #66预计出现";"adc_soc_ePWM_cpu01.c/adc_soc_ePWM_cpu01第488行C/C++问题

    gmake:***[ADC_SoC_ePWM_cpu01.obj]错误1ADC_SoC_ePWM_cpu01C/C++问题
    gmake:目标"全部"不会由于错误而重新生成。ADC_SoC_ePWM_cpu01C/C++问题


    我不知道这是不是正确的方法、如果不是、你可以建议我采取更好的方法来避免两次定义 main 的问题
    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hayder、您好!

    在您共享的代码中,从 LoopCount 初始化开始并以 void scia_echoback_init()的实现结束的代码部分(复制/粘贴在下面)不包含在函数中。 根据您的项目需求,我建议执行以下操作之一:将这部分代码添加到 main(),添加到另一个现有函数,或者为此添加一个函数,并在适当的情况下包括一个函数调用。

    //
    //步骤4. 用户特定代码:
    //
    LoopCount = 0;

    scia_fifo_init();//初始化 SCI FIFO
    scia_echoback_init ();//初始化用于 echoback 的 SCI

    MSG ="\r\n\n\nHello World!\0";
    scia_msg (msg);

    /* char values[5]={'1'、'0'、'2'、'5'、'5'}; //我添加了第182 - 191行
    int z;
    对于(z=0;z<5;z++){
    * msg1 =值[z];
    // msg1 ="\r\n 数组索引的值为\n",z,values[z];
    scia_msg (msg1);
    MSG ="\r\n 数组索引的值为\n";
    //}*/

    int values[5]={'1'、'2'、'2'、'5'、'6'}; //我添加了第185 - 192行
    int z;
    对于(z=0;z<5;z++){
    int num =值[z];
    // printf ("\n num\n");
    // msg1 ="\r\n 数组索引的值为\n",z,values[z];
    scia_xmit (num);
    // msg ="\r\n 数组索引的值为\n";





    MSG ="\r\n 您将输入一个字符,DSP 将回显它! \n\n";

    scia_msg (msg);

    for (;;)

    MSG ="\r\n 输入字符:\0";
    scia_msg (msg);

    //
    //等待 inc 字符
    //
    while (SciaRegs.SCIFFRX.bit.RXFFST ==0){}//等待空状态

    //
    //获取字符
    //
    ReceivedChar = SciaRegs.SCIRXBUF.ALL;

    //
    //回显字符
    //
    MSG ="您已发送:\0";
    scia_msg (msg);
    scia_xmit (ReceivedChar);

    LoopCount++;



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

    你(们)好,Elizabeth

    我通过为 SCI 创建另一个函数、设法使用您建议的最后一个选项、然后在 main 中调用它。 我在 ADC 转换后放置了调用函数、目的是通过串行端口传输 ADC 转换结果。 我成功发送了一个我在 SCI.c 中创建的简单数组 、如下所示:  

    MSG ="\r\n\n\nHello World!\0";
    scia_msg (msg);

    5]={'1'、'2'、'2'、'5'、'6'};   

    int z;
    对于(z=0;z<5;z++){
    int num =值[z];
    scia_xmit (num);

    但当我尝试执行相同的操作但使用 AdcResults 作为以下代码时、它显示错误:

    int values[256]=结果;  
    int z;
    对于(w=0;z<256;z++){
    int num1 =值[z];
    scia_xmit (num1);

    我收到的错误为:  

    >>编译失败
    subdir_rules.mk:79:目标'SCI.obj'的配方失败
    "./sci.c"、第212行:警告#522-D:使用"{...}"进行初始化 聚合对象的预期值
    "./sci.c"、第212行:错误#20:标识符"AdcResults (结果)"未定义
    "./Sci.c"、第123行:警告#179-D:变量"ReceivedChar"已声明、但从未引用
    1在编译"./sci.c"时检测到错误。
    gmake:***[sci.obj]错误1.
    gmake:目标"全部"不会由于错误而重新生成。

    ****构建完成****

    我应该在哪里定义 AdcaResults、因为它已经在主文件中定义。  

    此致

    Hayder

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

    这是不正确的 C 语法、因为'values'被声明为整数数数组、因此初始化应该是指定数组大小的整数列表、或者如果在声明时未完成初始化、则数组的每个项目都可以在以后单独分配。 请根据需要查看有关数组的 C 编程参考。

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

    您好、Elizabeth、  

    我将介绍任何 C 编程参考。  
    我有另一个问题、我想知道该示例中的采样频率是12kHz。 请参阅以下示例中的代码:  

    EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
    EPwm1Regs.CMPA.bit.CMPA = 0x0800;//将比较 A 值设置为2048个计数
    EPwm1Regs.TBPRD = 0x1000;//将周期设置为4096个计数
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器

    我猜该示例中的 ADC 时钟为50MHz、因为我转换了2kHz 的单个输入、每周期产生6个样本、如下图所示:  

    如何检查用于 触发 ADC 的 ADC 时钟或 ePWM 时钟是否为50MHz。 如果我想更改采样频率、是否只需将上面的 TBPRD 从1000h 更改为任何代表我所需频率的值? 例如、如果我需要25kHz、我使 TBPRD = 0x800。  

    此致  

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

    要验证系统时钟、您可以使用 XCLOCKOUT 并使用 CLKSRCCTL3寄存器的 XCLKOUTSEL 位将时钟输出源配置为 SYSCLK。 这可以多路复用为 GPIO 引脚、然后在示波器上观察到。

    是的、您可以修改 TBPRD 来调整 ePWM 频率。
    对于向上计数或向下计数模式:周期(和反过来频率)可被计算为:T (PWM)=(1+TBPRD)*T (TBCLK)。 其中 TBCLK = EPWMCLK/(HSPCLKDIV*CLKDIV)
    对于递增/递减计数模式:t (ofPWM)=2*TBPRD*T (ofTBCLK)
    技术参考手册详细介绍了这些寄存器。

    此致、
    Elizabeth