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.

[参考译文] TMS320F28069M:具有 RTOS 的 eCAP1设置

Guru**** 2524550 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/997076/tms320f28069m-ecap1-setup-with-rtos

器件型号:TMS320F28069M
Thread 中讨论的其他器件:SYSBIOS

我按如下方式设置 eCAP 的参数

InitECapture()

InitECap1Gpio()

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

//禁用 CPU 中断

Dint;

//禁用 CPU 中断并清除所有 CPU 中断标志:

IER = 0x0000;

IFR = 0x0000;

ECap1Regs.ECEINT.ALL = 0x0000;//禁用所有捕捉中断

ECap1Regs.ECCLR.ALL = 0xFFFF;//清除所有 CAP 中断标志

ECap1Regs.ECCTL1.bit.CAPLDEN = 0;//禁用 CAP1-CAP4寄存器加载

ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;//确保计数器被停止

//配置外设寄存器

ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1;//单次触发

ECap1Regs.ECCTL2.bit.STOP_Wrap = 3;//在4个事件时停止

ECap1Regs.ECCTL1.bit.CAP1POL = 1;//下降边沿

ECap1Regs.ECCTL1.bit.CAP2POL = 0;//上升边沿

ECap1Regs.ECCTL1.bit.CAP3POL = 1;//下降边沿

ECap1Regs.ECCTL1.bit.CAP4POL = 0;//上升边沿

ECap1Regs.ECCTL1.bit.CTRRST1 = 1;//差动操作

ECap1Regs.ECCTL1.bit.CTRRST2 = 1;//差动操作

ECap1Regs.ECCTL1.bit.CTRST3 = 1;//差动操作

ECap1Regs.ECCTL1.bit.CTRRST4 = 1;//差动操作

ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入

ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;//直通

ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//启用捕捉单元

ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;//起始计数器

ECap1Regs.ECCTL2.bit.rearm = 1;// ARM 单次触发

ECap1Regs.ECCTL1.bit.CAPLDEN = 1;//启用 CAP1-CAP4寄存器加载

ECap1Regs.ECEINT.BIT.CEVT4 = 1;// 4个事件=中断

//启用连接到 ECAP1-4 INT 的 CPU INT4:

IER |= M_INT4;

//在 PIE 中启用 eCAP INTn:组3中断1-6

PieCtrlRegs.PIEIER4.bit.INTx1 = 1;

//启用全局中断和更高优先级的实时调试事件:

EINT;//启用全局中断 INTM

ERTM;//启用全局实时中断 DBGM

并在 RTOS 中按如下方式分配中断功能:

但是、在以1Hz 信号连接到中断函数的情况下运行代码时、似乎不会调用中断函数。 我使用 GPIO24 (J6-pin55) 作为引脚来捕获信号。 我缺少什么?

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

    你的 Hwi 设置看起来不错。 我不知道何时在应用程序中调用 InitECapture()(在 BIOS_start()之前或之后),但在意外禁用系统计时器中断时,请注意修改 IER 并自行注册,而不使用 Hwi 模块函数。 Hwi 模块看起来像是配置为始终为您启用它。

    同样、请确保您没有调用 InitPieVectTable()或在 Hwi 函数上使用__interrupt 关键字。 SYS/BIOS 应该为您处理这些问题。

    您可以在"Registers"窗口中设置 ECAP 事件标志吗?

    惠特尼

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

    我 在 BIOS_start()之前调用 InitECapture()。 我不调用您提到的其他函数。 但是、我使用引脚 J6-pin55、但我注意到 eCAP1被分配给多个引脚。 我应该连接到哪个引脚? 在代码中、我在哪里指定要使用的 GPIO? 我在运行当前代码时附加了 eCAP1寄存器的屏幕截图。

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

    您已修改 InitECap1Gpio()以取消对 GPIO24行的注释、对吧? 如果您编辑 ECAP_CAPTURE_PWM 示例以使用 GPIO24、它是否起作用? 听起来您在使用 LaunchPad 上的正确引脚。

    惠特尼

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

    我没有意识到 InitECap1Gpio()定义了 eCAP1将使用的 GPIO。 因此、我将硬件更改为读取 GPIO5。

    InitECap1Gpio ()

    EALLOW;

    /*为所选引脚启用内部上拉*/

    //用户可以启用或禁用上拉。

    //这将启用指定引脚的上拉电阻。

    //注释掉其他不需要的行。

    GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;//启用 GPIO5上的上拉电阻(CAP1)

    // GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0;//启用 GPIO11 (CAP1)上的上拉

    // GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;//启用 GPIO19上的上拉电阻(CAP1)

    // GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;//启用 GPIO24 (CAP1)上的上拉

    默认情况下、//输入与 SYSCLKOUT 同步。

    //注释掉其他不需要的行。

    GpioCtrlRegs.GPAQSEL1.bit.GPIO5=0//同步到 SYSCLKOUT GPIO5 (CAP1)

    // GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 0;//同步到 SYSCLKOUT GPIO11 (CAP1)

    // GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 0;//同步到 SYSCLKOUT GPIO19 (CAP1)

    // GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 0;//同步到 SYSCLKOUT GPIO24 (CAP1)

    /*使用 GPIO 寄存器配置 eCAP-1引脚*/

    //这指定哪些可能的 GPIO 引脚将是 eCAP1功能引脚。

    //注释掉其他不需要的行。

    GpioCtrlRegs.GPAMUX1.bit.GPIO5=3//将 GPIO5配置为 CAP1

    // GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 3;//将 GPIO11配置为 CAP1

    // GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 3;//将 GPIO19配置为 CAP1

    // GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//将 GPIO24配置为 CAP1

    EDIS;

    现在、这就是 eCAP1寄存器在进行硬件更改后的样子。 但是、我仍然没有从 CAP1、CAP2、CAp3或 CAP4中获取任何内容。

    当 eCAP1被触发时、这是我将用于 HWI 的函数。

    ///--------------------------------

    //=========== SensorMeasureHWI ===

    ///--------------------------------

    void SensorMeasureHWI()

    无符号整型测量[2]={0、0};

    SensorHighPeriod =(unsigned int) ECap1Regs.CAP2 -(unsigned int) ECap1Regs.CAP1//计算 PWM 占空比(上升沿到下降沿)

    SensorPeriod =(unsigned int) ECap1Regs.CAP3 -(unsigned int) ECap1Regs.CAP1//计算 PWM 周期(上升沿到上升沿)

    测量[HIGHPERIOD]= SensorHighPeriod;

    测量[周期]= SensorPeriod;

    Mailbox_post (SensorMeasurement、& Measurement、BIOS_NO_WAIT);

    ECap1Regs.ECCLR.bit.CEVT4 = 1;

    ECap1Regs.ECCLR.bit.INT = 1;

    ECap1Regs.ECCTL2.bit.rearm = 1;

    PieCtrlRegs.PIEACK.all = PIEACK_group4;//确认此中断以接收来自组4的更多中断

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

    您的 eCAP 配置与 ECAP_CAPTURE_PWM 示例大致相同。 该示例在您按原样运行时是否按预期工作? 它是否将其集成到看起来会中断它的 SYSBIOS 项目中?

    看起来这是 eCAP 或引脚配置的问题、因为您在 eCAP 寄存器中看不到标志被设置、但为了确认 Hwi 设置正常、您是否可以使用 ECFRC 寄存器来测试 ISR 是否执行?

    惠特尼

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

    这是我一直用来为 eCAP 生成测试信号的代码、在这里我添加了 ECFRC 代码行。

    TestTask()

    无符号整型测量[2]={0、0};

    while (1)

    ECap1Regs.ECFRC.bit.CEVT1 = 1;

    ECap1Regs.ECFRC.bit.CEVT2 = 1;

    ECap1Regs.ECFRC.bit.CEVT3 = 1;

    ECap1Regs.ECFRC.bit.CEVT4 = 1;

    GpioDataRegs.GPATOGGL.bit.GPIO6 = 1;//驱动倾斜电机输出 J8引脚80

    GpioDataRegs.GPATOGGL.bit.GPIO7=1//驱动辊电机输出 J8-pin79

    Task_sleep (period);

    IF (TileMotorDirection =FWD)

    GpioDataRegs.GPASET.BIT.GPIO8 = 1;//设置倾斜电机方向 J8-pin78

    否则 IF (TileMotorDirection == REV)

    GpioDataRegs.GPACLEAR.bit.GPIO8 = 1;//清除倾斜电机方向 J8引脚78

    其他

    System_printf ("停止驱动倾斜电机\n");

    system_flush ();//强制 SysMin 输出到控制台

    if (RollMotorDirection =FWD)

    GpioDataRegs.GPASET.bit.GPIO9 = 1;//设置滚转电机方向 J8-pin77

    否则、IF (RollMotorDirection = REV)

    GpioDataRegs.GPACLEAR.bit.GPIO9 = 1;//清除滚动电机方向 J8-pin77

    其他

    System_printf ("停止驱动侧倾电机\n");

    system_flush ();//强制 SysMin 输出到控制台

    这是添加新代码行后 eCAP1的屏幕截图

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

    当你使用 ECFRC 时、你的 Hwi 函数是否执行? 我看到 ECFLG 位被置位。

    您是否使用了示波器或类似工具来确认您的测试信号是否符合预期?

    惠特尼

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

    当我使用 ECFRC 时、HWI 似乎没有执行。 我已使用示波器验证测试信号是否正常工作。 我可以向您发送我的项目文件吗? 如果是、我如何才能看到如何将其附加到该论坛?

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

    我目前没有硬件可以与我一起运行它、但我至少可以查看代码。 转到"插入"->"图像/视频/文件"、查看是否允许您上载项目。

    您是否确认普通非 BIOS ECAP_CAPTURE_PWM 示例在您的电路板上正常工作?

    惠特尼

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

    e2e.ti.com/.../4478.Testbench.zip

    我已附上上述代码。

    我尝试运行示例代码、但它不会编译、因为我没有安装正确的编译器。

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

    CCS 是否允许您将编译器版本更改为已安装的版本、还是甚至不允许您导入工程? 或者、您能否创建一个新项目并将示例文件复制到其中? 您的实际项目中有很多工作要做、因此我们很高兴能够稍微隔离一下问题。

    默认情况下,SYS/BIOS 将尝试使用引导模块来配置与 InitSysCtrl()中的时钟配置冲突的系统时钟。 如果您的测试信号以预期的频率切换、似乎可以正常工作、但通常最好禁用其中一个信号。

    同样、您需要确保 SYS/BIOS 尚未使用您正在使用的任何 CPU 计时器来执行系统计时或时间戳。 我不记得它默认使用哪一个、但您可以将它配置为使用特定的、这样您就可以确保它们不会重叠。

    话虽如此、我认为这些都不会导致 eCAP 无法检测到边沿事件。

    惠特尼

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

    老实说、这是一个尝试获取项目文件的过程、我发送给您与编译器合作、因此我不想浪费时间尝试计算示例的编译器。 但是、我的项目中的许多函数未使用、因此我可以将项目简化为仅使用的内容并重新附加它。

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

    e2e.ti.com/.../1588.Testbench.zip

    我简化了该文件、但我保留了 CAN 和 PWM 内容、但目前未使用该文件。 要查看的主要函数是

    InitECapture () //这是初始化 eCAP 的函数

    SensorMeasureHWI()   //这是在触发 eCAP 时调用的 HWI

    TestTask()  //生成 PWM 信号

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

    我想我发现了这个问题。 InitECap1Gpio 和 InitEPwm3Gpio 都尝试配置 GPIO5 -因此您在一个函数中将其配置为 eCAP、然后在另一个函数中将其重新配置为 ePWM。

    您打算将哪个引脚连接到 GPIO5? GPIO4作为 EPWM3A? 目前您正在配置 AQCTLB.PRD、而不是 AQCTLA.PRD。

    惠特尼

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

    Whitney、

    我进行了这些更正、但我看不到 eCAP 正在更新 CAP1。 但是、CAP2、CAP3和 CAP4不更新? 我是否需要在代码中添加一些内容才能读取这些内容?

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

    我一直在使用该信号、因此1Hz 似乎太慢了、所以我增加了它、我看到电容器1-4正在报告、但如果我增加了太多信号、则电容器将无法工作。 是否有我需要考虑的溢出计数器? 我不觉得我有这么多任务在运行以保持系统、但我如何增加系统时钟? 如何增加 eCAP1的时钟?

    我还注意到、当我在调试器中运行编程器时、PWM 信号是跳转的较慢频率和占空比。 但是、当我停止调试器时、程序仍在运行、PWM 信号要快得多、但占空比稳定。 您知道原因吗?

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

    您的 SYSCLK 是否以90MHz 的频率运行? 正如我在前面的一篇文章中所说的那样,SYS/BIOS 将尝试配置 SYSCLK 本身,如果你然后调用 InitSysCtrl(),这可能会导致一些冲突。 我建议启用引导模块并取消选中"Configure the PLL"(配置 PLL)框。 然后进入 BIOS 设置并告诉它您的 CPU 时钟频率为90 MHz。 在 cfg 脚本中、您应该会看到

    bios.cpufreq.lo = 90000000;
    boot.configurePll = false;

    有时、拉高 ROV 并查看时钟模块、记下节拍数、运行10秒、暂停并再次检查节拍数、并确保大约10、000次通过。

    看起来您的 eCAP1预分频器已经设置为/1、因此您无法使它变得更快。

    惠特尼

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

    我能够按照您的指示设置系统时钟、并验证了 cfg 脚本是否已更新。 但是、在调试器和独立模式之间切换时、我仍然观察到相同的行为。

    我提供了最新的 eCAP1寄存器屏幕截图、我注意到 CAP1-4都更新为相同的值。 我将一个稳定信号用于已知输出、现在我监控的输出以250Hz 的频率运行。 我还从 TestTask()函数中删除了以下代码行

    ECap1Regs.ECFRC.bit.CEVT1 = 1;

    ECap1Regs.ECFRC.bit.CEVT2 = 1;

    ECap1Regs.ECFRC.bit.CEVT3 = 1;

    ECap1Regs.ECFRC.bit.CEVT4 = 1;

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

    很高兴看到这些捕获事件现在起作用。 您的 Hwi 函数现在是否按预期执行?

    那么、当您连接调试器时、PWM 波形不正确? 还是更具体地说、即使在调试器之后连接(如本 视频中所述、独立启动也能纠正问题、但要确保它不会复位器件)?

    惠特尼

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

    不、我只需在 CCS 中点击"Debug"按钮、它就会切换到"CCS Debug"窗口。 它加载并刷写代码、然后在 CCS Debug 窗口中点击"Run"。 在 Debug 窗口中、信号 读取占空比不稳定的较慢不稳定频率。 但是、当我只需按下 CCS Debug 窗口中的 Terminate 按钮时、CCS 切换到 CCS Edit 窗口、信号现在变得稳定、具有更快的频率和稳定的占空比。

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

    TBCTL.FREESOFT 域是如何配置的? 如果您将其设置为"自由运行"、它是否有用?

    惠特尼

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

    在哪里可以找到 TBCTL.FREESOFT? 它不在 CFG 脚本中。

    我的 XINT 现在有问题。 他们以前工作过、但现在不再被呼叫。 我注意到 BIOS 有2个不同的区域来定义 HWI 函数、并且在没有出现错误的情况下无法使用 HWI (ti.sysbios.family.c28)。

    我看到在执行清理构建时出现以下错误

    当前未安装产品 com.ti.rtsc.TIRTOS 2000 v2.10.1.38、并且没有可用的兼容版本。 请安装此产品或兼容版本。

    如何安装此版本、因为我认为我已经安装了此版本?

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

    抱歉、我是指 EPwm3Regs.TBCTL.bit.free_soft 字段。 尝试将其设置为2。

    您能否在 CCS 寄存器视图中检查 IER 寄存器(PIE 和 CPU 中)以确认 XINT 是否已正确启用?

    如果您进入项目属性并转至常规页面上的产品选项卡、它是否同时显示 SYS/BIOS 和 TI-RTOS? 如果是、请禁用 TI-RTOS。 您只需要用于 F2806x 的 SYS/BIOS。

    惠特尼

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

    我发现、打印函数占用了所有 CPU 的使用、导致了 PWM 的延迟计时。 这解释了为什么当打印函数处于活动状态时调试器中不稳定、当我离开调试器时稳定。

    但是、我仍然遇到 XINT 函数的问题。 这是我设置寄存器的代码

    EALLOW;

    GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;//使用 GPIO 12

    GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;//将 GPIO 12设置为输入

    GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;//为 GPIO12启用上拉

    EDIS;

    // GPIO12是 XINT1

    EALLOW;

    GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;//将 GPIO 12设置为 XINT1 (外部中断)

    EDIS;

    //配置 XINT1

    XIntertRegs.XINT1CR.bit.Polarity = 0;//下降边沿中断

    //启用 XINT1

    XIntertRegs.XINT1CR.bit.ENABLE = 1;//启用 XINT1 (外部中断)

    这是 HWI 的屏幕截图。

    如下所示、寄存器设置正确且计数器正在运行。 所以我不知道它现在为什么不工作了。

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

    我没有看到您的寄存器配置或 Hwi 设置有任何问题。 您是否在 CCS 寄存器视图中检查了 PIEIER1和 CPU IER (在内核寄存器中)以确认它们是否已设置?

    惠特尼

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

    在哪里可以检查这些寄存器?

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

    在 CCS Registers 窗口中、PIEIER1位于 PIE 下、而 IER 位于 Core Registers 下。

    惠特尼

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

    IER 寄存器

    PIEIER1寄存器

    这些寄存器是否正确?

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

    PIEIER1看起来不错(XINT1和 XINT2的 INT1.4和1.5已启用)、但应将 IER 中的 INT1设置为启用整个 INT1组。 SYS/BIOS 应为您启用它。 看看您是否在代码中的某个位置意外清除它?

    惠特尼

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

    谢谢 Whitney。 您的所有反馈都非常有帮助。 但是、对于 ECAP 模块、我将向 其馈送500Hz 信号、它似乎不会触发中断、但当我以稳定的速率将引脚移除并替换到 GND 时 、我会看到 ECAP 功能被触发。 我是否可能需要通过 MOSFET 将 PWM 信号从电路板驱动到接地、因为它似乎不能直接从我使用的 PWM 引脚工作?

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

    只需使用跳线将 LaunchPad 上的两个引脚连接在一起即可。 PWM 信号在示波器上看起来仍然正常? 我想 在之前的一篇文章 中、您曾使用过 PWM (或至少您获得了所有捕获事件)? 还是在250Hz 下可以、但在500Hz 下不能正常工作?

    惠特尼

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

    我进行了一些测试、发现 SensorMeasureHWI()正被 eCAP3调用、但 CAP1-4是相同的值、因此当我执行差分方程时、我的周期和高周期等于零。

    我在下面提供了由 eCAP3调用的 HWI。 为什么 CAP1-4完全相同? 我已验证我具有500Hz 50% DC 信号。

    void SensorMeasureHWI()

    无符号整型测量[2]={0、0};

    测量[HIGHPERIOD]=(无符号整型) ECap3Regs.CAP2 -(无符号整型) ECap3Regs.CAP1//计算 PWM 占空比(上升沿到下降沿)

    测量[周期]=(无符号整型) ECap3Regs.CAP3 -(无符号整型) ECap3Regs.CAP1//计算 PWM 周期(上升沿到上升沿)

    Mailbox_post (SensorMeasurement、& Measurement、BIOS_NO_WAIT);

    ECap3Regs.ECCLR.bit.CEVT4 = 1;

    ECap3Regs.ECCLR.bit.INT = 1;

    ECap3Regs.ECCTL2.bit.rearm = 1;

    PieCtrlRegs.PIEACK.all = PIEACK_group4;//确认此中断以接收来自组4的更多中断

    这里是 eCAP3的配置、它被设置为一个差分操作。

    InitECap3()

    InitECap3Gpio()

    ECap3Regs.ECEINT.ALL = 0x0000;//禁用所有捕捉中断

    ECap3Regs.ECCLR.ALL = 0xFFFF;//清除所有 CAP 中断标志

    ECap3Regs.ECCTL1.bit.CAPLDEN = 0;//禁用 CAP1-CAP4寄存器加载

    ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0;//确保计数器被停止

    //配置外设寄存器

    ECap3Regs.ECCTL2.bit.CONT_ONESHT = 1;//单次触发

    ECap3Regs.ECCTL2.bit.STOP_Wrap = 3;//在4个事件时停止

    ECap3Regs.ECCTL1.bit.CAP1POL = 1;//下降边沿

    ECap3Regs.ECCTL1.bit.CAP2POL = 0;//上升边沿

    ECap3Regs.ECCTL1.bit.CAP3POL = 1;//下降边沿

    ECap3Regs.ECCTL1.bit.CAP4POL = 0;//上升边沿

    ECap3Regs.ECCTL1.bit.CTRRST1 = 1;//差动操作

    ECap3Regs.ECCTL1.bit.CTRRST2 = 1;//差动操作

    ECap3Regs.ECCTL1.bit.CTRST3 = 1;//差动操作

    ECap3Regs.ECCTL1.bit.CTRRST4 = 1;//差动操作

    ECap3Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入

    ECap3Regs.ECCTL2.bit.SYNCO_SEL = 0;//直通

    ECap3Regs.ECCTL1.bit.CAPLDEN = 1;//启用捕捉单元

    ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;//开始计数器

    ECap3Regs.ECCTL2.bit.rearm = 1;// ARM 单次触发

    ECap3Regs.ECCTL1.bit.CAPLDEN = 1;//启用 CAP1-CAP4寄存器加载

    ECap3Regs.ECEINT.BIT.CEVT4 = 1;// 4个事件=中断

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

    您将在每个边沿复位计数器、因此、在频率恒定且占空比为50%的情况下、我希望捕获结果相同。 我认为您在这里实现的内容类似于 TRM 中的"示例4"(SPRUH18H 中的第6.6.4节)。

    我怀疑您的时间高电平本身是 CAP3、而您的整个周期实际上是 CAP2 + CAP3。 为了使您的电流公式有效、我认为您需要重置 EVT4上的计数器、但不重置 EVT 1和2上的计数器(CTRRST4 = 1、CTRST1 = 0、CTRST2 = 0)。

    惠特尼

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

    我单独尝试了您的两项建议、发现 eCAP3可以在两种实施方案中准确地测量50%的占空比。 然而、当我改变占空比时、eCAP3在中具有非线性行为、它测量信号。 例如、当我将占空比从50%更改为90%时、eCAP3在输入直流为70%时以线性方式测量高达112%、而在输入为71% 时、eCAP3测量3%。 我看到周期计数保持不变、但高周期计数会影响这些占空比计算。 那么、什么会导致 eCAP3计数不准确? 我不认为这是一个溢出问题、因为这也发生在低于50%的直流电上。

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

    还有其他哪些电容值? 在这些情况下、它们是否也不正确?

    惠特尼

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

    是的、71%直流电压后、其他电容值也不正确。 它们只是在71% DC 条件下从3% eCAP3测量值开始重新计数。

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

    您是否想再次共享 ECAP 寄存器的屏幕截图、以便我可以看到您更新的配置和所有 CAP 值?

    惠特尼

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

    eCAP3的初始化

    InitECap3()

    InitECap3Gpio()

    ECap3Regs.ECEINT.ALL = 0x0000;//禁用所有捕捉中断

    ECap3Regs.ECCLR.ALL = 0xFFFF;//清除所有 CAP 中断标志

    ECap3Regs.ECCTL1.bit.CAPLDEN = 0;//禁用 CAP1-CAP4寄存器加载

    ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0;//确保计数器被停止

    //配置外设寄存器

    ECap3Regs.ECCTL2.bit.CONT_ONESHT = 1;//单次触发

    ECap3Regs.ECCTL2.bit.STOP_Wrap = 3;//在4个事件时停止

    ECap3Regs.ECCTL1.bit.CAP1POL = 1;//下降边沿

    ECap3Regs.ECCTL1.bit.CAP2POL = 0;//上升边沿

    ECap3Regs.ECCTL1.bit.CAP3POL = 1;//下降边沿

    ECap3Regs.ECCTL1.bit.CAP4POL = 0;//上升边沿

    ECap3Regs.ECCTL1.bit.CTRRST1 = 1;//差动操作

    ECap3Regs.ECCTL1.bit.CTRRST2 = 1;//差动操作

    ECap3Regs.ECCTL1.bit.CTRST3 = 1;//差动操作

    ECap3Regs.ECCTL1.bit.CTRRST4 = 1;//差动操作

    ECap3Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入

    ECap3Regs.ECCTL2.bit.SYNCO_SEL = 0;//直通

    ECap3Regs.ECCTL1.bit.CAPLDEN = 1;//启用捕捉单元

    ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;//开始计数器

    ECap3Regs.ECCTL2.bit.rearm = 1;// ARM 单次触发

    ECap3Regs.ECCTL1.bit.CAPLDEN = 1;//启用 CAP1-CAP4寄存器加载

    ECap3Regs.ECEINT.BIT.CEVT4 = 1;// 4个事件=中断

    eCAP3调用的 Hwi

    void SensorMeasureHWI()

    无符号整型测量[2]={0、0};

    测量[HIGHPERIOD]=(无符号整型) ECap3Regs.CAP3//计算 PWM 占空比(上升沿到下降沿)

    测量[周期]=(无符号整型) ECap3Regs.CAP3 +(无符号整型) ECap3Regs.CAP2//计算 PWM 周期(上升沿到上升沿)

    Mailbox_post (SensorMeasurement、& Measurement、BIOS_NO_WAIT);

    ECap3Regs.ECCLR.bit.CEVT4 = 1;

    ECap3Regs.ECCLR.bit.INT = 1;

    ECap3Regs.ECCTL2.bit.rearm = 1;

    PieCtrlRegs.PIEACK.all = PIEACK_group4;//确认此中断以接收来自组4的更多中断

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

    上面的屏幕截图显示了大约50%的占空比-是正确还是应该是其他的?

    我确实看到了 Hwi 函数的一个问题--一个无符号整型值为16位、但捕获值为32位--当您写入测量数组时会丢失高字。

    惠特尼

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

    是的、我将定义更改为32位变量、现在它似乎在工作。